日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于Spark的Als算法+自迭代+Spark2.0新写法

發(fā)布時間:2024/1/17 编程问答 67 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于Spark的Als算法+自迭代+Spark2.0新写法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

主要介紹了一下幾點(diǎn):?
1矩陣分解的幾種算法?
2spark使用矩陣分解的幾種方式,1ml 包中使用,2mllib包中的使用,其實(shí)有不調(diào)用包自己寫的案列(可以去看看哈,就在example目錄)?
3使用ALS做推薦的一個比較詳細(xì)的流程:1自迭代確定比較優(yōu)的參數(shù)是,2使用參數(shù)訓(xùn)練模型,3使用模型推薦topn的物品給用戶?
4講了怎么自迭代ALS算法參數(shù),感覺這個還重要點(diǎn)?
5提交spark的報了一個錯誤,已經(jīng)錯誤解決方式?
6好多細(xì)節(jié)都沒寫,感覺要寫的有好多,也不是很完善,時間不夠,只是提供了核心代碼和思路

一:Spark2.0新概率解釋(僅限本文使用)

1 SparkSession

SparkSession是spark2.0的全新切入點(diǎn),以前都是sparkcontext創(chuàng)建RDD的,StreamingContext,sqlContext,HiveContext。?
DataDrame提供的API慢慢的成為新的標(biāo)準(zhǔn)API,我們需要1個新的切入點(diǎn)來構(gòu)建他,這個就是SparkSession哈,以前我也沒見過.官網(wǎng)API介紹?
?
官網(wǎng)上說,這是用來構(gòu)建Dataset和DataFrame的API的切入點(diǎn)。在環(huán)境中,SparkSession已經(jīng)預(yù)先創(chuàng)建了,我們需要使用bulder方法得到已經(jīng)存在在SparkSession。使用方法如下:

