推荐算法案例

数据

userId,itemId,score
1 11 2
1 12 3
1 13 1
1 14 0
1 15 1
2 11 1
2 12 2
2 13 2
2 14 1
2 15 4
3 11 2
3 12 3
3 14 0
3 15 1
4 11 1
4 12 2
4 14 1
4 15 4
5 11 1
5 12 2
5 13 2
5 14 1
5 15 4

代码

package cn.tedu.als

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.mllib.recommendation.Rating
import org.apache.spark.mllib.recommendation.ALS

object Driver {

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

val conf=new SparkConf().setMaster("local").setAppName("als")

val sc=new SparkContext(conf)

val data=sc.textFile("c://data/ml/als.txt")

//--为了满足推荐系统建模的需要,RDD[String:line]->RDD[Rating(userId,itemId,score)]
val ratings=data.map { line =>
  val info=line.split(" ")
  val userId=info(0).toInt
  val itemId=info(1).toInt
  val score=info(2).toDouble
  
  Rating(userId,itemId,score)

}

//--建立推荐系统模型,底层通过ALS算法来实现
//--①参:数据集  ②参:隐藏因子数 K 低阶,要小于u和i
//--③参:最大迭代次数  ④参:λ 正则化参数,防止模型过拟合
val model=ALS.train(ratings, 3, 10, 0.01)

//--下面表示为用户3推荐1个商品
val u3Result=model.recommendProducts(3, 1)

//--下面表示为12号商品推荐2名用户
val item12Result=model.recommendUsers(12, 2)

//--预测3号用户对12号商品的打分
val u3Item12Result=model.predict(3, 12)

}
}


数据

logistic.txt
17 1 1 1
44 0 0 1
48 1 0 1
55 0 0 1
75 1 1 1
35 0 1 0
42 1 1 0
57 0 0 0
28 0 1 0
20 0 1 0
38 1 0 0
45 0 1 0
47 1 1 0
52 0 0 0
55 0 1 0
68 1 0 1
18 1 0 1
68 0 0 1
48 1 1 1
17 0 0 1

testlogistic.txt
17 0 0
44 1 1
48 0 1
55 1 0

代码

package cn.tedu.logistic

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.classification.LogisticRegressionWithSGD
import org.apache.spark.mllib.classification.LogisticRegressionWithLBFGS

object Driver {

def main(args: Array[String]): Unit = {
val conf=new SparkConf().setMaster(“local”).setAppName(“logistic”)

val sc=new SparkContext(conf)

val data=sc.textFile("c://data/ml/logistic.txt")

//--为了满足建模需要,RDD[String:line]->RDD[LabeledPoint(Y,Vector(X1,X2...))]
val r1=data.map { line =>
  val info=line.split("\t")
  val Y=info.last.toDouble
  //--获取自变量数组
  val XArr=info.take(3).map { num => num.toDouble }
  
  LabeledPoint(Y,Vectors.dense(XArr))
}

//--建立逻辑回归模型,底层通过随机梯度下降法来求解系数
//val model=LogisticRegressionWithSGD.train(r1,10,0.7)


//--建立逻辑回归模型,底层使用拟牛顿法来求解系数
//--拟牛顿法属于通过数值解(迭代式)逼近真实解,不需要定义步长。属于快速迭代法。
//--但是这种算法在数据量较大时,计算代价会较大。
val model=new LogisticRegressionWithLBFGS().run(r1)


//--获取自变量系数
val coef=model.weights

//--回代数据集,预测。最终得到的结果 0 or 1
val prediction=model.predict(r1.map { labeledpoint => labeledpoint.features })

val testData=sc.textFile("c://data/ml/testlogistic.txt")

//--RDD[String]->RDD[Vector(X1,X2,X3)]
val testRDD=testData.map { line =>
  val XArr=line.split(" ").map { num => num.toDouble } 
  Vectors.dense(XArr)
}

val testPrediction=model.predict(testRDD)

testPrediction.foreach{println}

}
}


数据

1,0 1
2,0 2
3,0 3
5,1 4
7,6 1
9,4 5
6,3 3

代码

package cn.tedu.sgd

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LinearRegressionWithSGD

object Driver {

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

val conf=new SparkConf().setMaster("local").setAppName("sgd")

val sc=new SparkContext(conf)

val data=sc.textFile("c://data/ml/testSGD.txt")

//--为了满足建模需要,RDD[String:line]->RDD[LabeledPoint(Y,Vectors(X1,X2))] 
val r1=data.map { line =>
  val info=line.split(",")
  val Y=info(0).toDouble
  //--获取自变量数组
  val XArr=info(1).split(" ").map { num => num.toDouble }
  
  LabeledPoint(Y,Vectors.dense(XArr))

}

//--建立线性回归模型,底层是通过梯度下降法来解系数
//--①参:数据集  ②参:最大迭代次数  ③参:步长
val model=LinearRegressionWithSGD.train(r1, 10, 0.05)

//--获取自变量系数
//--Y=β1X1+β2X2 -> Y=0.98X1+1.0004X2
val coef=model.weights

//--回代原样本集预测,并返回结果
val prediction=model.predict(r1.map { labelpoint =>labelpoint.features })
prediction.foreach{println}

}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值