国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

[Python]應(yīng)用kNN算法預(yù)測(cè)豆瓣電影用戶(hù)的性別

2019-11-14 16:58:38
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

應(yīng)用kNN算法預(yù)測(cè)豆瓣電影用戶(hù)的性別

摘要

本文認(rèn)為不同性別的人偏好的電影類(lèi)型會(huì)有所不同,因此進(jìn)行了此實(shí)驗(yàn)。利用較為活躍的274位豆瓣用戶(hù)最近觀看的100部電影,對(duì)其類(lèi)型進(jìn)行統(tǒng)計(jì),以得到的37種電影類(lèi)型作為屬性特征,以用戶(hù)性別作為標(biāo)簽構(gòu)建樣本集。使用kNN算法構(gòu)建豆瓣電影用戶(hù)性別分類(lèi)器,使用樣本中的90%作為訓(xùn)練樣本,10%作為測(cè)試樣本,準(zhǔn)確率可以達(dá)到81.48%。

實(shí)驗(yàn)數(shù)據(jù)

本次實(shí)驗(yàn)所用數(shù)據(jù)為豆瓣用戶(hù)標(biāo)記的看過(guò)的電影,選取了274位豆瓣用戶(hù)最近看過(guò)的100部電影。對(duì)每個(gè)用戶(hù)的電影類(lèi)型進(jìn)行統(tǒng)計(jì)。本次實(shí)驗(yàn)所用數(shù)據(jù)中共有37個(gè)電影類(lèi)型,因此將這37個(gè)類(lèi)型作為用戶(hù)的屬性特征,各特征的值即為用戶(hù)100部電影中該類(lèi)型電影的數(shù)量。用戶(hù)的標(biāo)簽為其性別,由于豆瓣沒(méi)有用戶(hù)性別信息,因此均為人工標(biāo)注。

數(shù)據(jù)格式如下所示:
X1,1,X1,2,X1,3,X1,4……X1,36,X1,37,Y1
X2,1,X2,2,X2,3,X2,4……X2,36,X2,37,Y2
…………
X274,1,X274,2,X274,3,X274,4……X274,36,X274,37,Y274

示例:
0,0,0,3,1,34,5,0,0,0,11,31,0,0,38,40,0,0,15,8,3,9,14,2,3,0,4,1,1,15,0,0,1,13,0,0,1,1 0,1,0,2,2,24,8,0,0,0,10,37,0,0,44,34,0,0,3,0,4,10,15,5,3,0,0,7,2,13,0,0,2,12,0,0,0,0

像這樣的數(shù)據(jù)一共有274行,表示274個(gè)樣本。每一個(gè)的前37個(gè)數(shù)據(jù)是該樣本的37個(gè)特征值,最后一個(gè)數(shù)據(jù)為標(biāo)簽,即性別:0表示男性,1表示女性。

kNN算法

k-近鄰算法(KNN),是最基本的分類(lèi)算法,其基本思想是采用測(cè)量不同特征值之間的距離方法進(jìn)行分類(lèi)。

算法原理:存在一個(gè)樣本數(shù)據(jù)集合(訓(xùn)練集),并且樣本集中每個(gè)數(shù)據(jù)都存在標(biāo)簽(即每一數(shù)據(jù)與所屬分類(lèi)的關(guān)系已知)。輸入沒(méi)有標(biāo)簽的新數(shù)據(jù)后,將新數(shù)據(jù)的每個(gè)特征與樣本集中數(shù)據(jù)對(duì)應(yīng)的特征進(jìn)行比較(計(jì)算歐氏距離),然后提取樣本集中特征最相似數(shù)據(jù)(最近鄰)的分類(lèi)標(biāo)簽。一般會(huì)取前k個(gè)最相似的數(shù)據(jù),然后取k個(gè)最相似數(shù)據(jù)中出現(xiàn)次數(shù)最多的標(biāo)簽(分類(lèi))最后新數(shù)據(jù)的分類(lèi)。

在此次試驗(yàn)中取樣本的前10%作為測(cè)試樣本,其余作為訓(xùn)練樣本。

首先對(duì)所有數(shù)據(jù)歸一化。對(duì)矩陣中的每一列求取最大值(max_j)、最小值(min_j),對(duì)矩陣中的數(shù)據(jù)X_j,
X_j=(X_j-min_j)/(max_j-min_j) 。