SparkSession.builder().getOrCreate() SparkSession.builder().master("local").appName("Word Count").config(key, value")..getOrCreate()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

二:ALS算法

1含義

在現(xiàn)實(shí)中用戶-物品-評分矩陣是及其大的,用戶消費(fèi)有限,對單個用戶來說,消費(fèi)的物品的非常有限的,產(chǎn)生的評分也是比較少的,這樣就造成了用戶-物品矩陣有大量的空值。?
假定用戶的興趣只受少數(shù)因素的影響,所以用戶-物品矩陣可以分解為用戶的特征向量矩陣和物品的特征向量矩陣(降維了)。用戶的特征向量距離表示用戶的興趣(U),物品的特征向量矩陣代表用戶的特點(diǎn)(V),合起來(內(nèi)積)表示用戶對物品的特點(diǎn)的興趣,也就是喜好程度。?
M=U*V

2協(xié)同過濾矩陣分解算法

2.1奇異值分解(SVD)

矩陣的奇異值分解是最簡單的一種矩陣分解算法,主要是在U*V中間加了個一個奇異值矩陣,公式如下:?
M=U*(奇異值矩陣)*(V的共軛)?
奇異值矩陣是對角矩陣,奇異值分解的缺點(diǎn)(沒試過不知道,書上說的),1不允許分解矩陣有null值,需要進(jìn)行填分,2如果填分,又有兩個問題:1增加數(shù)據(jù)量,增加算法復(fù)雜度,2簡單粗暴的填分方式會導(dǎo)致數(shù)據(jù)失真,如果將null值設(shè)置為0,那么會導(dǎo)致過度學(xué)習(xí)問題。?
奇異值分解方式,感覺用的不多,我自己接觸的話。

2.2正則化矩陣分解

加入正則化是為了解決稀疏矩陣可能過學(xué)習(xí)問題,評價矩陣分解是RMSE,通過最小化RMSE來學(xué)習(xí)用戶特征矩陣U和物品特征矩陣V,在RMSE函數(shù)中加入了正則化項(xiàng)減少過擬合,公式如下,公式都是書上寫的哈,這里截圖:?

K表示評分記錄(u用戶對I物品的評分),Ru,i表示用戶u對物品i的真實(shí)評分,誒夢達(dá)表示正則化系數(shù),誒夢達(dá)后面的表示防止過擬合的正則化項(xiàng)。?
加入正則化的含義可以理解為,修改rmse,不要其太大或者太小。?
假設(shè)用戶特征矩陣為Umt,物品評分矩陣為Vtn,其中t特征<

2.3帶偏置的矩陣分解(說的很有道理,但是比較難評估)

理論就不說了,舉個例子,u1對v1的評分為4表示u1對v1這個物品非常喜歡,u2對v1的評分為4表示u1對v1一般喜歡,對用用戶來說,即使他們對同一物品的評分相同,但是表示他們的喜好程度并不是一樣的。同理對于物品來說也是一樣。把這種獨(dú)立于用戶和獨(dú)立于物品的影響因素成為偏置,偏置一共有3個部分組成。?
1訓(xùn)練集中所有評分記錄的全局平均,表示訓(xùn)練集中總體評分情況,一般是一個常數(shù)。?
2用戶偏置bu,獨(dú)立于物品特征因素,表示用戶特定的打分習(xí)慣。?
3物品偏置bi,表示獨(dú)立于用戶特征因素,舉個列子,好片子一般總體評分偏高,爛片一般評分偏低,偏置就是表示這種特征。?
以上的所有偏置對用戶對物品喜好無關(guān),得到的預(yù)測評分公式如下:?

按照這種思路,其實(shí)還要很多其他優(yōu)化,比如加入時間因素,社會流行因素等。

Spark使用的是帶正則化矩陣分解,優(yōu)化函數(shù)的方式選用的是交叉最小二乘法ALS

三Spark代碼

spark代碼一半是官方列子修改過來的哈

1調(diào)用ml包

使用org.apache.spark.ml.recommendation.ALS來計算,并且使用了spark2.0的新特性SparkSession來實(shí)現(xiàn)推薦,具體代碼與注釋如下:

package org.wq.scala.ml import org.apache.spark.ml.evaluation.RegressionEvaluator import org.apache.spark.ml.recommendation.ALS import org.apache.spark.sql.SparkSession/*** Created by Administrator on 2016/10/24.*/ //這是spark新的Als算法的列子 object ALSRecommendNewTest {//定義個類,來保存一次評分哈case class Rating(userId: Int, movieId: Int, rating: Float, timestamp: Long)//把一行轉(zhuǎn)換成一個評分類def parseRating(str: String): Rating = {val fields = str.split("::")assert(fields.size == 4)Rating(fields(0).toInt, fields(1).toInt, fields(2).toFloat, fields(3).toLong)}def main(args:Array[String])={//SparkSession是spark2.0的全新切入點(diǎn),以前都是sparkcontext創(chuàng)建RDD的,StreamingContext,sqlContext,HiveContext。//DataDrame提供的API慢慢的成為新的標(biāo)準(zhǔn)API,我們需要1個新的切入點(diǎn)來構(gòu)建他,這個就是SparkSession哈//以前我也沒見過val spark = SparkSession.builder().config("spark.sql.warehouse.dir","E:/ideaWorkspace/ScalaSparkMl/spark-warehouse").master("local").appName("ALSExample").getOrCreate()import spark.implicits._//read方法返回的是一個DataFrameReader類,可以轉(zhuǎn)換為DataFrame//DataFrameReader類的textFile方法:加載文本數(shù)據(jù),返回為Dataset//使用一個函數(shù)parseRating處理一行數(shù)據(jù)val ratings = spark.read.textFile("data/mllib/sample_movielens_ratings.txt").map(parseRating).toDF()val Array(training,test)=ratings.randomSplit(Array(0.8, 0.2))// Build the recommendation model using ALS on the training data//使用訓(xùn)練數(shù)據(jù)訓(xùn)練模型//這里的ALS是import org.apache.spark.ml.recommendation.ALS,不是mllib中的哈//setMaxiter設(shè)置最大迭代次數(shù)//setRegParam設(shè)置正則化參數(shù),日lambda這個不是更明顯么//setUserCol設(shè)置用戶id列名//setItemCol設(shè)置物品列名//setRatingCol設(shè)置打分列名val als = new ALS()als.setRank(10).setMaxIter(5).setRegParam(0.01).setUserCol("userId").setItemCol("movieId").setRatingCol("rating")//fit給輸出的數(shù)據(jù),訓(xùn)練模型,fit返回的是ALSModel類val model = als.fit(training)//使用測試數(shù)據(jù)計算模型的誤差平方和//transform方法把數(shù)據(jù)dataset換成dataframe類型,預(yù)測數(shù)據(jù)val predictions = model.transform(test)//RegressionEvaluator這個類是用戶評估預(yù)測效果的,預(yù)測值與原始值//這個setLabelCol要和als設(shè)置的setRatingCol一致,不然會報錯哈//RegressionEvaluator的setPredictionCol必須是prediction因?yàn)?#xff0c;ALSModel的默認(rèn)predictionCol也是prediction//如果要修改的話必須把ALSModel和RegressionEvaluator一起修改//model.setPredictionCol("prediction")和evaluator.setPredictionCol("prediction")//setMetricName這個方法,評估方法的名字,一共有哪些呢?//rmse-平均誤差平方和開根號//mse-平均誤差平方和//mae-平均距離(絕對)//r2-沒用過不知道//這里建議就是用rmse就好了,其他的基本都沒用,當(dāng)然還是要看應(yīng)用場景,這里是預(yù)測分值就是用rmse。如果是預(yù)測距離什么的mae就不從,看場景哈val evaluator = new RegressionEvaluator().setMetricName("rmse").setLabelCol("rating").setPredictionCol("prediction")val rmse = evaluator.evaluate(predictions)println("Root-mean-square error = "+rmse)//stop是停止底層的SparkContextspark.stop()} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81

2調(diào)用mllib,實(shí)現(xiàn)

使用mllib中的ALS算法如下,如果是生產(chǎn),建議使用mllib中的

package org.wq.scala.mlimport org.apache.log4j.{Level, Logger} import org.apache.spark.examples.mllib.AbstractParamsimport scala.collection.mutable //處理輸入?yún)?shù)的庫 import org.apache.spark.mllib.recommendation.{ALS, MatrixFactorizationModel, Rating} import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} import scopt.OptionParser/*** Created by Administrator on 2016/10/24.*/ object ALSRecommendMllibTest {//參數(shù)含義//input表示數(shù)據(jù)路徑//kryo表示是否使用kryo序列化//numIterations迭代次數(shù)//lambda正則化參數(shù)//numUserBlocks用戶的分塊數(shù)//numProductBlocks物品的分塊數(shù)//implicitPrefs這個參數(shù)沒用過,但是通過后面的可以推斷出來了,是否開啟隱藏的分值參數(shù)閾值,預(yù)測在那個級別才建議推薦,這里是5分制度的,詳細(xì)看后面代碼case class Params(input: String = null,output:String=null,kryo: Boolean = false,numIterations: Int = 20,lambda: Double = 1.0,rank: Int = 10,numUserBlocks: Int = -1,numProductBlocks: Int = -1,implicitPrefs: Boolean = false) extends AbstractParams[Params]def main(args: Array[String]) {val defaultParams = Params()//規(guī)定參數(shù)的輸入方式 --rank 10 這種//我個人習(xí)慣為直接用空格分割(如果參數(shù)不對,給予提示),當(dāng)然下面這種更規(guī)范化和人性化,還有默認(rèn)參數(shù)的//以后再研究OptionParser用法,不過他這種參數(shù)用法挺好用的哈val parser = new OptionParser[Params]("Mllib 的ALS") {head("MovieLensALS: an example app for ALS on MovieLens data.")opt[Int]("rank").text(s"rank, default: ${defaultParams.rank}").action((x, c) => c.copy(rank = x))opt[Int]("numIterations").text(s"number of iterations, default: ${defaultParams.numIterations}").action((x, c) => c.copy(numIterations = x))opt[Double]("lambda").text(s"lambda (smoothing constant), default: ${defaultParams.lambda}").action((x, c) => c.copy(lambda = x))opt[Unit]("kryo").text("use Kryo serialization").action((_, c) => c.copy(kryo = true))opt[Int]("numUserBlocks").text(s"number of user blocks, default: ${defaultParams.numUserBlocks} (auto)").action((x, c) => c.copy(numUserBlocks = x))opt[Int]("numProductBlocks").text(s"number of product blocks, default: ${defaultParams.numProductBlocks} (auto)").action((x, c) => c.copy(numProductBlocks = x))opt[Unit]("implicitPrefs").text("use implicit preference").action((_, c) => c.copy(implicitPrefs = true))arg[String]("<input>").required().text("input paths to a MovieLens dataset of ratings").action((x, c) => c.copy(input = x))arg[String]("<output>").required().text("output Model Path").action((x, c) => c.copy(output = x))note("""|For example, the following command runs this app on a synthetic dataset:|| bin/spark-submit --class org.apache.spark.examples.mllib.MovieLensALS \| examples/target/scala-*/spark-examples-*.jar \| --rank 5 --numIterations 20 --lambda 1.0 --kryo \| data/mllib/sample_movielens_data.txt""".stripMargin)}//雖然是map但是只運(yùn)行1次哈,主要看run方法做了什么parser.parse(args, defaultParams).map { params =>run(params)} getOrElse {System.exit(1)}}def run(params: Params) {val conf = new SparkConf().setAppName(s"MovieLensALS with $params").setMaster("local").set("spark.sql.warehouse.dir","E:/ideaWorkspace/ScalaSparkMl/spark-warehouse")//如果參數(shù)設(shè)置了kryo序列化沒那么需要注冊序列化的類和配置序列化的緩存,模板照著寫就是了//使用序列化是為傳輸?shù)臅r候速度更快,我沒有使用這個,因?yàn)榉葱蛄性捯残枰欢ǖ臅r間,我是局域網(wǎng)搭建spark集群的(機(jī)子之間很快)。// 如果是在云搭建集群可以考慮使用if (params.kryo) {conf.registerKryoClasses(Array(classOf[mutable.BitSet], classOf[Rating])).set("spark.kryoserializer.buffer", "8m")}val sc = new SparkContext(conf)//設(shè)置log基本,生產(chǎn)也建議使用WARNLogger.getRootLogger.setLevel(Level.WARN)//得到因此的級別val implicitPrefs = params.implicitPrefs//讀取數(shù)據(jù),并通過是否設(shè)置了分值閾值來修正評分//官方推薦是,只有哦大于3級別的時候才值得推薦//且下面的代碼,implicitPrefs,直接就是默認(rèn)5 Must see,按道理會根據(jù)自己對分?jǐn)?shù)閾值的預(yù)估,rating減去相應(yīng)的值,比如fields(2).toDouble - 2.5//5 -> 2.5, 4 -> 1.5, 3 -> 0.5, 2 -> -0.5, 1 -> -1.5//現(xiàn)在是5分值的映射關(guān)系,如果是其他分值的映射關(guān)系有該怎么做?還不確定,個人建議別使用這個了。//經(jīng)過下面代碼推斷出,如果implicitPrefs=true或者flase,true的意思是,預(yù)測的分?jǐn)?shù)要大于2.5(自己設(shè)置),才能推薦給用戶,小了,沒有意義//它引入implicitPrefs的整體含義為,只有用戶對物品的滿意達(dá)到一定的值,才推薦,不然推薦不喜歡的沒有意思,所以在構(gòu)建樣本的時候,會減去相應(yīng)的值fields(2).toDouble - 2.5(自己設(shè)置)//這種理論是可以的,但是還有一個理論,不給用戶推薦比給用戶推薦錯了還要嚴(yán)重(有人提出過),不推薦產(chǎn)生的效果還要嚴(yán)重,還有反向推薦,//我把implicitPrefs叫做分值閾值val ratings = sc.textFile(params.input).map { line =>val fields = line.split("::")if (implicitPrefs) {/** MovieLens ratings are on a scale of 1-5:* 5: Must see* 4: Will enjoy* 3: It's okay* 2: Fairly bad* 1: Awful* So we should not recommend a movie if the predicted rating is less than 3.* To map ratings to confidence scores, we use* 5 -> 2.5, 4 -> 1.5, 3 -> 0.5, 2 -> -0.5, 1 -> -1.5. This mappings means unobserved* entries are generally between It's okay and Fairly bad.* The semantics of 0 in this expanded world of non-positive weights* are "the same as never having interacted at all".*/Rating(fields(0).toInt, fields(1).toInt, fields(2).toDouble - 2.5)} else {Rating(fields(0).toInt, fields(1).toInt, fields(2).toDouble)}}.cache()//計算一共有多少樣本數(shù)val numRatings = ratings.count()//計算一共有多少用戶val numUsers = ratings.map(_.user).distinct().count()//計算應(yīng)該有多少物品val numMovies = ratings.map(_.product).distinct().count()println(s"Got $numRatings ratings from $numUsers users on $numMovies movies.")//按80%訓(xùn)練,20%驗(yàn)證分割樣本val splits = ratings.randomSplit(Array(0.8, 0.2))//把訓(xùn)練樣本緩存起來,加快運(yùn)算速度val training = splits(0).cache()//構(gòu)建測試樣,我先翻譯下他說的英文哈。//分值為0表示,我對物品的評分不知道,一個積極有意義的評分表示:有信心預(yù)測值為1//一個消極的評分表示:有信心預(yù)測值為0//在這個案列中,我們使用的加權(quán)的RMSE,這個權(quán)重為自信的絕對值(命中就為1,否則為0)//關(guān)于誤差,在預(yù)測和1,0之間是不一樣的,取決于r 是正,還是負(fù)//這里splits已經(jīng)減了分值閾值了,所以>0 =1 else 0的含義是,1表示分值是大于分值閾值的,這里是大于2.5,0表示小于2.5val test = if (params.implicitPrefs) {/** 0 means "don't know" and positive values mean "confident that the prediction should be 1".* Negative values means "confident that the prediction should be 0".* We have in this case used some kind of weighted RMSE. The weight is the absolute value of* the confidence. The error is the difference between prediction and either 1 or 0,* depending on whether r is positive or negative.*/splits(1).map(x => Rating(x.user, x.product, if (x.rating > 0) 1.0 else 0.0))} else {splits(1)}.cache()//訓(xùn)練樣本量和測試樣本量val numTraining = training.count()val numTest = test.count()println(s"Training: $numTraining, test: $numTest.")//這里應(yīng)為不適用ratings了,釋放掉它占的內(nèi)存ratings.unpersist(blocking = false)//setRank設(shè)置隨機(jī)因子,就是隱藏的屬性//setIterations設(shè)置最大迭代次數(shù)//setLambda設(shè)置正則化參數(shù)//setImplicitPrefs 是否開啟分值閾值//setUserBlocks設(shè)置用戶的塊數(shù)量,并行化計算,當(dāng)特別大的時候需要設(shè)置//setProductBlocks設(shè)置物品的塊數(shù)量val model = new ALS().setRank(params.rank).setIterations(params.numIterations).setLambda(params.lambda).setImplicitPrefs(params.implicitPrefs).setUserBlocks(params.numUserBlocks).setProductBlocks(params.numProductBlocks).run(training)//訓(xùn)練的樣本和測試的樣本的分值全部是減了2.5分的//測試樣本的分值如果大于0為1,else 0,表示分值大于2.5才預(yù)測為Ok//計算rmseval rmse = computeRmse(model, test, params.implicitPrefs)println(s"Test RMSE = $rmse.")//保存模型,模型保存路勁為model.save(sc,params.output)println("模型保存成功,保存路勁為:"+params.output)sc.stop()}/** Compute RMSE (Root Mean Squared Error). */def computeRmse(model: MatrixFactorizationModel, data: RDD[Rating], implicitPrefs: Boolean): Double = {//內(nèi)部方法含義如下// 如果已經(jīng)開啟了implicitPref那么,預(yù)測的分值大于0的為1,小于0的為0,沒有開啟的話,就是用原始分值//min(r,1.0)求預(yù)測分值和1.0那個小,求小值,然后max(x,0.0)求大值, 意思就是把預(yù)測分值大于0的為1,小于0 的為0//這樣構(gòu)建之后預(yù)測的預(yù)測值和測試樣本的樣本分值才一直,才能進(jìn)行加權(quán)rmse計算def mapPredictedRating(r: Double): Double = {if (implicitPrefs) math.max(math.min(r, 1.0), 0.0) else r}//根據(jù)模型預(yù)測,用戶對物品的分值,predict的參數(shù)為RDD[(Int, Int)]val predictions: RDD[Rating] = model.predict(data.map(x => (x.user, x.product)))//mapPredictedRating把預(yù)測的分值映射為1或者0//join連接原始的分?jǐn)?shù),連接的key為x.user, x.product//values方法表示只保留預(yù)測值,真實(shí)值val predictionsAndRatings = predictions.map{ x =>((x.user, x.product), mapPredictedRating(x.rating))}.join(data.map(x => ((x.user, x.product), x.rating))).values//最后計算預(yù)測與真實(shí)值的平均誤差平方和//這是先每個的平方求出來,然后再求平均值,最后開方math.sqrt(predictionsAndRatings.map(x => (x._1 - x._2) * (x._1 - x._2)).mean())} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243

3找到最優(yōu)(可能最優(yōu)哈)參數(shù)

package org.wq.scala.mlimport org.apache.log4j.{Level, Logger} import org.apache.spark.mllib.recommendation.{ALS, MatrixFactorizationModel, Rating} import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext}/*** Created by Administrator on 2016/10/24.*/ object ALSRecommendMllibBestParamTest {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName("ALS_mllib_best_param").setMaster("local").set("spark.sql.warehouse.dir","E:/ideaWorkspace/ScalaSparkMl/spark-warehouse")val sc = new SparkContext(conf)//設(shè)置log基本,生產(chǎn)也建議使用WARNLogger.getRootLogger.setLevel(Level.WARN)//第一步構(gòu)建time,Ratingval movie = sc.textFile("data/mllib/sample_movielens_ratings.txt")val ratings = movie.map(line=>{val fields = line.split("::")val rating = Rating(fields(0).toInt,fields(1).toInt,fields(2).toDouble)val timestamp =fields(3).toLong%5(timestamp,rating)})//輸出數(shù)據(jù)的基本信息val numRatings = ratings.count()val numUser = ratings.map(_._2.user).distinct().count()val numItems = ratings.map(_._2.product).distinct().count()println("樣本基本信息為:")println("樣本數(shù):"+numRatings)println("用戶數(shù):"+numUser)println("物品數(shù):"+numItems)val sp = ratings.randomSplit(Array(0.6,0.2,0.2))//第二步驟//使用日期把數(shù)據(jù)分為訓(xùn)練集(timestamp<6),驗(yàn)證集(6<timestamp<8)和測試集(timestamp>8)/* val training = ratings.filter(x=>x._1<6).values.repartition(2).cache()val validation = ratings.filter(x=>x._1>6 && x._1<8).values.repartition(2).cache()val test=ratings.filter(x=>x._1>=8).values.cache()*///樣本時間參數(shù)都一樣,測試就使用隨機(jī)算了val training=sp(0).map(x=>Rating(x._2.user,x._2.product,x._2.rating)).repartition(2).cache()val validation=sp(1).map(x=>Rating(x._2.user,x._2.product,x._2.rating)).repartition(2).cache()val test=sp(1).map(x=>Rating(x._2.user,x._2.product,x._2.rating))val numTraining = training.count()val numValidation=validation.count()val numTest=test.count()println("驗(yàn)證樣本基本信息為:")println("訓(xùn)練樣本數(shù):"+numTraining)println("驗(yàn)證樣本數(shù):"+numValidation)println("測試樣本數(shù):"+numTest)//第三步//定義RMSE方法def computeRmse(model:MatrixFactorizationModel,data:RDD[Rating]):Double={val predictions:RDD[Rating]=model.predict(data.map(x=>(x.user,x.product)))val predictionAndRatings = predictions.map(x=>{((x.user,x.product),x.rating)}).join(data.map(x=>((x.user,x.product),x.rating))).valuesmath.sqrt(predictionAndRatings.map(x=>(x._1-x._2)*(x._1-x._2)).mean())}//第四步驟,使用不同的參數(shù)訓(xùn)練模型,并且選擇RMSE最小的模型,規(guī)定參數(shù)的范圍//隱藏因子數(shù):8或者12//正則化系數(shù),0.01或者0.1選擇,迭代次數(shù)為10或者20,訓(xùn)練8個模型val ranks = List(8,12)val lambdas = List(0.01,0.1)val numiters = List(10,20)var bestModel:Option[MatrixFactorizationModel]=Nonevar bestValidationRmse=Double.MaxValuevar bestRank=0var bestLamdba = -1.0var bestNumIter=1for(rank<-ranks;lambda<-lambdas;numiter<-numiters){println(rank+"-->"+lambda+"-->"+numiter)val model = ALS.train(training,rank,numiter,lambda)val valadationRmse=computeRmse(model,validation)if(valadationRmse<bestValidationRmse){bestModel=Some(model)bestValidationRmse=valadationRmsebestRank=rankbestLamdba=lambdabestNumIter=numiter}}val testRmse = computeRmse(bestModel.get,test)println("測試數(shù)據(jù)的rmse為:"+testRmse)println("范圍內(nèi)的最后模型參數(shù)為:")println("隱藏因子數(shù):"+bestRank)println("正則化參數(shù):"+bestLamdba)println("迭代次數(shù):"+bestNumIter) //步驟5可以對比使用協(xié)同過濾和不適用協(xié)同過濾(使用平均分來做預(yù)測結(jié)果)能提升多大的預(yù)測效果。//計算訓(xùn)練樣本和驗(yàn)證樣本的平均分?jǐn)?shù) val meanR = training.union(validation).map(x=>x.rating).mean()//這就是使用平均分做預(yù)測,test樣本的rmse val baseRmse=math.sqrt(test.map(x=>(meanR-x.rating)*(meanR-x.rating)).mean())val improvement =(baseRmse-testRmse)/baseRmse*100println("使用了ALS協(xié)同過濾算法比使用評價分作為預(yù)測的提升度為:"+improvement)} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113

4使用ALS模型進(jìn)行預(yù)測

package org.wq.scala.mlimport org.apache.log4j.{Level, Logger} import org.apache.spark.mllib.recommendation.{MatrixFactorizationModel, Rating} import org.apache.spark.{SparkConf, SparkContext}/*** Created by Administrator on 2016/10/25.*/ object ALSModelTopn {def main(args: Array[String]): Unit = {//給用戶推薦val conf = new SparkConf().setAppName("ALS_mllib_best_param").setMaster("local").set("spark.sql.warehouse.dir","E:/ideaWorkspace/ScalaSparkMl/spark-warehouse")val sc = new SparkContext(conf)Logger.getRootLogger.setLevel(Level.WARN)val movie = sc.textFile("data/mllib/sample_movielens_ratings.txt")val ratings = movie.map(line=>{val fields = line.split("::")val rating = Rating(fields(0).toInt,fields(1).toInt,fields(2).toDouble)val timestamp =fields(3).toLong%5(rating)})val model= MatrixFactorizationModel.load(sc,"data/mllib/t")//選擇一個用戶val user=5val myRating = ratings.filter(x=>x.user==5)//該用戶已經(jīng)消費(fèi)了的物品val myRateItem = myRating.map(x=>x.product).collect().toSet//給用戶5推薦前評分前10的物品val recommendations = model.recommendProducts(user,10)recommendations.map(x=>{println(x.user+"-->"+x.product+"-->"+x.rating)})} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

提交部署

1提交尋找最優(yōu)參數(shù)的jar

提交部署求最優(yōu)參數(shù)的那個jar,這就把最優(yōu)參數(shù)簡單的打印出來,如果要周期的自迭代更新參數(shù)的話,就寫在數(shù)據(jù)庫或者配置文件中,當(dāng)訓(xùn)練的時候,就從數(shù)據(jù)庫或者配置文件讀。?
首先需要把上面的第三個程序修改一下,修改如下,因?yàn)橐峤唤o集群嘛,所以不能指定master為local了,參數(shù)從命令行傳入。把jar上傳到master節(jié)點(diǎn)的目錄下,data需要上傳到所有的slaves.?
if(args.length!=1){?
println(“請輸入1個參數(shù) 購物籃數(shù)據(jù)路徑”)?
System.exit(0)?
}?
val conf = new SparkConf().setAppName(“ALS_mllib_best_param”)?
以后所有的提交都需要修改conf的,以后就不說了?
jar與數(shù)據(jù)目錄如下:?
?

數(shù)據(jù)長下面這個樣子,用戶id,物品id,評分,時間戳,用戶id和物品id必須是整型,如果你的不是,那么必須進(jìn)行一次映射:?

把數(shù)據(jù)傳到slave節(jié)點(diǎn) scp sample_movielens_ratings.txt spark@slave1:/home/jar/data/ scp sample_movielens_ratings.txt spark@slave2:/home/jar/data/
  • 1
  • 2
  • 3

提交job?
spark-submit –class org.wq.scala.ml.ALSRecommendMllibBestParam –master spark://master:7077 –executor-memory 700m –num-executors 1 /home/jar/ALSRecommendMllibBestParam.jar /home/jar/data/sample_movielens_ratings.txt?
運(yùn)行結(jié)果如下:?

也給大家看下job運(yùn)行的過程?
http://192.168.247.132:4040/jobs/?

2把求得的最好參數(shù)帶入mllib寫的算法中,訓(xùn)練形成模型

提交Job?
spark-submit –class org.wq.scala.ml.ALSRecommendMllib –master spark://master:7077 –executor-memory 700m –num-executors 1 /home/jar/ALSRecommendMllib.jar –rank 8 –numIterations 10 –lambda 0.1 /home/jar/data/sample_movielens_ratings.txt /home/jar/model/AlsModel?
悲劇的報錯了?

這個錯誤很明顯是缺少包spark-examples_2.11-2.0.0.jar,這個包在example目錄下的。?
兩個種解決方法:?
1修改/etc/profile,把example/jars加入classpath.?
2把jar復(fù)制到目錄sparkhome/jars目錄下,因?yàn)閟parkhome/jars目錄下,因?yàn)閟park_home/jars這個目錄在環(huán)境變量中,這里采用第二種.

