斯Parker机器学习

三. 1块过滤算法的落到实处

MLlib并不曾兑现联机过滤算法,能够本人完毕。

程序代码:

/**
  * Created by Administrator on 2017/7/21.
  */

import org.apache.log4j.{ Level, Logger }
import org.apache.spark.{ SparkConf, SparkContext }

object ALSTest02 {

  def main(args:Array[String]) = {

    // 设置运行环境
    val conf = new SparkConf().setAppName("Decision Tree")
      .setMaster("spark://master:7077").setJars(Seq("E:\\Intellij\\Projects\\MachineLearning\\MachineLearning.jar"))
    val sc = new SparkContext(conf)
    Logger.getRootLogger.setLevel(Level.WARN)

    // 读取样本数据并解析
    val dataRDD = sc.textFile("hdfs://master:9000/ml/data/sample_itemcf3.txt")
    val userDataRDD = dataRDD.map(_.split(",")).map(f => (ItemPref(f(0), f(1), f(2).toDouble))).cache()

    // 建立模型
    val simModel = new ItemSimilarity()
    val itemRDD = simModel.Similarity(userDataRDD, "cooccurrence")
    val recomm = new RecommendedItem
    val recommRDD = recomm.Recommend(itemRDD, userDataRDD, 30)

    // 输出结果
    println("物品相似度矩阵:")
    itemRDD.sortBy(f => (f.itemid1, f.itemid2)).collect.foreach { simItem =>
      println(simItem.itemid1 + ", " + simItem.itemid2 + ", " + simItem.similar)
    }
    println("用戶推荐列表:")
    recommRDD.sortBy(f => (f.pref)).collect.foreach { UserRecomm =>
      println(UserRecomm.userid + ", " + UserRecomm.itemid + ", " + UserRecomm.pref)
    }
  }

}

运营结果:

物品相似度矩阵:
1, 2, 0.6666666666666666
1, 3, 0.6666666666666666
1, 5, 0.4082482904638631
1, 6, 0.3333333333333333
2, 1, 0.6666666666666666
2, 3, 0.3333333333333333
2, 4, 0.3333333333333333
2, 6, 0.6666666666666666
3, 1, 0.6666666666666666
3, 2, 0.3333333333333333
3, 4, 0.3333333333333333
3, 5, 0.4082482904638631
4, 2, 0.3333333333333333
4, 3, 0.3333333333333333
4, 5, 0.4082482904638631
4, 6, 0.6666666666666666
5, 1, 0.4082482904638631
5, 3, 0.4082482904638631
5, 4, 0.4082482904638631
5, 6, 0.4082482904638631
6, 1, 0.3333333333333333
6, 2, 0.6666666666666666
6, 4, 0.6666666666666666
6, 5, 0.4082482904638631
用戶推荐列表:
3, 1, 1.3333333333333333
6, 3, 1.8164965809277263
2, 4, 2.7079081189859817
1, 3, 3.0
5, 4, 3.666666666666666
3, 2, 3.6666666666666665
5, 5, 3.6742346141747673
6, 1, 3.8164965809277263
1, 5, 4.08248290463863
4, 5, 4.4907311951024935
3, 5, 4.4907311951024935
4, 3, 5.0
2, 6, 5.041241452319316
1, 4, 5.666666666666666
4, 1, 5.666666666666666
3, 6, 6.0
5, 6, 6.333333333333332
2, 2, 6.666666666666667
6, 2, 7.0

二. 推荐介绍计算

引入总计分为两类:基于用户的同步过滤和依据物品的一块过滤。

2.1 基于用户的同台过滤(User CF)

传闻用户的一起过滤的着力思想是,对于每2个个用户,根据他对富有物品的偏好,计算他与拥有其余用户的相似度(能够选拔同现相似度或欧式距离),获得二个用户相似度矩阵Um×m。用户对物品的宠幸评分矩阵Pm×n,U×P获得一个m×n矩阵,即对各种用户,每种物品的偏好,过滤掉已经存在的用户对商品的偏好,剩下的数量降序排序,即获得了二个推荐介绍列表。

联机过滤(Collaborative
Filtering,CF)算法是一种常用的引进算法,它的思索正是找出壹般的用户或产品,向用户推荐相似的物品,也许把物品推荐给一般的用户。如何评价用户对货物的宠幸?能够有无数办法,如用户对商品的打分、购买、页面停留时间、保存、转载等等。得到了用户对货物的偏好,就足以给用户推荐商品。有二种艺术:用户A喜欢物品一,商品2和物品一很1般,于是把物品2推荐介绍给用户A;也许用户A和用户B很附近,B喜欢商品2,就将商品2推荐给用户A。所以协同过滤分为两类:基于用户的联合署名过滤和基于物品的同台过滤。

