問題描述:一姑娘相親無數,并且給相親對象進行了評分123分別表示很喜歡的,一般般的和不喜歡的,這里也給出了被約過的1000位男士的個人信息包括飛行里數,玩游戲視頻所耗時間比,和每周消費的冰激凌公升數。要求建立一個分類器使得一個新的男士出現時能以最大概率進行分類。這里我們用KNN算法。
所給txt文檔有1000行,大概長這樣:
40920 8.326976 0.953952 314488 7.153469 1.673904 226052 1.441871 0.805124 175136 13.147394 0.428964 138344 1.669788 0.134296 1
...
先上代碼:
def file2matrix(filename): fr = open(filename) numberOfLines = len(fr.readlines()) #get the number of lines in the file returnMat = zeros((numberOfLines,3)) #PRepare matrix to return classLabelVector = [] #prepare labels return fr = open(filename) index = 0#確保指針在最前面 for line in fr.readlines(): line = line.strip()#移除首尾空格,回車字符 listFromLine = line.split('/t')#每一行以空格為劃分符分割成若干元素 returnMat[index,:] = listFromLine[0:3]#取分割出來的前三個 classLabelVector.append(int(listFromLine[-1]))#取分割出來的最后已個作為類 index += 1 return returnMat,classLabelVector我們最后將原數據的特征均放在returnMat中,對應類放在classLabelVector中。注1:strip(‘chars’)的功能是移除收尾指定字符。如
str = "0000000this is string example....wow!!!0000000"str.strip('0')Out[11]: 'this is string example....wow!!!'如果str.strip()則表示移除首尾空格。注2:同樣,后續使用時要時要將內參變為外參
datingDataMat,datingLabels=file2matrix('文件名.txt')后面會加
二、分析數據
畫圖
import matplotlibimport matplotlib.pyplot as pltfig=plt.figure()ax=fig.add_subplot(111)ax.scatter(returnMat[:,1],returnMat[:,2],15.0*array(datingLabels),15.0*array(datingLabels))plt.show即以數據中第二列第三列為坐標,datingLabels為顏色和大小標記標準
我們換第一列和第二列為坐標看看。即換成
ax.scatter(returnMat[:,0],returnMat[:,1],15.0*array(datingLabels),15.0*array(datingLabels))分類得很清楚,于是我們決定就用第一列和第二列了。
三、數值歸一化
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)) #差再除以max-min return normDataSet, ranges, minVals注1:min(0)是計算每列的最小值,min(1)的話是計算每行的最小值注2:這里的/就是除法,不是矩陣除法,矩陣除法的話要linalg.solve(matA,matB)
注3:同樣,內參變外參
normMat,range.minVals=autoNorm(datingDataMat)后面會加四、測試算法
def datingClassTest(): hoRatio = 0.10 #hold out 10% datingDataMat,datingLabels = file2matrix('datingTestSet2.txt') #load data setfrom file normMat, ranges, minVals = autoNorm(datingDataMat) m = normMat.shape[0]#行數 numTestVecs = int(m*hoRatio)#取出10%的數據作為測試集 errorCount = 0.0#錯誤率 for i in range(numTestVecs):#對測試集操作 classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)#上篇文章中描述的分類功能直接代入 print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]) if (classifierResult != datingLabels[i]): errorCount += 1.0 print "the total error rate is: %f" % (errorCount/float(numTestVecs)) print errorCount注1:classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)這行使用的是上一篇定義的功能,應該為classify0(測試集,特征集,類,k值),一般來說9:1分要隨機,但這里本身給的順序就是隨機的,所以我們可以把1:100行作為測試集,101:1000行作為訓練集。我們可以調節hoRatio來影響最后的錯誤率,最后我們選一個使錯誤率最低的比例估摸大概就是我們最終測試新數據可能會犯錯的可能性。五、使用算法
推廣:電影推薦系統如何自動推薦你可能感興趣的電影?按同樣思路,可以把每部電影中含有的喜劇元素,動作元素,恐怖元素百分比等作為特征向量,但是這些數據又該如何得到,加入我們知道一群人分別很喜歡喜劇電影,動作電影,恐怖電影,并且知道他們給不同電影的評分,這樣就可以推算出每部電影的不同元素百分比。
同樣,可以根據用戶今天或者上周在淘寶上的新增收藏數,加入購物車數,以及瀏覽時間等判斷明天是否會下單疑問
def classifyperson():resultList=['dislike','just so so','very like']percentTats=float(raw_input("percentage of time spent playing video games?"))ffMiles=float(raw_input("frenquent flier miles earned per year?"))icecream=float(raw_input("liters of ice cream consumed per year?"))datingDataMat,datingLabels = file2matrix('datingTestSet2.txt') #load data setfrom filenormMat, ranges, minVals = autoNorm(datingDataMat)#不重新寫一遍就是內參了inArr=array([ffMiles,percentTats,icecream])#合成classifierRusult=classify0(inArr-minVals/ranges,normMat,datingLabels,3)print "reulitList[classifierRusult-1]"
新聞熱點
疑難解答