久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

用Spark Python構(gòu)建聚類模型

 株野 2017-12-19
標(biāo)簽:SPARK,,python
來源:http://blog.csdn.net/u013719780/article/details/51833005

聲明:版權(quán)所有,,轉(zhuǎn)載請聯(lián)系作者并注明出處  http://blog.csdn.net/u013719780?viewmode=contents


博主簡介:風(fēng)雪夜歸子(英文名:Allen),機(jī)器學(xué)習(xí)算法攻城獅,,喜愛鉆研Meachine Learning的黑科技,,對Deep Learning和Artificial Intelligence充滿興趣,經(jīng)常關(guān)注Kaggle數(shù)據(jù)挖掘競賽平臺,,對數(shù)據(jù)、Machine Learning和Artificial Intelligence有興趣的童鞋可以一起探討哦,,個人CSDN博客:http://blog.csdn.net/u013719780?viewmode=contents




1 從數(shù)據(jù)中提取正確的特征


類似大多數(shù)機(jī)器學(xué)習(xí)模型,,K-均值聚類需要數(shù)值向量作為輸入,于是用于分類和回歸的特征提取和變換方法也適用于聚類,。
K-均值和最小方差回歸一樣使用方差函數(shù)作為優(yōu)化目標(biāo),,因此容易受到離群值(outlier)和較大方差的特征影響。對于回歸和分類問題來說,,上述問題可以通過特征的歸一化和標(biāo)準(zhǔn)化來解決,,同時可能有助于提升性能。但是某些情況我們可能不希望數(shù)據(jù)被標(biāo)準(zhǔn)化,,比如根據(jù)某個特定的特征找到對應(yīng)的類簇。

從MovieLens數(shù)據(jù)集提取特征
本文中,我們繼續(xù)使用博文 http://blog.csdn.net/u013719780/article/details/51775047 中的電影打分?jǐn)?shù)據(jù)集,,這個數(shù)據(jù)集主要分為三個部分:第一個是電影打分的數(shù)據(jù)集(在u.data文件中), 第二個是用戶數(shù)據(jù)(u.user),,第三個是電影數(shù)據(jù)(u.item)。除此之外,,我們從題材文件中獲取了每個電影的題材(u.genre),。

查看電影數(shù)據(jù)集
movies = sc.textFile('/Users/youwei.tan/ml-100k/u.item')
print movies.take(1)


輸出結(jié)果:
[u'1|Toy Story (1995)|01-Jan-1995||http://us./M/title-exact?Toy%20Story%20(1995)|0|0|0|1|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0']

到目前為止,我們既知道電影的名稱,,也將電影按題材分類,。那為什么還需要對電影數(shù)據(jù)進(jìn)行聚類呢?具體原因有兩個,。
? 第一,,因?yàn)槲覀冎烂坎侩娪暗念}材標(biāo)簽,所以可以用這些標(biāo)簽評估聚類模型的性能,。
? 第二,,我們希望基于其他屬性或特征對電影進(jìn)行分類,而不單單是題材,。

本例中,,除了題材和標(biāo)題,我們還有打分?jǐn)?shù)據(jù)用于聚類,。之前,,我們已經(jīng)根據(jù)打分?jǐn)?shù)據(jù)建立了一個矩陣分解模型,,這個模型由一系列用戶和電影因素向量組成。
我們可以思考怎樣在一個新的隱式特征空間中用電影相關(guān)的因素表示一部電影,,反過來說就是用隱式特征表示打分矩陣中一些特定形式的結(jié)構(gòu),。每個隱式特征無法直接解釋,因?yàn)樗鼈儽硎疽恍┛梢杂绊懹脩魧﹄娪按蚍中袨榈碾[式結(jié)構(gòu),??捎玫囊蛩赜杏脩魧︻}材的偏好、演員和導(dǎo)演或者電影的主題等,。因此,,如果將電影的相關(guān)因素向量表示作為聚類模型的輸入,我們可以得到基于用戶實(shí)際打分行為的分類而不是人工的題材分類,。同樣,,我們可以在打分行為的隱式特征空間中用用戶相關(guān)因素表示一個用戶,因此對用戶向量進(jìn)行聚類,,就得到了基于用戶打分行為的聚類結(jié)果,。