1.壹 同现相似度(Cooccurrence Similarity)

同现,即同时出现的意趣,物品i和物品j的同现相似度的计算公式是:

图片 1

N(i)是爱好物品i的用户聚集,N(j)是欣赏物品j的用户聚集,可以驾驭为喜爱物品i的用户中有微微喜欢物品j。可是那样存在八个题材,假诺物品j是热点物品,喜欢它的用户肯定很多,这样不论i是什么物品,wij的值就会十分的大。为了幸免那一个题材的出现,对公式举行了改进:

图片 2

如此那般要是j是走俏物品,分母会非常大,从而惩罚了wij的值。

一.二 欧氏距离(Euclidean Distance)

n维空间中多少个点x和y的距离:

图片 3

当n=2时,是平面上两点时期的相距,当n=三时,是立体空间上两点之间的距离。相似度总结公式:

图片 4

即距离越大,相似度越低;距离越小,相似度越高。当总结四个物品的相似度时,坐标轴是分化的用户,即使具有用户对那三个物品的溺爱都大概,那么那五个物品之间的相距不远处,相似度就低,表明那多少个物品很相像;反之,则证实那两个物品一般度低。

一.二 欧氏距离(Euclidean Distance)

n维空间中五个点x和y的偏离:

图片 5

当n=2时,是平面上两点之间的偏离,当n=三时,是立体空间上两点时期的相距。相似度计算公式:

图片 6

即距离越大,相似度越低;距离越小,相似度越高。当总括多少个物品的相似度时,坐标轴是见仁见智的用户,假使拥有用户对那五个物品的宠幸都大概,那么那五个物品之间的离开不远处,相似度就低,表明那四个物品很一般;反之,则表达那七个物品壹般度低。

二.一 基于用户的三只过滤(User CF)

听大人讲用户的联手过滤的主导记挂是,对于每三个个用户,依据她对富有物品的偏好,总计他与富有其余用户的相似度(能够利用同现相似度或欧式距离),获得三个用户相似度矩阵Um×m。用户对物品的溺爱评分矩阵Pm×n,U×P得到两个m×n矩阵,即对每一种用户,各类物品的偏好,过滤掉已经存在的用户对商品的偏好,剩下的数量降序排序,即取得了多个推荐介绍列表。

壹齐过滤(Collaborative
Filtering,CF)算法是壹种常用的引荐算法,它的合计正是找出一般的用户或制品,向用户推荐相似的物料,也许把物品推荐给壹般的用户。如何评价用户对货物的偏好?能够有不少艺术,如用户对商品的打分、购买、页面停留时间、保存、转载等等。获得了用户对货物的偏好,就能够给用户推荐商品。有三种办法:用户A喜欢物品一,商品2和物品1很一般,于是把物品2推荐给用户A;只怕用户A和用户B很周围,B喜欢商品2,就将商品2推荐给用户A。所以协同过滤分为两类:基于用户的一路过滤和基于物品的五头过滤。

一.1 同现相似度(Cooccurrence Similarity)

同现,即同时现身的情趣,物品i和物品j的同现相似度的总结公式是:

图片 7

N(i)是爱好物品i的用户聚集,N(j)是欣赏物品j的用户聚集,可以通晓为欣赏物品i的用户中有稍许喜欢物品j。但是这样存在1个标题,倘若物品j是抢手物品,喜欢它的用户肯定很多,那样不论i是什么样物品,wij的值就会十分大。为了幸免那个题材的产出,对公式实行了改正:

图片 8

这么一旦j是热点物品,分母会相当的大,从而惩罚了wij的值。

二.2 基于物品的同步过滤(Item CF)

基于物品的同台过滤的骨干牵挂是,对于每三个个物料,依照全体用户对它的偏好,总括它与持有别的物品的相似度(能够行使同现相似度或欧式距离),得到3个物品相似度矩阵In×n。P×I获得3个m×n矩阵,即对各种用户,各类物品的偏好,过滤掉已经存在的用户对货物的偏好,剩下的数目降序排序,即获得了三个引入列表。

3. 联合署名过滤算法的实现

MLlib并未实现协同过滤算法,可以团结实现。

程序代码:

/**
  * Created by Administrator on 2017/7/21.
  */

import org.apache.log4j.{ Level, Logger }
import org.apache.spark.{ SparkConf, SparkContext }

object ALSTest02 {