然后對(duì)于每一條測(cè)試樣本,計(jì)算其與所有訓(xùn)練樣本的歐氏距離。測(cè)試樣本i與訓(xùn)練樣本j之間的距離為:
distance_i_j=sqrt((Xi,1-Xj,1)^2+(Xi,2-Xj,2)^2+……+(Xi,37-Xj,37)^2) ,
對(duì)樣本i的所有距離從小到大排序,在前k個(gè)中選擇出現(xiàn)次數(shù)最多的標(biāo)簽,即為樣本i的預(yù)測(cè)值。

實(shí)驗(yàn)結(jié)果

首先選擇一個(gè)合適的k值。 對(duì)于k=1,3,5,7,均使用同一個(gè)測(cè)試樣本和訓(xùn)練樣本,測(cè)試其正確率,結(jié)果如下表所示。

表1 選取不同k值的正確率表

k1357
測(cè)試集162.96%81.48%70.37%77.78%
測(cè)試集266.67%66.67%59.26%62.96%
測(cè)試集362.96%74.07%70.37%74.07%
平均值64.20%74.07%66.67%71.60%

由上述結(jié)果可知,在k=3時(shí),測(cè)試的平均正確率最高,為74.07%,最高可以達(dá)到81.48%。

上述不同的測(cè)試集均來(lái)自同一樣本集中,為隨機(jī)選取所得。

Python代碼

這段代碼并非原創(chuàng),來(lái)自《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》(Peter Harrington,2013),并有所改動(dòng)。

#coding:utf-8from numpy import *import Operatordef classify0(inX, dataSet, labels, k):    dataSetSize = dataSet.shape[0]    diffMat = tile(inX, (dataSetSize,1)) - dataSet    sqDiffMat = diffMat**2    sqDistances = sqDiffMat.sum(axis=1)    distances = sqDistances**0.5    sortedDistIndicies = distances.argsort()         classCount={}              for i in range(k):        voteIlabel = labels[sortedDistIndicies[i]]        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)    return sortedClassCount[0][0]def autoNorm(dataSet):    minVals = dataSet.min(0)    maxVals = dataSet.max(0)    ranges = maxVals - minVals    normDataSet = zeros(shape(dataSet))    m = dataSet.shape[0]    normDataSet = dataSet - tile(minVals, (m,1))    normDataSet = normDataSet/tile(ranges, (m,1))   #element wise divide    return normDataSet, ranges, minValsdef file2matrix(filename):    fr = open(filename)    numberOfLines = len(fr.readlines())         #get the number of lines in the file    returnMat = zeros((numberOfLines,37))       #PRepare matrix to return    classLabelVector = []                       #prepare labels return       fr = open(filename)    index = 0    for line in fr.readlines():        line = line.strip()        listFromLine = line.split(',')        returnMat[index,:] = listFromLine[0:37]        classLabelVector.append(int(listFromLine[-1]))        index += 1    fr.close()    return returnMat,classLabelVectordef genderClassTest():    hoRatio = 0.10      #hold out 10%    datingDataMat,datingLabels = file2matrix('doubanMovieDataSet.txt')       #load data setfrom file    normMat,ranges,minVals=autoNorm(datingDataMat)    m = normMat.shape[0]    numTestVecs = int(m*hoRatio)    testMat=normMat[0:numTestVecs,:]    trainMat=normMat[numTestVecs:m,:]    trainLabels=datingLabels[numTestVecs:m]    k=3    errorCount = 0.0    for i in range(numTestVecs):        classifierResult = classify0(testMat[i,:],trainMat,trainLabels,k)        print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i])        if (classifierResult != datingLabels[i]):            errorCount += 1.0    print "Total errors:%d" %errorCount    print "The total accuracy rate is %f" %(1.0-errorCount/float(numTestVecs))

 

參考文獻(xiàn)

(美)Peter Harrington;李銳,李鵬,曲亞?wèn)|,王斌譯者. 機(jī)器學(xué)習(xí)實(shí)戰(zhàn). 北京:人民郵電出版社, 2013.06.


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 洛阳市| 东方市| 大冶市| 易门县| 抚松县| 庐江县| 盐边县| 常山县| 盐边县| 广宗县| 祥云县| 建平县| 武定县| 鄂尔多斯市| 张家口市| 漠河县| 罗田县| 浪卡子县| 澎湖县| 耿马| 满城县| 永德县| 安西县| 中宁县| 犍为县| 台前县| 卓资县| 大竹县| 石林| 化州市| 廊坊市| 三亚市| 黔西县| 班玛县| 公主岭市| 八宿县| 安吉县| 绩溪县| 柞水县| 独山县| 北京市|