1.1 提取電影的題材標(biāo)簽


在進(jìn)一步處理之前,我們先從u.genre文件中提取題材的映射關(guān)系,。根據(jù)之前對數(shù)據(jù)集的輸出結(jié)果來看,,需要將題材的數(shù)字編號映射到可讀的文字版本。查看u.genre開始幾行數(shù)據(jù):

genres = sc.textFile('/Users/youwei.tan/ml-100k/u.genre')
print genres.take(5)

for line in genres.take(5):
    print line


輸出結(jié)果:
[u'unknown|0', u'Action|1', u'Adventure|2', u'Animation|3', u"Children's|4"]
unknown|0
Action|1
Adventure|2
Animation|3
Children's|4

上面輸出的數(shù)字表示相關(guān)題材的索引,,比如0是unknown的索引,。索引對應(yīng)了每部電影關(guān)于題材的特征二值子向量(即前面數(shù)據(jù)中的0和1)。
為了提取題材的映射關(guān)系,,我們對每一行數(shù)據(jù)進(jìn)行分割,,得到具體的<題材,索引>鍵值對,。注意處理過程中需要處理最后的空行,,不然會拋出異常(見代碼中高亮部分):

#為電影題材編碼
genre_map = genres.filter(lambda x: len(x) > 0).                   map(lambda line : line.split('|')).                   map(lambda x:(x[1],x[0])).collectAsMap()
print '構(gòu)造出的電影題材的編碼字典:',genre_map


輸出結(jié)果:
構(gòu)造出的電影題材的編碼字典: {u'11': u'Horror', u'10': u'Film-Noir', u'13': u'Mystery', u'12': u'Musical', u'15': u'Sci-Fi', u'14': u'Romance', u'17': u'War', u'16': u'Thriller', u'18': u'Western', u'1': u'Action', u'0': u'unknown', u'3': u'Animation', u'2': u'Adventure', u'5': u'Comedy', u'4': u"Children's", u'7': u'Documentary', u'6': u'Crime', u'9': u'Fantasy', u'8': u'Drama'}

接下來,我們需要為電影數(shù)據(jù)和題材映射關(guān)系創(chuàng)建新的RDD,,其中包含電影ID,、標(biāo)題和題材。當(dāng)我們用聚類模型評估每個電影的類別時,,可以用生成的RDD得到可讀的輸出,。
接下來的代碼中,我們對每部電影提取相應(yīng)的題材(是Strings形式而不是Int索引),。



提取電影的title和genres:

movies=sc.textFile('/Users/youwei.tan/ml-100k/u.item')
print '電影數(shù)據(jù)集的第一條數(shù)據(jù):',movies.first()

#查看電影的標(biāo)題
movies_title  = movies.map(lambda x: x.split('|')).map(lambda x: x[1])
print '電影標(biāo)題:',movies_title.take(5)

#查看電影的題材, 0表示不屬于該題材, 1表示屬于該題材
movies_genre = movies.map(lambda x: x.split('|')).map(lambda x: x[5:])
print '電影的題材:'
print movies_genre.take(5)


