操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    之前流水賬似的介紹過(guò)一篇機(jī)器學(xué)習(xí)入門的文章,大致介紹了如何學(xué)習(xí)以及機(jī)器學(xué)習(xí)的入門方法并提供了一些博主自己整理的比較有用的資源。這篇就盡量以白話解釋并介紹機(jī)器學(xué)習(xí)在推薦系統(tǒng)中的實(shí)踐以及遇到的問(wèn)題... 也許很多點(diǎn)在行家的眼里都是小菜一碟,但是對(duì)于剛剛接觸機(jī)器學(xué)習(xí)來(lái)說(shuō),還有很多未知等待挑戰(zhàn)。

    所以讀者可以把本篇當(dāng)做是機(jī)器學(xué)習(xí)的玩具即可,如果文中有任何問(wèn)題,還請(qǐng)不吝指教。

    本篇將會(huì)以下面的步驟描述機(jī)器學(xué)習(xí)是如何在實(shí)踐中應(yīng)用的:

    問(wèn)題背景為什么需要推薦

    最開(kāi)始互聯(lián)網(wǎng)興起的時(shí)候,是靠分類來(lái)組織知識(shí)的,最典型的就是;后來(lái)隨著搜索引擎的興起,人們主動(dòng)的獲取知識(shí)成為流行趨勢(shì),例如百度、。基于搜索人們可以看到想看的電影,搜到想買的衣服。但是這并能滿足所有人的需求,有時(shí)候無(wú)聊逛一些網(wǎng)站,希望網(wǎng)站能主動(dòng)發(fā)現(xiàn)我的興趣點(diǎn),并且主動(dòng)的給我我感興趣的內(nèi)容 ——這就是推薦。比如各種電商網(wǎng)站和視頻網(wǎng)站,都可以基于用戶搜索的內(nèi)容和常看的內(nèi)容,挖掘用戶的興趣,給用戶展現(xiàn)用戶想看卻不知道怎么搜索到的內(nèi)容。預(yù)知用戶的需求,這就是推薦的魅力。

    這么神奇的功能是怎么做的?難道每個(gè)網(wǎng)站都有專門的狗仔跟蹤每個(gè)用戶的需求?這當(dāng)然是不可能的...

    實(shí)現(xiàn)推薦的方法有很多,最典型的就是協(xié)同過(guò)濾。

    推薦中的機(jī)器學(xué)習(xí)

    協(xié)同過(guò)濾我就簡(jiǎn)單的說(shuō)一下,因?yàn)樗F(xiàn)在實(shí)在是應(yīng)用的太廣泛的....

    基于物品的協(xié)同過(guò)濾

    舉個(gè)例子:

    A:前一陣上映的《刺客信條》,我特別喜歡!最近有沒(méi)有類似的電影啊?
    B:我感覺(jué)《加勒比海盜》跟他差不多,都是大片!要不你去看看?
    A:好呀!那我去看看!

    這就是基于物品的協(xié)同過(guò)濾,即推薦相似的物品給這個(gè)人。

    因?yàn)锳和C物品很相似,因此C用戶喜歡了A物品,那么推測(cè)他也會(huì)喜歡C物品,因此把C物品推薦給他。

    基于人的協(xié)同過(guò)濾

    舉個(gè)例子:

    A:最近好無(wú)聊,你有沒(méi)有什么喜歡的電影,介紹一下?
    B:我喜歡看《神奇女俠》,要不你去看看?
    A:好滴,一般你推薦的電影我都喜歡,那周末我去看看!

    這就是基于人的協(xié)同過(guò)濾協(xié)同過(guò)濾推薦系統(tǒng)ppt,即會(huì)依據(jù)相似的人來(lái)推薦喜歡的內(nèi)容。

    相似,因此就把C喜歡的物品D推薦給了A。

    其實(shí)推薦就是這么簡(jiǎn)單,那么后續(xù)我們來(lái)看看它的內(nèi)部原理和實(shí)踐吧!

    機(jī)器學(xué)習(xí)數(shù)學(xué)知識(shí)

    上面就是典型的協(xié)同過(guò)濾的場(chǎng)景,要想弄明白如何基于機(jī)器學(xué)習(xí)實(shí)現(xiàn)協(xié)同過(guò)濾,還需要回顧一下數(shù)學(xué)的基本知識(shí)。

    很多人都因?yàn)閿?shù)學(xué)而不敢深入學(xué)習(xí)機(jī)器學(xué)習(xí),其實(shí)大家都是上過(guò)高數(shù)線代概率論的,所以等真正用它的時(shí)候,回去翻翻對(duì)應(yīng)的教材,很快就可以撿起來(lái)的。如果沒(méi)時(shí)間也可以在網(wǎng)上看看別人總結(jié)的一些公式,最基礎(chǔ)的應(yīng)該知道高數(shù)中的求導(dǎo)和微分、矩陣的運(yùn)算、概率論中的一些分布等等。剩下的就針對(duì)性的查查書(shū)籍即可。

    之前看過(guò)一篇帖子,還是很基礎(chǔ)的,可以看看:

    理論原理

    在協(xié)同過(guò)濾中,最基礎(chǔ)的是要構(gòu)建人與物品的評(píng)分矩陣,這個(gè)評(píng)分可能來(lái)自于你對(duì)物品的操作,比如電上網(wǎng)站中,購(gòu)買或者收藏物品,瀏覽物品等等都會(huì)作為評(píng)分的因素進(jìn)行計(jì)算。最終形成人與物品的二維矩陣:

    形成上面的矩陣后,就可以進(jìn)行基于物品或者基于人的推薦了。

    協(xié)同過(guò)濾推薦系統(tǒng)ppt_電子商務(wù)中協(xié)同過(guò)濾推薦技術(shù)研究_協(xié)同過(guò)濾的電影推薦系統(tǒng)

    因?yàn)槲锲稟和物品C很像,因此物品C推薦給還未購(gòu)買的用戶C

    因?yàn)橛脩鬉和用戶C比較像,因此會(huì)把用戶C購(gòu)買的物品推給用戶A

    如何計(jì)算是否相似

    我之前總結(jié)過(guò)相似度的一些算法:

    在協(xié)同過(guò)濾中,常用的是歐氏距離、夾角余弦、皮爾遜系數(shù)以及杰卡德距離,有興趣的可以關(guān)注下各個(gè)算法的實(shí)現(xiàn)。

    降維

    在真正的電商環(huán)境下,往往具有很多的用戶以及很多的商品,每個(gè)用戶并不是對(duì)所有的商品都有評(píng)分的,因此這個(gè)矩陣實(shí)際上是一個(gè)非常稀疏的矩陣。如果想要在計(jì)算機(jī)中完全的表示這樣一個(gè)矩陣,它其實(shí)根本無(wú)法計(jì)算,數(shù)據(jù)量實(shí)在太龐大了(除非你的數(shù)據(jù)量根本沒(méi)那么大,那么可以直接跳過(guò)這一部分了)。

    在這種二維矩陣中,最常用的降維手段是SVD——矩陣分解。有矩陣基礎(chǔ)的都應(yīng)該知道,一個(gè)MxN的矩陣可以由一個(gè)MxK以及KxN的兩個(gè)矩陣相乘得出。因此降維的手段就是把這個(gè)矩陣分解成兩個(gè)矩陣相乘。

    比如,一個(gè)矩陣形成下面兩個(gè)矩陣:

    實(shí)際在機(jī)器學(xué)習(xí)中,是使用交替最小二乘ALS來(lái)求解兩個(gè)矩陣的。再說(shuō)就遠(yuǎn)了,可以簡(jiǎn)單的理解成,先隨機(jī)一個(gè)MxK的矩陣,然后用ALS求得另一個(gè)矩陣,然后固定這個(gè)求得的矩陣,再反過(guò)來(lái)求第一個(gè)矩陣,直到找到近似的最優(yōu)解。這個(gè)最后得到的兩個(gè)矩陣,實(shí)際上相乘后,原來(lái)有的值還在,但是原來(lái)的沒(méi)有的會(huì)預(yù)測(cè)出來(lái)一個(gè)分值。基于這個(gè)分值,就可以做用戶的推薦了。

    系統(tǒng)架構(gòu)架構(gòu)設(shè)計(jì)

    關(guān)于機(jī)器學(xué)習(xí)中的系統(tǒng)架構(gòu),可以仿照美團(tuán)很多年前寫(xiě)的一篇文章,現(xiàn)在看來(lái)對(duì)于剛開(kāi)始構(gòu)建推薦系統(tǒng),還是很有幫助的。

    另外,這里只看到了離線的部分,通常推薦還需要結(jié)合實(shí)時(shí)的部分,比如用戶當(dāng)前搜索的條件、地理位置、時(shí)間季節(jié)等,進(jìn)行實(shí)時(shí)的跟蹤推薦。

    這樣一個(gè)推薦系統(tǒng)的架構(gòu)就完成了。

    注意的問(wèn)題

    針對(duì)第三種情況,可以詳細(xì)說(shuō)下:

    等等,很多的場(chǎng)景都需要結(jié)合業(yè)務(wù)來(lái)設(shè)定,上面說(shuō)的也不是官方的做法,只是個(gè)人的想法而已。

    代碼實(shí)踐

    最后就直接基于Spark MLlib,來(lái)實(shí)踐一下ALS的協(xié)同過(guò)濾吧!

    基于Spark MLlib的協(xié)同過(guò)濾

    代碼和測(cè)試數(shù)據(jù)都是基于Spark官方提供的包,如果讀者有興趣可以查看官網(wǎng)文檔,各個(gè)例子都有描述。

    數(shù)據(jù)也可以在下面的云盤(pán)中下載:

    ?????

    代碼如下,修改下路徑協(xié)同過(guò)濾推薦系統(tǒng)ppt,就可以直接跑的!

    package xingoo.mllib

    import org.apache.spark.mllib.recommendation.{ALS, MatrixFactorizationModel, Rating}
    import org.apache.spark.rdd.RDD
    import org.apache.spark.{SparkConf, SparkContext}

    /**
    * Created by xinghailong on 2017/6/9.
    */
    object MovieLensALSTest {
    val implicitPrefs: Boolean = true

    def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("MovieLensALS-Test").setMaster("local[2]")
    val sc = new SparkContext(conf)
    sc.setLogLevel("WARN")

    // 讀取評(píng)分矩陣
    val ratings = sc.textFile("C:\\Users\\xingoo\\Documents\\workspace\\my\\Spark-MLlib-Learning\\resouce\\sample_movielens_ratings.txt")
    .map { line =>
    val fields = line.split("::")
    // 是否有負(fù)的評(píng)分
    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".
    */
    // 為每一行創(chuàng)建Rating
    Rating(fields(0).toInt, fields(1).toInt, fields(2).toDouble - 2.5)
    } else {
    Rating(fields(0).toInt, fields(1).toInt, fields(2).toDouble)
    }
    }.cache()

    val numRatings = ratings.count()
    val numUsers = ratings.map(_.user).distinct().count()
    val numMovies = ratings.map(_.product).distinct().count()

    println(s"Got $numRatings ratings from $numUsers users on $numMovies movies.")

    // 按照權(quán)重切分rdd
    val splits = ratings.randomSplit(Array(0.8, 0.2))
    // 用80%的數(shù)據(jù)作為訓(xùn)練集
    val training = splits(0).cache()
    // 用20%的數(shù)據(jù)作為測(cè)試集
    val test = if (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()

    val numTraining = training.count()
    val numTest = test.count()
    println(s"Training: $numTraining, test: $numTest.")

    ratings.unpersist(blocking = false)

    val model = new ALS()
    .setRank(10) //矩陣分解的隱含分類為10
    .setIterations(10) //迭代次數(shù)為10
    .setLambda(1) //正則項(xiàng)lambda參數(shù)為1
    .setImplicitPrefs(implicitPrefs)
    .run(training)

    // 計(jì)算模型的準(zhǔn)確度
    val rmse1 = computeRmse(model, training, implicitPrefs)
    val rmse = computeRmse(model, test, implicitPrefs)
    println(s"Test RMSE = $rmse1.")
    println(s"Test RMSE = $rmse.")

    sc.stop()
    }
    /** Compute RMSE (Root Mean Squared Error). */
    def computeRmse(model: MatrixFactorizationModel, data: RDD[Rating], implicitPrefs: Boolean)
    : Double = {

    def mapPredictedRating(r: Double): Double = {
    if (implicitPrefs) math.max(math.min(r, 1.0), 0.0) else r
    }

    val predictions: RDD[Rating] = model.predict(data.map(x => (x.user, x.product)))
    val predictionsAndRatings = predictions.map{ x =>
    ((x.user, x.product), mapPredictedRating(x.rating))
    }.join(data.map(x => ((x.user, x.product), x.rating))).values
    math.sqrt(predictionsAndRatings.map(x => (x._1 - x._2) * (x._1 - x._2)).mean())
    }
    }

網(wǎng)站首頁(yè)   |    關(guān)于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶案例   |    售后服務(wù)   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號(hào):冀ICP備2024067069號(hào)-3 北京科技有限公司版權(quán)所有