接上篇
2.2.3準備資料:歸一化數值
由於數值較大的值會產生較大的影響,所以需要歸一化,公式如下:
newvalue=(oldvalue-min)/(max-min)
歸一化函式如下
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))
return normdataset,ranges,minvals
在互動式介面
>>> from numpy import *
>>> import knn
>>> datingdatamat,datinglabels=knn.file2matrix('datingtestset2.txt')
>>> normmat,ranges,minvals=knn.autonorm(datingdatamat)
>>> normmat
2.2.4測試演算法:作為完整程式驗證分類器
用已有資料的90%作為訓練樣本,剩餘10%去測試分類器,檢驗分類器的正確率。10%的樣本是隨機選擇的。
def datingclasstest():
horatio=0.10
datingdatamat,datinglabels=file2matrix('datingtestset2.txt')
normmat,ranges,minvals=autonorm(datingdatamat)
m=normmat.shape[0]
numtestvecs=int(m*horatio)
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)))
測試函式如上,其中遇到了兩個問題,一是我用的python3,所以print()要加括號,否則會報錯;二是
2.2.5 使用演算法:構建完整可用系統
def classifyperson():
resultlist=['not at all','in small doses','in large doses']
percenttats=float(input("percentage of time spent playing vedio games?"))
ffmiles=float(input("frequent filer miles earns per year?"))
icecream=float(input("liters of ice cream consumed per year?"))
datingdatamat,datinglabels=file2matrix('datingtestset2.txt')
normmat,ranges,minvals=autonorm(datingdatamat)
inarr=array([ffmiles,percenttats,icecream])
classifierresult=classify0((inarr-minvals)/ranges,normmat,datinglabels,3)
print("you will probably like the person:%s"%resultlist[classifierresult-1])
還是要注意print(),python3把raw_input()改為了input()
約會內容到此結束了~
2.3示例:手寫識別系統
步驟:2.準備資料:編寫函式classify0(),將影象格式轉化為分類器使用的list格式。
3.分析資料:在python命令提示符中檢查資料,確保它符合要求。
4.訓練演算法:此步驟不適用於k近鄰演算法。
5.測試演算法:編寫函式使用提供的部分資料集作為測試樣本,測試樣本與非測試樣本的區別在於測試樣本是已經完成分類的資料,如果**分類與實際類別不同,則標記為乙個錯誤。
6.使用演算法:本例沒有完成此步驟。
2.3.1準備資料:將影象轉化為測試向量
def img2vector(filename):
returnvect=zeros((1,1024))
fr=open(filename)
for i in range(32):
linestr=fr.readline()
for j in range(32):
returnvect[0,32*i+j]=int(linestr[j])
return returnvect
2.3.2測試演算法:使用k近鄰演算法識別手寫數字
def handwritingclasstest():
hwlabels=
trainingfilelist=listdir('trainingdigits')
m=len(trainingfilelist)
trainingmat=zeros((m,1024))
for i in range(m):
filenamestr=trainingfilelist[i]
filestr=filenamestr.split('.')[0]
classnumstr=int(filestr.split('_')[0])
trainingmat[i,:]=img2vector('trainingdigits/%s' %filenamestr)
testfilelist=listdir('testdigits')
errorcount=0.0
mtest=len(testfilelist)
for i in range(mtest):
filenamestr=testfilelist[i]
filestr=filenamestr.split('.')[0]
classnumstr=int(filestr.split('_')[0])
vectorundertest=img2vector('testdigits/%s' %filenamestr)
classifierresult=classify0(vectorundertest,trainingmat,hwlabels,3)
print("the classifier came back with:%d,the real answer is: %d"%(classifierresult,classnumstr))
if (classifierresult!=classnumstr):
errorcount+=1.0
print("\nthe total number of error rate is %f" %(errorcount/float(mtest)))
2.4本章小結
介紹了k近鄰演算法,並給出了兩個示例。
機器學習實戰讀書筆記(三)
從本節開始,將介紹無監督學習。今天整理了無監督學習中的k均值聚類演算法和mapreduce部分的內容。本部分是8月24號的內容。9.k均值聚類演算法 1 k均值聚類演算法 優點 易於實現。缺點 可能收斂到區域性最小值,在大規模的資料集上的收斂速度慢。適用資料型別 數值型。可以用的誤差指標如誤差的平方...
機器學習實戰筆記
在 機器學習實戰 的決策樹的儲存這方面內容學習過程中,進行 除錯時遇到以下兩個錯誤 1 typeerror write argument must be str,not bytes 2 unicodedecodeerror gbk codec can t decode byte 0x80 in po...
《機器學習實戰》學習筆記
很久沒寫過部落格了,一重開就給自己挖了這麼乙個大坑 最近一段時間看了 機器學習實戰 這本書,感覺寫得不錯,認真看了看。關於這本書的書評及購買事宜請移步豆瓣 京東 亞馬遜等 這裡不多說。不過有一點,感覺這本書有個很好的地方是給出了各個演算法的python實現 和講解,要求不高的話可以拿來用了 懶 在這...