輸出結(jié)果:
電影數(shù)據(jù)集的第一條數(shù)據(jù): 1|Toy Story (1995)|01-Jan-1995||http://us./M/title-exact?Toy%20Story%20(1995)|0|0|0|1|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0
電影標(biāo)題: [u'Toy Story (1995)', u'GoldenEye (1995)', u'Four Rooms (1995)', u'Get Shorty (1995)', u'Copycat (1995)']
電影的題材:
[[u'0', u'0', u'0', u'1', u'1', u'1', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0'], [u'0', u'1', u'1', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'1', u'0', u'0'], [u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'1', u'0', u'0'], [u'0', u'1', u'0', u'0', u'0', u'1', u'0', u'0', u'1', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'0'], [u'0', u'0', u'0', u'0', u'0', u'0', u'1', u'0', u'1', u'0', u'0', u'0', u'0', u'0', u'0', u'0', u'1', u'0', u'0']]


根據(jù)電影的題材編碼字典genre_map,,從上述結(jié)果可以知道,第一部電影屬于Animation,Children's,,Comedy題材.

def func(rdd):
    genres = rdd[5:]     #提取題材特征
    genres_assigned = zip(genres, range(len(genres)))
    index = []           #存儲題材特征數(shù)值為1的特征索引號
    for genre,idx in genres_assigned:
        if genre=='1':
            index.append(idx)
    index_val = [genre_map[str(i)] for i in index]   #根據(jù)編碼字典找出索引的相應(yīng)題材名
    index_val_str = ','.join(index_val)
    return (int(rdd[0]),rdd[1]+','+index_val_str)
titles_and_genres = movies.map(lambda x: x.split('|')).map(lambda x:func(x))
print '前5部電影的標(biāo)題和相應(yīng)的題材類型:',titles_and_genres.take(5)


輸出結(jié)果:
前5部電影的標(biāo)題和相應(yīng)的題材類型: [(1, u"Toy Story (1995),Animation,Children's,Comedy"), (2, u'GoldenEye (1995),Action,Adventure,Thriller'), (3, u'Four Rooms (1995),Thriller'), (4, u'Get Shorty (1995),Action,Comedy,Drama'), (5, u'Copycat (1995),Crime,Drama,Thriller')]




1.2 訓(xùn)練推薦模型



要獲取用戶和電影的因素向量,,首先需要訓(xùn)練一個新的推薦模型。我們在博文  用Spark Python構(gòu)建推薦系統(tǒng)  中做過類似的事情,,因此接下來使用相同的步驟:

from pyspark.mllib.recommendation import ALS
from pyspark.mllib.recommendation import Rating

raw_data = sc.textFile("/Users/youwei.tan/ml-100k/u.data")
#數(shù)據(jù)集u.data中四個字段分別表示用戶ID, 電影ID, 評分, 時間戳
print 'raw data sample:', raw_data.map(lambda x : x.split('\t')).take(3)

raw_ratings = raw_data.map(lambda x:x.split('\t')[:3])
ratings = raw_ratings.map(lambda x: Rating(x[0], x[1], x[2]))
ratings.cache()
print 'rating data sample:',ratings.take(3)

#訓(xùn)練推薦模型
als_model = ALS.train(ratings,50,5,0.1)


輸出結(jié)果
raw data sample: [[u'196', u'242', u'3', u'881250949'], [u'186', u'302', u'3', u'891717742'], [u'22', u'377', u'1', u'878887116']]
rating data sample: [Rating(user=196, product=242, rating=3.0), Rating(user=186, product=302, rating=3.0), Rating(user=22, product=377, rating=1.0)]


from pyspark.mllib.linalg import Vectors

print 'productFeatures的第一條數(shù)據(jù):',als_model.productFeatures().take(1)

movie_factors = als_model.productFeatures().map(lambda (id,factor): (id,Vectors.dense(factor)))
print 'movie_factors的第一條數(shù)據(jù):',movie_factors.first()
movie_vectors = movie_factors.map(lambda (id,vec):vec)

user_factors = als_model.userFeatures().map(lambda (id,factor):(id,Vectors.dense(factor)))
print 'user_factors的第一條數(shù)據(jù):',user_factors.first()
user_vectors = user_factors.map(lambda (id, vec):vec)


輸出結(jié)果:
productFeatures的第一條數(shù)據(jù): [(4, array('d', [-0.25364574790000916, 0.1965579390525818, -0.010804139077663422, 0.18130534887313843, 0.19064882397651672, -0.688933789730072, 0.2703670263290405, 0.2450348287820816, 0.04271795228123665, 0.06376508623361588, -0.10085047781467438, 0.14721041917800903, -0.186862513422966, -0.03862190246582031, 0.22592301666736603, 0.4475729167461395, -0.06261929869651794, -0.33085519075393677, -0.17093169689178467, 0.0065758004784584045, -0.09590368717908859, -0.020839834585785866, -0.33823490142822266, 0.17909930646419525, -0.3050488233566284, 0.017226755619049072, -0.2866823673248291, -0.37014031410217285, 0.2290325164794922, -0.5270513892173767, 0.11399126052856445, -0.16211742162704468, -0.12764166295528412, -0.10635107010602951, -0.11531693488359451, -0.08600226044654846, -0.295471727848053, -0.09224160015583038, 0.07585407048463821, -0.22940267622470856, -0.09108887612819672, -0.37131789326667786, 0.0054631903767585754, -0.3760491907596588, 0.12734010815620422, 0.2783116102218628, 0.5568009614944458, -0.14109675586223602, -0.04276394471526146, 0.08389943838119507]))]
movie_factors的第一條數(shù)據(jù): (4, DenseVector([-0.2536, 0.1966, -0.0108, 0.1813, 0.1906, -0.6889, 0.2704, 0.245, 0.0427, 0.0638, -0.1009, 0.1472, -0.1869, -0.0386, 0.2259, 0.4476, -0.0626, -0.3309, -0.1709, 0.0066, -0.0959, -0.0208, -0.3382, 0.1791, -0.305, 0.0172, -0.2867, -0.3701, 0.229, -0.5271, 0.114, -0.1621, -0.1276, -0.1064, -0.1153, -0.086, -0.2955, -0.0922, 0.0759, -0.2294, -0.0911, -0.3713, 0.0055, -0.376, 0.1273, 0.2783, 0.5568, -0.1411, -0.0428, 0.0839]))
user_factors的第一條數(shù)據(jù): (4, DenseVector([-0.4545, 0.3919, -0.3194, -0.4114, -0.0362, -0.7812, 0.5728, 0.8531, -0.1006, 0.0799, 0.0442, -0.0544, 0.0688, -0.1198, 0.0998, 0.7738, -0.2748, -0.4775, -0.4801, -0.3676, 0.0882, -0.5152, -0.47, 0.7984, -0.158, 0.0298, 0.2694, -0.7995, 0.1633, -0.9575, 0.1051, -0.5222, 0.4569, 0.3014, -0.0691, -0.0043, -1.0819, 0.1802, -0.3621, 0.1659, -0.3126, -0.4778, -0.2319, -0.1191, -0.0486, 0.223, 0.341, -0.7563, -0.1962, -0.3569]))





1.3 歸一化



在訓(xùn)練聚類模型之前,,有必要觀察一下輸入數(shù)據(jù)的相關(guān)因素特征向量的分布,這可以告訴我們是否需要對訓(xùn)練數(shù)據(jù)進(jìn)行歸一化,。具體做法和第5章一樣,,我們使用MLlib中的RowMatrix進(jìn)行各種統(tǒng)計(jì),代碼實(shí)現(xiàn)如下:

from pyspark.mllib.linalg.distributed import RowMatrix

moive_matrix = RowMatrix(movie_vectors)
user_matrix = RowMatrix(user_vectors)

from pyspark.mllib.stat import MultivariateStatisticalSummary
desc_moive_matrix = MultivariateStatisticalSummary(moive_matrix.rows)
desc_user_matrix = MultivariateStatisticalSummary(user_matrix.rows)
print 'Movie factors mean:',desc_moive_matrix.mean()
print 'Movie factors variance:',desc_user_matrix.mean()
print 'User factors mean:',desc_moive_matrix.variance()
print 'User factors variance:',desc_user_matrix.variance()


輸出結(jié)果:
Movie factors mean: [ -2.42438916e-01   1.25892015e-01  -1.01128287e-01   6.81537394e-02
  -4.90188997e-02  -3.84744613e-01   1.92715832e-01   3.00776967e-01
   7.85692380e-03   6.22808723e-02  -1.30065157e-01   1.65411243e-01
  -3.56316963e-02   6.99312749e-03   1.84715494e-01   2.68042047e-01
  -1.23106967e-01  -1.57173516e-01  -1.73252956e-01  -1.67818381e-01
  -8.31478515e-02  -1.85641149e-01  -2.54993702e-01   3.27601579e-01
  -2.13352103e-01  -7.15934799e-02   2.86090419e-04  -3.56040676e-01
   1.19933207e-01  -3.53707917e-01   1.77226424e-01  -1.23331462e-01
   7.33759908e-02  -3.67910947e-02  -7.12374086e-02  -2.09321015e-02
  -4.06088135e-01  -1.06893385e-02   1.01656729e-02  -4.59759580e-02
  -1.32920241e-01  -8.58630392e-02  -5.94274147e-02  -1.37866147e-01
   9.29171377e-02   1.91635158e-02   3.06964813e-01  -1.77468166e-01
  -1.00145879e-01  -1.30844215e-01]
Movie factors variance: [-0.44167016  0.25435563 -0.1727202   0.13731355 -0.06623893 -0.69970225
  0.33315295  0.45628591  0.02300619  0.06396109 -0.23282097  0.24830023
 -0.1042916   0.02167495  0.27280814  0.44542788 -0.22764165 -0.30479719
 -0.33563422 -0.26558353 -0.17754534 -0.29847609 -0.50030339  0.55008739
 -0.36819538 -0.15328011 -0.02316416 -0.61410146  0.22868754 -0.61511877
  0.34477867 -0.25042202  0.15898724 -0.00547614 -0.10669204 -0.01282096
 -0.69631875  0.0220296   0.0087616  -0.0980786  -0.28781575 -0.11271467
 -0.08193858 -0.31459483  0.14087784  0.0606273   0.52389416 -0.34927602
 -0.1358626  -0.2620565 ]
User factors mean: [ 0.02123215  0.04154274  0.02419521  0.02631427  0.03025208  0.03693836
  0.02973717  0.02724385  0.03341776  0.02623281  0.03691471  0.02950037
  0.04198097  0.02823345  0.02335817  0.03085507  0.03495941  0.03404106
  0.02343747  0.03185638  0.0229145   0.02562004  0.02714542  0.02722446
  0.03443216  0.02616262  0.02865667  0.02888377  0.02322707  0.04355441
  0.05698518  0.03019456  0.03062282  0.02753087  0.03353758  0.02110459
  0.03247938  0.03605873  0.02572534  0.03752665  0.03782459  0.0260555
  0.03343828  0.02744762  0.02572257  0.02936925  0.0325904   0.02638102
  0.02341373  0.03448836]
User factors variance: [ 0.03036875  0.0540869   0.02849067  0.03537828  0.03111662  0.03866784
  0.03417626  0.03567199  0.05292328  0.0367134   0.04849576  0.03611785
  0.04584948  0.03788201  0.03320176  0.03600616  0.04439234  0.036413
  0.02882943  0.03115991  0.03443816  0.03650265  0.03431651  0.04108162
  0.03814361  0.02883841  0.03880702  0.03916495  0.03114326  0.04674307
  0.07481666  0.03203164  0.04224502  0.03617045  0.04427324  0.03279789
  0.03442555  0.04636376  0.03548539  0.04429447  0.03160161  0.03143084
  0.04056352  0.03459579  0.03164808  0.03531451  0.03728178  0.02570473
  0.02921107  0.04301201]

從結(jié)果來看,,沒有發(fā)現(xiàn)特別的離群點(diǎn)會影響聚類結(jié)果,,因此本例中沒有必要進(jìn)行歸一化。




2 訓(xùn)練聚類模型



在MLlib中訓(xùn)練K-均值的方法和其他模型類似,,只要把包含訓(xùn)練數(shù)據(jù)的RDD傳入KMeans對象的train方法即可。注意,,因?yàn)榫垲惒恍枰獦?biāo)簽,,所以不用LabeledPoint實(shí)例,而是使用特征向量接口,,即RDD的Vector數(shù)組即可,。