修改之后的運(yùn)行結(jié)果為:?

3調(diào)用模型,得出推薦

到這里模型就訓(xùn)練好了,這個模型可以定時訓(xùn)練,crontab就可以實(shí)現(xiàn),訓(xùn)練好的模型,使用用戶數(shù)據(jù)預(yù)測分?jǐn)?shù)。?
就不提交到集群運(yùn)行了,因?yàn)檫@是demo而已,真實(shí)應(yīng)該為提供接口,別人來調(diào)用?
總結(jié):?
1矩陣分解的幾種算法?
2spark使用矩陣分解的幾種方式,1ml 包中使用,2mllib包中的使用,其實(shí)有不調(diào)用包自己寫的案列(可以去看看哈,就在example目錄)?
3使用ALS做推薦的一個比較詳細(xì)的流程:1自迭代確定比較優(yōu)的參數(shù)是,2使用參數(shù)訓(xùn)練模型,3使用模型推薦topn的物品給用戶?
4講了怎么自迭代ALS算法參數(shù),感覺這個還重要點(diǎn)?
5提交spark的報了一個錯誤,已經(jīng)錯誤解決方式?
6好多細(xì)節(jié)都沒寫,感覺要寫的有好多,也不是很完善,時間不夠,只是提供了核心代碼和思路