  def main(args:Array[String]) = {

    // 设置运行环境
    val conf = new SparkConf().setAppName("Decision Tree")
      .setMaster("spark://master:7077").setJars(Seq("E:\\Intellij\\Projects\\MachineLearning\\MachineLearning.jar"))
    val sc = new SparkContext(conf)
    Logger.getRootLogger.setLevel(Level.WARN)

    // 读取样本数据并解析
    val dataRDD = sc.textFile("hdfs://master:9000/ml/data/sample_itemcf3.txt")
    val userDataRDD = dataRDD.map(_.split(",")).map(f => (ItemPref(f(0), f(1), f(2).toDouble))).cache()

    // 建立模型
    val simModel = new ItemSimilarity()
    val itemRDD = simModel.Similarity(userDataRDD, "cooccurrence")
    val recomm = new RecommendedItem
    val recommRDD = recomm.Recommend(itemRDD, userDataRDD, 30)

    // 输出结果
    println("物品相似度矩阵:")
    itemRDD.sortBy(f => (f.itemid1, f.itemid2)).collect.foreach { simItem =>
      println(simItem.itemid1 + ", " + simItem.itemid2 + ", " + simItem.similar)
    }
    println("用戶推荐列表:")
    recommRDD.sortBy(f => (f.pref)).collect.foreach { UserRecomm =>
      println(UserRecomm.userid + ", " + UserRecomm.itemid + ", " + UserRecomm.pref)
    }
  }

}

运行结果:

物品相似度矩阵:
1, 2, 0.6666666666666666
1, 3, 0.6666666666666666
1, 5, 0.4082482904638631
1, 6, 0.3333333333333333
2, 1, 0.6666666666666666
2, 3, 0.3333333333333333
2, 4, 0.3333333333333333
2, 6, 0.6666666666666666
3, 1, 0.6666666666666666
3, 2, 0.3333333333333333
3, 4, 0.3333333333333333
3, 5, 0.4082482904638631
4, 2, 0.3333333333333333
4, 3, 0.3333333333333333
4, 5, 0.4082482904638631
4, 6, 0.6666666666666666
5, 1, 0.4082482904638631
5, 3, 0.4082482904638631
5, 4, 0.4082482904638631
5, 6, 0.4082482904638631
6, 1, 0.3333333333333333
6, 2, 0.6666666666666666
6, 4, 0.6666666666666666
6, 5, 0.4082482904638631
用戶推荐列表:
3, 1, 1.3333333333333333
6, 3, 1.8164965809277263
2, 4, 2.7079081189859817
1, 3, 3.0
5, 4, 3.666666666666666
3, 2, 3.6666666666666665
5, 5, 3.6742346141747673
6, 1, 3.8164965809277263
1, 5, 4.08248290463863
4, 5, 4.4907311951024935
3, 5, 4.4907311951024935
4, 3, 5.0
2, 6, 5.041241452319316
1, 4, 5.666666666666666
4, 1, 5.666666666666666
3, 6, 6.0
5, 6, 6.333333333333332
2, 2, 6.666666666666667
6, 2, 7.0

二. 推荐介绍计算

引入计算分为两类:基于用户的联手过滤和基于物品的联手过滤。

2.二 基于物品的共同过滤(Item CF)

依照物品的壹块儿过滤的核心情维是,对于每三个个物品,依照全体用户对它的偏好,计算它与有着其余物品的相似度(能够运用同现相似度或欧式距离),得到一个物料相似度矩阵In×n。P×I获得八个m×n矩阵,即对种种用户,每一个物品的偏好,过滤掉已经存在的用户对商品的偏好,剩下的多寡降序排序,即取得了多个推荐介绍列表。

一. 相似度的盘算

壹块过滤算法一个重大的题材正是相似度的测算,相似度即衡量多个用户,或然三个物品之间相似的水准。计算相似度有几种艺术:同现相似度(Cooccurrence Similarity)、欧氏距离(Euclidean
Distance)、Pearson相关周全(Pearson Correlarion
Coefficient)、Cosine相似度(Cosine
Similarity)、Tanimoto周全(Tanimoto Coefficient)等。

一. 相似度的测算

二只过滤算法一个第二的题材正是相似度的乘除,相似度即衡量八个用户,可能五个物品之间相似的档次。总结相似度有三种艺术:同现相似度(Cooccurrence Similarity)、欧氏距离(Euclidean
Distance)、皮尔逊相关周详(皮尔逊 Correlarion
Coefficient)、Cosine相似度(Cosine
Similarity)、Tanimoto全面(Tanimoto Coefficient)等。