用MovieLens數(shù)據(jù)集訓(xùn)練聚類模型

MLlib的K-均值提供了隨機(jī)和K-means||兩種初始化方法,后者是默認(rèn)初始化,。因?yàn)閮煞N方法都是隨機(jī)選擇,,所以每次模型訓(xùn)練的結(jié)果都不一樣。
K-均值通常不能收斂到全局最優(yōu)解,,所以實(shí)際應(yīng)用中需要多次訓(xùn)練并選擇最優(yōu)的模型,。MLlib提供了完成多次模型訓(xùn)練的方法。經(jīng)過損失函數(shù)的評估,,將性能最好的一次訓(xùn)練選定為最終的模型,。

from pyspark.mllib.clustering import KMeans
num_clusters = 5
num_iterations = 20
num_runs =3
movie_cluster_model = KMeans.train(movie_vectors,num_clusters, num_iterations, num_runs)
movie_cluster_model_coverged = KMeans.train(movie_vectors,num_clusters,100)
user_cluster_model = KMeans.train(user_vectors,num_clusters,num_iterations, num_runs)
predictions = movie_cluster_model.predict(movie_vectors)
print '對前十個樣本的預(yù)測標(biāo)簽為:'+",".join([str(i) for i in predictions.take(10)])


輸出結(jié)果:
對前十個樣本的預(yù)測標(biāo)簽為:4,4,4,3,4,3,1,3,0,2