疑問:在做的過程中,我發(fā)現(xiàn)spark的job查看,只有在job運(yùn)行的時候才可以查看,其他時候不行?
http://192.168.247.132:4040/jobs/?
這個應(yīng)該是可以隨時查看的,應(yīng)該是spark的日志和查看jobs的服務(wù)要一直開啟才行,希望對spark集群熟悉的人求解,跪謝

總結(jié)

以上是生活随笔為你收集整理的基于Spark的Als算法+自迭代+Spark2.0新写法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

天天干 天天摸 天天操 | 二区在线播放 | 国产精品96久久久久久吹潮 | 97超碰香蕉 | 欧美日韩电影在线播放 | 成人黄色在线 | 日日夜夜狠狠操 | 久久久久久久久久久网站 | 免费视频网| 天堂在线视频免费观看 | 亚洲日本va中文字幕 | 国产精品高潮呻吟久久久久 | 欧美日韩在线电影 | 日韩精品中文字幕在线不卡尤物 | 日本精品一区二区三区在线观看 | 在线观看国产区 | 欧美一级片播放 | 国产成人精品日本亚洲999 | 99精品国产亚洲 | 精品国产一二三四区 | 国产精品国产亚洲精品看不卡 | 麻豆91精品91久久久 | av黄免费看| 日本黄色大片儿 | 最近乱久中文字幕 | 精品国精品自拍自在线 | 国产伦理久久 | 91在线porny国产在线看 | 91视频链接 | 在线视频欧美日韩 | 欧美男同网站 | 99久久免费看| 精品在线免费视频 | 久久av免费| 国产精品欧美久久久久三级 | 一区二区在线电影 | 娇妻呻吟一区二区三区 | 99自拍视频在线观看 | 免费看污污视频的网站 | 免费看国产一级片 | 99精品国产视频 | 亚洲第一区在线观看 | 日韩精品一区二区三区中文字幕 | 国产三级国产精品国产专区50 | 国产一区福利 | 国产成人av在线影院 | 97超视频在线观看 | av网址aaa| 日韩精品久久一区二区 | 国产精品久久久久一区二区国产 | 国产日韩欧美视频 | 国产精品久久影院 | 成人久久18免费网站图片 | 1024在线看片 | a色视频 | 999视频网站 | 中文字幕亚洲欧美 | 99久久婷婷国产一区二区三区 | 久久激情婷婷 | 天天干夜夜夜操天 | 亚洲一区网 | 成人啪啪18免费游戏链接 | 97久久久免费福利网址 | 综合色婷婷| 国产精品久久视频 | 美女网站黄免费 | 久久国产精品久久国产精品 | 中文字幕在线看人 | 久久久久免费精品 | 在线观看岛国 | 国产aa免费视频 | 91麻豆精品国产午夜天堂 | 久久狠狠一本精品综合网 | 国产在线精 | 人人澡人人爽欧一区 | 中文字幕黄网 | 久久久久久久久久久免费 | 天天操比| 国产精品久久久久aaaa | 乱子伦av| 日韩欧美在线免费 | 久久久久久福利 | www国产在线| 久草在线欧美 | www.五月天婷婷.com | 6080yy午夜一二三区久久 | 国产精品久久久电影 | 成人a视频片观看免费 | www免费看片com | 五月婷香蕉久色在线看 | 亚洲区另类春色综合小说 | 亚洲国产精品va在线看黑人 | 91精品1区2区 | 国产福利91精品张津瑜 | 免费日韩一区二区 | 婷婷激情综合五月天 | 日本激情动作片免费看 | 亚洲精品一区二区三区高潮 | 成人h视频在线播放 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 国产精品久久久久久久久久白浆 | 久久成人午夜 | 国产成人91 | 2019免费中文字幕 | 亚州国产精品久久久 | 欧美成年人在线观看 | 日韩美女黄色片 | 天天干天天摸 | 不卡的av中文字幕 | 国产视频首页 | 狠狠激情中文字幕 | 伊人国产女 | 丝袜美腿av| 在线香蕉视频 | 天堂av中文字幕 | 中文字幕 国产视频 | 男女精品久久 | 天天操网站 | 男女激情免费网站 | 成人免费在线视频观看 | 免费看片黄色 | 最新av中文字幕 | 午夜精品久久久久 | 五月婷在线观看 | 天天伊人网 | 欧美日韩精品免费观看 | 国产96av| 免费网站看v片在线a | 日韩a欧美 | 国产精品欧美 | 日b视频国产 | 中文字幕在线不卡国产视频 | 九九热精品视频在线播放 | 91成人精品观看 | 992tv又爽又黄的免费视频 | 中文字幕丝袜美腿 | 蜜臀av性久久久久av蜜臀三区 | 久久福利剧场 | 男女男视频| 久久高清免费观看 | av 一区二区三区四区 | 国产精品免费视频一区二区 | 色a网| 中文字幕资源网 国产 | 午夜精品视频在线 | 成人片在线播放 | 四虎影视精品永久在线观看 | 成人中文字幕+乱码+中文字幕 | 日本精品视频一区 | av一二三区 | 日韩av高清 | 激情五月婷婷综合 | 一区三区在线欧 | 久久综合狠狠狠色97 | 欧美黄污视频 | 亚洲精品小视频 | 亚洲一区久久久 | 成人四虎影院 | 久久久免费精品 | 国产一区网址 | 99中文字幕视频 | 久久精品99国产精品日本 | 久久爽久久爽久久av东京爽 | 日本三级吹潮在线 | 国产日韩精品在线 | 日日噜噜噜噜夜夜爽亚洲精品 | 91激情 | 欧美日本三级 | 国产成人一区二 | 中文字幕精品www乱入免费视频 | 国产涩涩网站 | 色av网站 | 国产一级电影免费观看 | 免费观看完整版无人区 | 香蕉手机在线 | 99精品视频在线 | 99久久精品国产亚洲 | 日韩| 麻豆免费视频网站 | 欧美性极品xxxx娇小 | 瑞典xxxx性hd极品 | 大荫蒂欧美视频另类xxxx | 69久久久久久久 | 天天干天天天天 | 欧美在线你懂的 | 手机在线永久免费观看av片 | ,午夜性刺激免费看视频 | av先锋影音少妇 | 国产成人av | 91福利在线导航 | 在线黄色免费av | 国内一级片在线观看 | 99热这里只有精品久久 | 成人影视片 | 国产一级免费在线观看 | 亚洲国产精品影院 | av免费观看高清 | 亚洲视频电影在线 | 久久色在线播放 | 国产91国语对白在线 | 91经典在线| 在线观看精品视频 | 日韩精品一区二区三区免费观看视频 | 精品国产一区二区三区久久久 | 亚洲伊人网在线观看 | 日韩综合在线观看 | 在线成人一区 | 精品国产乱子伦一区二区 | 最新的av网站 | 日韩在线观看网站 | 麻豆精品国产传媒 | 国产理论在线 | 日韩久久精品一区 | 美女久久网站 | 99久久精品国产毛片 | 亚洲黄色在线免费观看 | 国内揄拍国内精品 | 欧洲精品二区 | 国产精品6 | 色婷丁香| 国产精品系列在线 | 91精品国产乱码在线观看 | 五月婷婷黄色 | 91麻豆看国产在线紧急地址 | 国产情侣一区 | 午夜10000 | 欧美专区国产专区 | 欧美日韩中文在线观看 | 亚州精品天堂中文字幕 | 99久久婷婷 | 国产精品大片 | 亚洲日韩欧美一区二区在线 | 日韩午夜精品 | 免费在线观看午夜视频 | 亚洲精品白浆高清久久久久久 | 久久久久日本精品一区二区三区 | 久久少妇免费视频 | 99色视频 | 久久这里 | www.人人干| 亚洲理论在线观看电影 | 五月花丁香婷婷 | 免费久久久久久久 | av在线电影播放 | 久久理伦片 | 在线观看不卡视频 | 精品国产人成亚洲区 | 91网址在线观看 | 欧美日韩高清一区二区 国产亚洲免费看 | 亚洲精品ww | 国产成人l区 | 91精品夜夜| 一区二区三区四区影院 | 91大片网站| 毛片基地黄久久久久久天堂 | 丁香婷婷综合激情五月色 | 亚洲黄a | 爱av在线网 | 狠狠操狠狠插 | 91.麻豆视频| 亚洲欧美日韩国产一区二区三区 | 在线观看黄av | 在线视频亚洲 | 亚欧日韩av | 成年人免费在线观看网站 | 国产成人精品亚洲日本在线观看 | 亚洲日韩欧美一区二区在线 | 六月丁香在线视频 | 国精产品999国精产品视频 | 中文字幕一区二区三区在线视频 | 中文字幕av日韩 | 亚洲国产欧美一区二区三区丁香婷 | 国产97碰免费视频 | 超碰在线97免费 | 国产乱对白刺激视频不卡 | 成人久久久久久久久久 | 黄色片亚洲 | 中文字幕在线视频一区二区 | 欧美三级高清 | 亚洲精品99久久久久中文字幕 | 中文字幕一区二区三区乱码在线 | 日本一区二区不卡高清 | 性色av香蕉一区二区 | 久久久久久久久久久免费视频 | 日本视频不卡 | 嫩嫩影院理论片 | 久久久久久久久毛片精品 | 国产一区免费在线观看 | 久久午夜羞羞影院 | 亚洲精品自拍视频在线观看 | 91亚洲狠狠婷婷综合久久久 | 国产一卡久久电影永久 | 亚洲黄网址| 欧美韩国日本在线观看 | 日韩xxxxxxxxx| 久久久片| 十八岁以下禁止观看的1000个网站 | 精品国产一区二区三区四区在线观看 | 香蕉视频在线视频 | 欧美日韩高清在线观看 | 久久久久免费精品视频 | 97在线免费| 午夜精品视频在线 | 激情欧美一区二区三区免费看 | 欧美日韩电影在线播放 | 亚洲人xxx| 日韩精品一区二区三区在线播放 | 欧美一区二视频在线免费观看 | 国产性天天综合网 | 四虎最新域名 | 超碰人人乐 | 九九热久久免费视频 | 日韩欧美国产成人 | 欧美精品一区二区三区四区在线 | 国产成人在线综合 | 久久不卡国产精品一区二区 | 国产高清专区 | 99久久精品免费看国产一区二区三区 | 色吊丝在线永久观看最新版本 | 久久精品三| 日本三级在线观看中文字 | 六月丁香激情综合色啪小说 | 国产精品久久久久久久久久久久冷 | 中文字幕色站 | 久久精品国产亚洲精品2020 | 91视频久久| 免费日韩电影 | 毛片一区二区 | 亚洲激情在线观看 | 日本精品久久 | 精品国产一区二区三区免费 | 久久久久久久久久久久国产精品 | 97免费在线观看视频 | 国产精品永久在线 | 国产无遮挡猛进猛出免费软件 | www欧美色| 婷婷综合久久 | 日日夜夜精品网站 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 超碰com| 五月婷婷综合久久 | 在线中文字母电影观看 | 亚洲视频 视频在线 | 久久99精品久久久久久久久久久久 | 精品国产精品一区二区夜夜嗨 | 久久成人久久 | 国产精品亚洲视频 | 521色香蕉网站在线观看 | 伊人天天狠天天添日日拍 | 国产精品一区二区三区免费视频 | 黄色1级大片 | 超碰人人草| 五月激情久久 | 天天色官网 | 亚洲电影一区二区 | 在线观看av免费 | 免费久久久久久久 | 精品国产亚洲一区二区麻豆 | 久久久蜜桃一区二区 | 国产99自拍 | 国产99久久精品一区二区300 | 免费在线观看日韩 | 亚洲国产成人在线 | 国产黄在线免费观看 | 91麻豆看国产在线紧急地址 | 天天干夜夜操视频 | 成人在线视频观看 | 天天综合色 | 日韩精品一区二区三区免费视频观看 | 久热爱 | 奇米网网址| 午夜视频久久久 | bbb搡bbb爽爽爽 | 伊人五月在线 | 日本最新高清不卡中文字幕 | 黄色软件在线观看免费 | 99热这里是精品 | 五月开心婷婷网 | 精品国产一区二区三区久久影院 | 久久三级毛片 | 欧美精品在线一区二区 | 日韩久久精品一区二区三区下载 | 97影视| 日韩高清在线观看 | 五月开心网 | 99久久精品免费看国产一区二区三区 | 亚洲精品黄色在线观看 | 91精品国产三级a在线观看 | 亚洲视频免费视频 | 91成人在线看 | 顶级bbw搡bbbb搡bbbb | 亚洲理论在线 | 国产免费av一区二区三区 | 最近中文字幕高清字幕在线视频 | 亚洲成人免费在线观看 | 欧美亚洲精品在线观看 | 久久一视频 | 91精品视频在线观看免费 | 国产裸体永久免费视频网站 | 久久99精品国产麻豆宅宅 | 日韩欧美91 | 国产在线欧美在线 | 国产精品一区免费看8c0m | 欧美日韩国产综合一区二区 | 一区二区三区在线观看 | 在线观看一区视频 | 日韩有码在线观看视频 | 免费看一级 | 日韩一区精品 | 视频在线观看入口黄最新永久免费国产 | 免费观看v片在线观看 | 中文字幕国产 | 欧美在线不卡一区 | 久久激情小说 | 中文字幕你懂的 | 色网站视频 | 黄色影院在线免费观看 | 亚洲黄色免费在线看 | 成人av在线直播 | 欧美激情精品久久 | 国产亚洲激情视频在线 | 在线国产精品视频 | 国内精品在线观看视频 | 国产小视频在线观看免费 | 亚洲男男gⅴgay双龙 | 4438全国亚洲精品观看视频 | 91高清视频在线 | 少妇bbw揉bbb欧美 | 激情视频在线高清看 | 日韩欧美国产视频 | 99热只有精品在线观看 | 国内精品毛片 | 日日摸日日添日日躁av | 国产精品久久久久久模特 | 国产一线天在线观看 | 亚洲精品在线资源 | 国产视频 久久久 | 国产真实精品久久二三区 | 国产黄| 亚洲精品国偷自产在线99热 | 人人澡超碰碰97碰碰碰软件 | 欧美a性| 国产精品成人国产乱一区 | 五月天综合色 | 日韩特黄av| 国产日韩欧美在线看 | 久保带人| 91丨九色丨国产丨porny精品 | 国产一级精品绿帽视频 | 少妇搡bbbb搡bbb搡忠贞 | 超碰免费在线公开 | 国产人成看黄久久久久久久久 | 91视视频在线直接观看在线看网页在线看 | 日日夜夜天天射 | 国产精品刺激对白麻豆99 | 精品国产不卡 | 人人舔人人干 | 欧美一区在线观看视频 | 亚洲男模gay裸体gay | 成年人在线免费看 | 在线观看成人一级片 | 天天操天天操天天操天天操天天操 | 国产精品欧美日韩在线观看 | 观看免费av | 精品在线99 | 国产成人精品一区二区在线观看 | 国产原创中文在线 | 欧美午夜视频在线 | 国产手机在线观看 | 91亚洲精品国偷拍自产在线观看 | 成人国产精品久久久春色 | 国产资源中文字幕 | 亚洲精品视频网址 | 成人av资源网 | 97色狠狠| 美腿丝袜一区二区三区 | 日韩理论在线视频 | 日韩在线网址 | 亚洲免费资源 | 午夜视频免费播放 | 中文字幕在线观看视频一区 | 青青草在久久免费久久免费 | 91精品无人成人www | 精品国产精品一区二区夜夜嗨 | 中文字幕在线观看免费 | 涩涩网站在线 | 亚洲va欧美va | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 在线观看理论 | 啪啪肉肉污av国网站 | 全黄网站 | 国产中文视 | 狠狠色丁香婷婷综合久久片 | 国产综合在线观看视频 | 久久理论片| 日本精品一 | 国内外成人免费在线视频 | 国产打女人屁股调教97 | 国产91精品看黄网站 | 亚洲精品影视在线观看 | 免费裸体视频网 | 天天干天天干天天干 | 99在线精品视频 | 日韩aa视频 | 五月婷婷丁香六月 | 久草网免费 | 97超视频 | 精品国产免费久久 | 91资源在线免费观看 | 国产精品麻豆三级一区视频 | 久久久久久久久久久免费av | 在线视频99| 免费a级观看 | 日韩午夜三级 | 天天视频亚洲 | av在线超碰 | 精品中文字幕在线 | 国产剧情在线一区 | 人人爱天天操 | 日韩国产欧美在线播放 | 成人国产综合 | 久久久国产成人 | 91高清免费| 国产二区视频在线观看 | www亚洲国产| 在线视频亚洲 | 射射射av | 西西444www高清大胆 | 国产色婷婷精品综合在线手机播放 | 成人h视频在线 | 日韩在线资源 | 99久久精品国产亚洲 | 久久黄色免费视频 | 99久久er热在这里只有精品15 | 天天躁日日躁狠狠躁 | 国产精品久久综合 | 精品国产免费人成在线观看 | 黄色影院在线观看 | a√天堂中文在线 | 中文字幕在线观看免费高清电影 | 亚洲精品国产免费 | 99国产精品久久久久老师 | 精品久久久免费视频 | 成人小视频在线 | 国产香蕉视频在线播放 | 欧美精品一区二区在线观看 | 成人黄色毛片视频 | 国产精品久久毛片 | 欧美精品一区二区性色 | 日韩1级片| 中国黄色一级大片 | 国产成人精品一区二区三区在线观看 | 玖玖精品在线 | 国产香蕉视频 | 美女黄网久久 | 国产精品视频久久 | 国产精品国产自产拍高清av | 99热这里只有精品免费 | www.久久免费视频 | 99视频网站| 国产成人在线免费观看 | 国产日本高清 | 色爱成人网 | 911久久 | 西西444www大胆无视频 | 免费观看av | 久久a热6| 91人人爽人人爽人人精88v | 中文字幕国产精品一区二区 | 在线一二三区 | 天天婷婷| a级片韩国 | 久草色在线观看 | 97狠狠干 | 日免费视频 | 四虎国产 | 操操操夜夜操 | 久久国产片 | 精品一区二区免费视频 | 成人一级免费视频 | 在线播放视频一区 | 久久精品首页 | 国产一在线精品一区在线观看 | 午夜美女视频 | 天天干,天天操 | 欧美日韩二三区 | 日韩精品高清不卡 | 国产福利久久 | 天堂网一区二区 | 日本丰满少妇免费一区 | 99视频| 男女男视频 | 黄色一级影院 | 久草免费色站 | 天天做日日爱夜夜爽 | 国产精品视频app | 久久久久久免费毛片精品 | 亚洲作爱视频 | 热久久免费视频 | 国产视频精品久久 | 天天射天天色天天干 | 欧美国产日韩一区二区三区 | 天天操夜操视频 | 免费黄av| 国产精品一区二区久久精品 | 国产视频91在线 | 九九免费在线观看视频 | 天天综合网 天天综合色 | 制服丝袜在线 | 亚洲精品在线视频观看 | 亚洲国产欧美在线人成大黄瓜 | 天天爱天天操天天干 | 日韩性色| 久久影视网 | 麻豆91视频 | 免费高清无人区完整版 | 男女视频久久久 | 日韩黄色影院 | 欧美激精品| 美女免费av | 国内精品久久久久影院一蜜桃 | 亚洲精品午夜一区人人爽 | 亚洲午夜av电影 | 久草在线免费新视频 | 日韩av在线不卡 | 色婷婷综合在线 | 国产乱码精品一区二区蜜臀 | 国产99久久久精品 | 二区三区在线观看 | 高清视频一区 | 日本中文字幕一二区观 | 高清一区二区三区av | www九九热| 久久激情视频 | 蜜桃视频精品 | 在线看毛片网站 | 97激情影院 | 久久国产精品99久久久久久丝袜 | 色婷婷狠狠五月综合天色拍 | 久在线 | 国产资源免费在线观看 | 久久99婷婷 | 蜜桃视频精品 | 97成人精品视频在线观看 | 婷婷精品| 国产特级毛片aaaaaaa高清 | 91视频 - v11av| 国产精品久久久久久久久婷婷 | 国产91学生粉嫩喷水 | a在线观看视频 | 欧美另类z0zx| 国产亚洲无| 欧美性春潮| 91免费版成人 | 91精品国产欧美一区二区 | 一区二区三区在线不卡 | 日韩精品一区二区在线观看视频 | 国产无遮挡又黄又爽在线观看 | 91av中文字幕| 日韩欧美精品一区二区 | 欧洲av在线| 国产视频999 | 亚洲精品视频久久 | 久艹在线播放 | 久久综合九色综合欧美狠狠 | 成人av在线一区二区 | 中文字幕在线观看视频免费 | 91亚洲精品久久久久图片蜜桃 | 日韩高清在线一区二区 | 日日爱影视 | 丁香色婷婷 | 91av短视频 | 激情婷婷丁香 | 久草在线视频国产 | 欧美精品久久久久久久免费 | 免费在线观看av网站 | av综合av| 麻豆免费视频观看 | 激情婷婷网 | 亚洲午夜在线视频 | 亚洲专区一二三 | 天堂在线视频免费观看 | 在线免费看黄色 | 婷婷综合激情 | 免费男女羞羞的视频网站中文字幕 | 中文字幕色在线 | 国产成人精品午夜在线播放 | 国产九色视频在线观看 | 精品视频一区在线 | 久久伊人国产精品 | 五月导航| 青青河边草免费直播 | 日日干网| av不卡免费在线观看 | 久草在线官网 | 人人澡人人添人人爽一区二区 | 蜜臀91丨九色丨蝌蚪老版 | 在线综合色 | 欧美综合国产 | 国产中文字幕一区二区三区 | a黄色片 | 成人黄色片免费看 | 四虎最新域名 | 中文字幕日韩精品有码视频 | 国产一级精品在线观看 | 国产精品日韩欧美一区二区 | 中文字幕免费国产精品 | 激情丁香5月 | 国产精品乱码在线 | 九九涩涩av台湾日本热热 | 99精品久久99久久久久 | 一区二区三区在线观看免费 | 久久久影片 | 久久tv | 黄色大全免费网站 | 在线va视频 | 九九热在线观看 | 天海冀一区二区三区 | 黄色在线看网站 | 精品一区精品二区高清 | 亚洲天堂精品视频在线观看 | 99久久精品国产欧美主题曲 | 中文国产在线观看 | 亚洲狠狠婷婷综合久久久 | 91九色蝌蚪视频在线 | 久草精品视频 | 久久精品国产免费观看 | 贫乳av女优大全 | 黄p网站在线观看 | 男女激情片在线观看 | 91精品对白一区国产伦 | 91精品一区二区三区蜜臀 | 在线观看免费国产小视频 | 国产精品成人自拍 | 99久久精品国产毛片 | 欧美另类美少妇69xxxx | 欧美日韩观看 | 久久久久激情视频 | 色妞色视频一区二区三区四区 | 成人av一区二区兰花在线播放 | 成人久久亚洲 | 日韩二区三区在线 | 国产免费观看av | 国产中文字幕视频在线 | 99久久精品国产一区二区三区 | 国产福利91精品张津瑜 | 精品在线观看免费 | 日韩视频一 | 中文字幕精品www乱入免费视频 | 欧美性色19p | 99久久精品国产亚洲 | 国产日韩欧美在线影视 | 日韩.com | 在线观看黄av | 久久婷婷五月综合色丁香 | 国产黄大片| 91在线观看视频网站 | 97精品国产手机 | 在线观看色视频 | 免费在线观看成人 | 91精品伦理 | 欧美日韩国产二区三区 | 天天操夜夜操夜夜操 | 天天干,天天射,天天操,天天摸 | 国产成人精品三级 | 99精品国产免费久久久久久下载 | 国产精品18久久久久久久网站 | 亚洲精品视频一二三 | 久久综合九色99 | 日韩免费福利 | 国产亚洲精品久久久久久移动网络 | 亚洲欧美精品一区 | 久久视频这里有精品 | 最近免费中文字幕mv在线视频3 | 手机av观看| 97电影手机 | 激情五月婷婷综合网 | 尤物九九久久国产精品的分类 | 久久成人高清视频 | 国产精品九九热 | 日韩丝袜视频 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 黄色特级毛片 | 国产免费一区二区三区网站免费 | 久久99国产精品免费 | 欧美另类69 | 在线观看国产v片 | 中文字幕91 | 成人av资源网站 | 免费a级黄色毛片 | 草樱av| 久久电影中文字幕视频 | 日韩欧美高清免费 | av电影免费在线看 | 国产精品人人做人人爽人人添 | 500部大龄熟乱视频 欧美日本三级 | 国产精品一区二区免费 | 欧美aa级| 天天爱天天射天天干天天 | 日韩久久精品一区二区 | 久久精品99国产精品日本 | av资源免费观看 | 中文字幕高清av | 在线观看中文字幕av | 黄色的片子 | 久久免费视频在线观看 | 粉嫩av一区二区三区四区五区 | 中文字幕91在线 | 日日爱夜夜爱 | 国产日本三级 | 日韩免费高清在线 | 中文字幕你懂的 | 国产成人av网 | 欧美aa一级| 少妇18xxxx性xxxx片 | 日韩欧美一区二区三区视频 | 亚洲精品av中文字幕在线在线 | 99视频+国产日韩欧美 | 狠狠操欧美 | 国内精品久久久久久久影视简单 | 人人澡人人爽欧一区 | 碰碰影院 | 国产黄色精品视频 | 天天射天天干天天操 | 欧美最猛性xxxxx(亚洲精品) | 中文字幕日韩电影 | 91麻豆精品国产91久久久久久久久 | 国产黄色特级片 | 2022久久国产露脸精品国产 | 亚洲激情av | 99久久精品国产网站 | 欧美另类美少妇69xxxx | 国产在线欧美在线 | 成人免费在线网 | 91激情在线视频 | 九九精品视频在线观看 | 日本三级香港三级人妇99 | 在线免费av网 | 国产系列精品av | 美女在线免费观看视频 | 免费在线看成人av | 色吊丝在线永久观看最新版本 | 国产视频在线观看一区二区 | 国产精品黑丝在线观看 | 日韩一二三 | 欧美日韩亚洲第一页 | 99久久综合国产精品二区 | 日韩免费网站 | 欧美一区日韩精品 | 久草在线观看资源 | 久久久精华网 | 日韩va在线观看 | 波多野结衣精品视频 | 欧美久久久久久久久久久久久 | 中文字幕色综合网 | 久久av福利 | 国产精品久久久久亚洲影视 | 天天操天天射天天舔 | 成人综合免费 | 操一草| 91亚洲在线 | 亚洲综合成人专区片 | 国内精品久久久久久久97牛牛 | 丁香九月婷婷综合 | 最新av网站在线观看 | 五月天天色 | 天天干天天搞天天射 | 国产伦精品一区二区三区高清 | 日韩高清免费在线 | 国产婷婷精品 | 国产精品久久久久久久久久直播 | 久久中文视频 | 久久永久视频 | 久久夜夜操 | 伊人亚洲综合网 | 伊人av综合| 色综合久久99| 成人av影院在线观看 | 狠狠干激情 | 日韩一级黄色av | 色一级片| 一区三区在线欧 | 国产一区二区视频在线 | 在线观看日本高清mv视频 | 三级av免费 | 99热精品久久 | 午夜影院在线观看18 | 精品国产一区二区三区四区vr | 日韩精品一区二区三区高清免费 | 麻豆视频免费入口 | 精品国产一区二区三区久久久蜜臀 | 97在线视频观看 | 最近2019好看的中文字幕免费 | 日本性xxxxx 亚洲精品午夜久久久 | 麻豆传媒视频在线播放 | 久草综合在线 | 国内精品久久久久久久久 | 免费看的黄色片 | av大全在线 | 在线色视频小说 | av免费观看网址 | 中文字幕一区二区三区四区 | 精品国产视频在线 | 亚洲欧美国产视频 | 丁香婷婷深情五月亚洲 | 二区三区在线视频 | 亚洲 欧美 综合 在线 精品 | 在线观看成人 | 在线观看一区二区精品 | 国产精品一区二区av麻豆 | 在线探花 | 五月婷婷在线观看视频 | 97免费在线观看视频 | 日韩在线视频精品 | 91在线亚洲| 一级黄色片在线免费观看 | av电影免费在线看 | 日本久久成人中文字幕电影 | 日本午夜在线观看 | 精品色999 | www五月天婷婷 | 天天拍天天操 | 人人澡人人爱 | 国产91av视频在线观看 | 国产精品理论片在线观看 | 成人在线观看免费视频 | 视频一区二区视频 | 天天草天天插 | 国内精品久久久久久久久久 | 91最新地址永久入口 | 激情欧美一区二区三区 | 青青河边草免费直播 | 九九综合久久 | 国产亚洲人成网站在线观看 | 中文字幕资源在线 | 国产一区二区在线免费观看 | www国产亚洲精品久久麻豆 | 欧美色综合久久 | 国产在线91精品 | 国产人免费人成免费视频 | 亚洲精品在线视频观看 | 韩国av免费观看 | 麻豆传媒视频在线播放 | 中文字幕不卡在线88 | 国产精品一区二区三区久久 | 亚洲无吗视频在线 | 天天综合网天天 | 日日添夜夜添 | 中文字幕在线高清 | 国产精品久久伊人 | 日韩电影在线看 | 免费在线观看亚洲视频 | 久久一区二区三区国产精品 | 久久理论电影 | 亚洲成人软件 | 五月色婷 | 正在播放国产一区二区 | 亚洲视频h | 亚洲一级黄色片 | 久久视频在线观看 | 亚洲天天做 | 最新免费中文字幕 | 国产不卡免费av | 怡红院成人在线 | 成人免费在线看片 | 欧美性高跟鞋xxxxhd | 久久久久一区二区三区四区 | 日本h视频在线观看 | 日韩黄视频 | 欧美日韩高清 | 亚洲国产免费 | 伊人永久在线 | 看黄色.com | 亚洲一区二区三区四区在线视频 | 久久久免费毛片 | 久久福利 | 免费观看成人网 | 午夜在线观看影院 | 永久免费精品视频 | 国产亚洲午夜高清国产拍精品 | 69精品人人人人 | 亚洲精品动漫成人3d无尽在线 | 日韩中文字幕免费在线播放 | 99国产精品久久久久久久久久 | 91视频大全 | 色综合久久88色综合天天6 | 一级片在线 | 久久香蕉影视 | 日韩欧美网址 | 在线视频观看国产 | 免费成人在线视频网站 | 韩国av免费在线观看 | 日韩欧美在线观看一区二区三区 | 国产精品久久久久久久久久新婚 | 久草视频在线资源站 | 五月婷婷视频在线观看 | 黄色在线视频网址 | 天天草夜夜 |