print 'movie_factors的第一條數(shù)據(jù):',movie_factors.first()
print '========================'
print 'titles_and_genres的第一條數(shù)據(jù):',titles_and_genres.first()

titles_factors = titles_and_genres.join(movie_factors)
print '========================'
print 'titles_factors的第一條數(shù)據(jù):',titles_factors.first()


輸出結(jié)果:
movie_factors的第一條數(shù)據(jù): (4, DenseVector([-0.2536, 0.1966, -0.0108, 0.1813, 0.1906, -0.6889, 0.2704, 0.245, 0.0427, 0.0638, -0.1009, 0.1472, -0.1869, -0.0386, 0.2259, 0.4476, -0.0626, -0.3309, -0.1709, 0.0066, -0.0959, -0.0208, -0.3382, 0.1791, -0.305, 0.0172, -0.2867, -0.3701, 0.229, -0.5271, 0.114, -0.1621, -0.1276, -0.1064, -0.1153, -0.086, -0.2955, -0.0922, 0.0759, -0.2294, -0.0911, -0.3713, 0.0055, -0.376, 0.1273, 0.2783, 0.5568, -0.1411, -0.0428, 0.0839]))
========================
titles_and_genres的第一條數(shù)據(jù): (1, u"Toy Story (1995),Animation,Children's,Comedy")
========================
titles_factors的第一條數(shù)據(jù): (1536, (u'Aiqing wansui (1994),Drama', DenseVector([-0.2953, -0.2653, -0.0394, 0.1022, -0.0061, -0.8327, 0.2372, 0.4489, -0.0279, 0.2955, -0.086, 0.2009, -0.1806, -0.0905, 0.1349, 0.4077, -0.1397, -0.4622, -0.2987, -0.4978, -0.0521, -0.3738, -0.2074, 0.3197, -0.5649, -0.0483, 0.0624, -0.1967, 0.1172, -0.3913, -0.3867, -0.0565, -0.131, -0.1507, -0.1108, 0.1695, -0.4871, 0.0319, 0.2411, -0.3772, -0.2846, -0.1636, -0.3747, -0.0247, -0.1281, -0.0738, 0.2859, -0.1743, -0.1477, 0.0836])))




#對每個電影計(jì)算其特征向量與類簇中心向量的距離
def func2(rdd):
    id,(name_genres,vec) = rdd
    pred = movie_cluster_model.predict(vec)
    cluster_center = movie_cluster_model.clusterCenters[pred]
    cluster_center_vec = Vectors.dense(cluster_center)
    dist = vec.squared_distance(cluster_center_vec)
    return u'電影' + str(id) + u'的題材類型是' + name_genres + ',' + u'聚類模型預(yù)測的標(biāo)簽是' + str(pred)+ ',' +            u'與聚類所屬類別中心的距離是' + str(dist)

movies_assigned = titles_factors.map(lambda x:func2(x))  
for i in movies_assigned.take(5):
    print i


輸出結(jié)果:
電影1536的題材類型是Aiqing wansui (1994),Drama,聚類模型預(yù)測的標(biāo)簽是4,與聚類所屬類別中心的距離是1.2383822505
電影1026的題材類型是Lay of the Land, The (1997),Comedy,Drama,聚類模型預(yù)測的標(biāo)簽是2,與聚類所屬類別中心的距離是1.35769832103
電影516的題材類型是Local Hero (1983),Comedy,聚類模型預(yù)測的標(biāo)簽是4,與聚類所屬類別中心的距離是1.43910597622
電影6的題材類型是Shanghai Triad (Yao a yao yao dao waipo qiao) (1995),Drama,聚類模型預(yù)測的標(biāo)簽是4,與聚類所屬類別中心的距離是2.39286392316
電影1032的題材類型是Little Big League (1994),Children's,Comedy,聚類模型預(yù)測的標(biāo)簽是2,與聚類所屬類別中心的距離是1.15536400768






3 評估聚類模型的性能



3.1 內(nèi)部評價指標(biāo)


通用的內(nèi)部評價指標(biāo)包括WCSS(我們之前提過的K-元件的目標(biāo)函數(shù))、Davies-Bouldin指數(shù),、Dunn指數(shù)和輪廓系數(shù)(silhouette coefficient),。所有這些度量指標(biāo)都是使類簇內(nèi)部的樣本距離盡可能接近,不同類簇的樣本相對較遠(yuǎn),。




3.2 外部評價指標(biāo)


因?yàn)榫垲惐徽J(rèn)為是無監(jiān)督分類,,如果有一些帶標(biāo)注的數(shù)據(jù),便可以用這些標(biāo)簽來評估聚類模型,??梢允褂镁垲惸P皖A(yù)測類簇(類標(biāo)簽),使用分類模型中類似的方法評估預(yù)測值和真實(shí)標(biāo)簽的誤差(即真假陽性率和真假陰性率),。
具體方法包括Rand measure,、F-measure,、雅卡爾系數(shù)(Jaccard index)等。




3.3 在MovieLens數(shù)據(jù)集計(jì)算性能


movie_cost = movie_cluster_model.computeCost(movie_vectors)
user_cost = user_cluster_model.computeCost(user_vectors)
print "WCSS for movies: %f"%movie_cost
print "WCSS for users: %f"%user_cost


輸出結(jié)果:
WCSS for movies: 2131.824110
WCSS for users: 1487.797814




4 聚類模型參數(shù)調(diào)優(yōu)


不同于以往的模型,,K-均值模型只有一個可以調(diào)的參數(shù),,就是K,即類中心數(shù)目,。通過交叉驗(yàn)證選擇K
類似分類和回歸模型,,我們可以應(yīng)用交叉驗(yàn)證來選擇模型最優(yōu)的類中心數(shù)目。這和監(jiān)督學(xué)習(xí)的過程一樣,。需要將數(shù)據(jù)集分割為訓(xùn)練集和測試集,,然后在訓(xùn)練集上訓(xùn)練模型,在測試集上評估感興趣的指標(biāo)的性能,。如下代碼用60/40劃分得到訓(xùn)練集和測試集,,并使用MLlib內(nèi)置的WCSS類方法評估聚類模型的性能:

train_test_split_movies = movie_vectors.randomSplit([0.6,0.4],123)
train_movies = train_test_split_movies[0]
test_movies = train_test_split_movies[1]
for k in [2,3,4,5,10,20]:
    k_model = KMeans.train(train_movies, num_iterations, k, num_runs)
    cost = k_model.computeCost(test_movies)
    print 'WCSS for k=%d : %f'%(k,cost)


輸出結(jié)果:
WCSS for k=2 : 766.646663
WCSS for k=3 : 769.816755
WCSS for k=4 : 770.081729
WCSS for k=5 : 763.681320
WCSS for k=10 : 761.307839
WCSS for k=20 : 760.734158

從結(jié)果可以看出,隨著類中心數(shù)目增加,,WCSS值會出現(xiàn)下降,,然后又開始增大。另外一個現(xiàn)象,,K-均值在交叉驗(yàn)證的情況,,WCSS隨著K的增大持續(xù)減小,但是達(dá)到某個值后,,下降的速率突然會變得很平緩,。這時的K通常為最優(yōu)的K值(這稱為拐點(diǎn))。根據(jù)預(yù)測結(jié)果,,我們選擇最優(yōu)的K=10,。需要說明是,模型計(jì)算的類簇需要人工解釋(比如前面提到的電影或者顧客聚類的例子),,并且會影響K的選擇,。盡管較大的K值從數(shù)學(xué)的角度可以得到更優(yōu)的解,但是類簇太多就會變得難以理解和解釋,。為了實(shí)驗(yàn)的完整性,,我們還計(jì)算了用戶聚類在交叉驗(yàn)證下的性能:

train_test_split_movies = user_vectors.randomSplit([0.6,0.4],123)
train_users = train_test_split_movies[0]
test_users = train_test_split_movies[1]
for k in [2,3,4,5,10,20]:
    k_model = KMeans.train(train_users,num_iterations,k,num_runs)
    cost = k_model.computeCost(test_users)
    print 'WCSS for k=%d : %f'%(k,cost)


輸出結(jié)果:
WCSS for k=2 : 569.221509
WCSS for k=3 : 569.650019
WCSS for k=4 : 558.117543
WCSS for k=5 : 568.013497
WCSS for k=10 : 560.014328
WCSS for k=20 : 567.601320



5 小結(jié)


本文中,我們研究了一種新的模型,, 它可以在無標(biāo)注數(shù)據(jù)中進(jìn)行學(xué)習(xí),,即無監(jiān)督學(xué)習(xí)。我們學(xué)習(xí)了如何處理需要的輸入數(shù)據(jù),、特征提取,,以及如何將一個模型(我們用的是推薦模型)的輸出作為另外一個模型(K-均值聚類模型)的輸入。最后,我們評估聚類模型的性能時,,不僅進(jìn)行了類簇人工解釋,,也使用具體的數(shù)學(xué)方法進(jìn)行性能度量。

下一篇博文,,我們將討論其他類型的無監(jiān)督學(xué)習(xí),,在數(shù)據(jù)中選擇保留最重要的特征或者應(yīng)用其他降維模型。






peaki
  • peaki

    2016-09-22 14:302樓
  • 深入淺出Spark機(jī)器學(xué)習(xí)實(shí)戰(zhàn)(用戶行為分析)
    課程觀看地址:http://www./course/144
    課程出自學(xué)途無憂網(wǎng):http://www.


    一,、課程目標(biāo)
    熟練掌握SparkSQL的各種操作,,深入了解Spark內(nèi)部實(shí)現(xiàn)原理
    深入了解SparkML機(jī)器學(xué)習(xí)各種算法模型的構(gòu)建和運(yùn)行
    熟練Spark的API并能靈活運(yùn)用
    能掌握Spark在工作當(dāng)中的運(yùn)用

    二、適合人群
    適合給,,有java,,scala基礎(chǔ),想往大數(shù)據(jù)spark機(jī)器學(xué)習(xí)這塊發(fā)展
    適合給想學(xué)習(xí)spark,,往數(shù)據(jù)倉庫,,大數(shù)據(jù)挖掘機(jī)器學(xué)習(xí),方向發(fā)展的學(xué)員

    三,、課程用到的軟件及版本:
    Spark2.0,,Spark1.6.2,STS,,maven,Linux Centos6.5,,mysql,,mongodb3.2


    四、課程目錄:

    課時1:Spark介紹
    課時2:Spark2集群安裝 
    課時3:Spark RDD操作 
    課時4:SparkRDD原理剖析
    課時5:Spark2sql從mysql中導(dǎo)入 
    課時6:Spark1.6.2sql與mysql數(shù)據(jù)交互
    課時7:SparkSQL java操作mysql數(shù)據(jù)
    課時8:Spark統(tǒng)計(jì)用戶的收藏轉(zhuǎn)換率 
    課時9:Spark梳理用戶的收藏以及訂單轉(zhuǎn)換率
    課時10:最終獲取用戶的收藏以及訂單轉(zhuǎn)換率 
    課時11:Spark Pipeline構(gòu)建隨機(jī)森林回歸預(yù)測模型 
    課時12:Spark 隨機(jī)森林回歸預(yù)測結(jié)果并存儲進(jìn)mysql 
    課時13:Spark對收藏轉(zhuǎn)預(yù)測換率與真正的轉(zhuǎn)換率對比,,以及決策樹模型構(gòu)建
    課時14:Spark機(jī)器學(xué)習(xí)對各種監(jiān)督與非監(jiān)督分類學(xué)習(xí)詳細(xì)介紹 
    課時15:Spark協(xié)同過濾算法,,構(gòu)建用戶與產(chǎn)品模型 
    課時16:Spark協(xié)同算法完成給用戶推薦產(chǎn)品
    課時17:mongodb的安裝以及其基本操作 
    課時18:Spark與mongodb整合 
    課時19:Spark預(yù)測收藏以及給用戶推薦的產(chǎn)品存儲進(jìn)mongodb 
    課時20:操作RDD需要注意點(diǎn),以及Spark內(nèi)存分配資源調(diào)優(yōu)
    課時21:Spark整個學(xué)習(xí)過程及其總結(jié)



    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多