Python實(shí)現(xiàn)的knn算法示例
本文實(shí)例講述了Python實(shí)現(xiàn)的knn算法。分享給大家供大家參考,具體如下:
代碼參考機(jī)器學(xué)習(xí)實(shí)戰(zhàn)那本書:
機(jī)器學(xué)習(xí)實(shí)戰(zhàn) (Peter Harrington著) 中文版
機(jī)器學(xué)習(xí)實(shí)戰(zhàn) (Peter Harrington著) 英文原版[附源代碼]
有興趣你們可以去了解下
具體代碼:
# -*- coding:utf-8 -*-
#! python2
'''''
@author:zhoumeixu
createdate:2015年8月27日
'''
#np.zeros((4,2))
#np.zeros(8).reshape(4,2)
#x=np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) np.zeros_like(x)
# 最值和排序:最值有np.max(),np.min() 他們都有axis和out(輸出)參數(shù),
# 而通過(guò)np.argmax(), np.argmin()可以得到取得最大或最小值時(shí)的 下標(biāo)。
# 排序通過(guò)np.sort(), 而np.argsort()得到的是排序后的數(shù)據(jù)原來(lái)位置的下標(biāo)
# 簡(jiǎn)單實(shí)現(xiàn)knn算法的基本思路
import numpy as np
import operator #運(yùn)算符操作包
from _ctypes import Array
from statsmodels.sandbox.regression.kernridgeregress_class import plt_closeall
def createDataSet():
group=np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels=['A','A','B','B']
return group ,labels
group,labels=createDataSet()
def classify0(inx,dataSet,labels,k):
dataSetSize=dataSet.shape[0]
diffMat=np.tile(inx,(dataSetSize,1))-dataSet
sqDiffMat=diffMat**2
sqDistances=sqDiffMat.sum(axis=1)
distances=sqDistances**0.5 #計(jì)算距離 python中會(huì)自動(dòng)廣播的形式
sortedDistIndicies=distances.argsort() #排序,得到原來(lái)數(shù)據(jù)的在原來(lái)所在的下標(biāo)
classCount={}
for i in range(k):
voteIlabel=labels[sortedDistIndicies[i]] # 計(jì)算距離最近的值所在label標(biāo)簽
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 # 計(jì)算距離最近的值所在label標(biāo)簽,對(duì)前k哥最近數(shù)據(jù)進(jìn)行累加
sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True) #排序得到距離k個(gè)最近的數(shù)所在的標(biāo)簽
return sortedClassCount[0][0]
if __name__=='__main__':
print(classify0([0,0],group,labels,4))
# 利用knn算法改進(jìn)約會(huì)網(wǎng)站的配對(duì)效果
def file2matrix(filename):
fr=open(filename)
arrayOLines=fr.readlines()
numberOfLines=len(arrayOLines)
returnMat=np.zeros((numberOfLines,3))
classLabelVector=[]
index=0
for line in arrayOLines:
line=line.strip()
listFromLine=line.split('\t')
returnMat[index,:]=listFromLine[0:3]
classLabelVector.append(int(listFromLine[-1]))
index+=1
return returnMat ,classLabelVector #生成訓(xùn)練數(shù)據(jù)的array和目標(biāo)array
path=u'D:\\Users\\zhoumeixu204\\Desktop\\python語(yǔ)言機(jī)器學(xué)習(xí)\\機(jī)器學(xué)習(xí)實(shí)戰(zhàn)代碼 python\\機(jī)器學(xué)習(xí)實(shí)戰(zhàn)代碼\\machinelearninginaction\\Ch02\\'
datingDataMat,datingLabels=file2matrix(path+'datingTestSet2.txt')
import matplotlib
import matplotlib.pyplot as plt
fig=plt.figure()
ax=fig.add_subplot(111)
ax.scatter(datingDataMat[:,1],datingDataMat[:,2])
plt.show()
ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*np.array(datingLabels),15*np.array(datingDataMat[:,2]))
plt.show() #生成訓(xùn)練數(shù)據(jù)的array和目標(biāo)array
def autoNorm(dataset):
minVals=dataset.min(0)
maxVals=dataset.max(0)
ranges=maxVals-minVals
normeDataSet=np.zeros(np.shape(dataset))
m=dataset.shape[0]
normDataSet=dataset-np.tile(minVals,(m,1))
normDataSet=normDataSet/np.tile(ranges,(m,1))
return normDataSet ,ranges,minVals
normMat,ranges,minVals=autoNorm(datingDataMat)
def datingClassTest():
hoRatio=0.1
datingDataMat,datingLabels=file2matrix(path+'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 rare is :%f"%(errorCount/float(numTestVecs)) #利用knn算法測(cè)試錯(cuò)誤率
if __name__=='__main__':
datingClassTest()
#利用構(gòu)建好的模型進(jìn)行預(yù)測(cè)
def classifyPerson():
resultList=['not at all','in same doses','in large d oses']
percentTats=float(raw_input("percentage if time spent playin cideo games:"))
ffMiles=float(raw_input("frequnet fliter miles earned per year:"))
iceCream=float(raw_input("liters of ice cream consumed per year:"))
datingDataMat,datingLabels=file2matrix(path+'datingTestSet2.txt')
normMat,ranges,minVals=autoNorm(datingDataMat)
inArr=np.array([ffMiles,percentTats,iceCream])
classifierResult=classify0((inArr-minVals)/ranges,normMat,datingLabels,3)
print("you will probably like the person:",resultList[classifierResult-1])
if __name__!='__main__':
classifyPerson()
#利用knn算法進(jìn)行手寫識(shí)別系統(tǒng)驗(yàn)證
path=u'D:\\Users\\zhoumeixu204\\Desktop\\python語(yǔ)言機(jī)器學(xué)習(xí)\\機(jī)器學(xué)習(xí)實(shí)戰(zhàn)代碼 python\\機(jī)器學(xué)習(xí)實(shí)戰(zhàn)代碼\\machinelearninginaction\\Ch02\\'
def img2vector(filename):
returnVect=np.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
testVector=img2vector(path+'testDigits\\0_13.txt')
print(testVector[0,0:31])
import os
def handwritingClassTest():
hwLabels=[]
trainingFileList=os.listdir(path+'trainingDigits')
m=len(trainingFileList)
trainingMat=np.zeros((m,1024))
for i in range(m):
fileNameStr=trainingFileList[i]
fileStr=fileNameStr.split('.')[0]
classNumStr=int(fileStr.split('_')[0])
hwLabels.append(classNumStr)
trainingMat[i,:]=img2vector(path+'trainingDigits\\'+fileNameStr)
testFileList=os.listdir(path+'testDigits')
errorCount=0.0
mTest=len(testFileList)
for j in range(mTest):
fileNameStr=testFileList[j]
fileStr=fileNameStr.split('.')[0]
classNumStr=int(fileNameStr.split('_')[0])
classNumStr=int(fileStr.split('_')[0])
vectorUnderTest=img2vector(path+'testDigits\\'+fileNameStr)
classifierResult=classify0(vectorUnderTest,trainingMat,hwLabels,3)
print("the classifier canme back with:%d,the real answer is :%d"%(classifierResult,classNumStr))
if classifierResult!=classNumStr:
errorCount+=1.0
print("\nthe total number of errors is :%d"%errorCount)
print("\n the total error rate is :%f"%(errorCount/float(mTest)))
if __name__=='__main__':
handwritingClassTest()
運(yùn)行結(jié)果如下圖:

注:這里使用到了statsmodels模塊,可以點(diǎn)擊此處本站下載statsmodels安裝模塊,再進(jìn)入statsmodels模塊所在目錄位置,使用:
pip install statsmodels-0.9.0-cp27-none-win32.whl
進(jìn)行statsmodels模塊的安裝
同理,出現(xiàn)ImportError: No module named pandas錯(cuò)誤提示時(shí),點(diǎn)擊此處本站下載pandas模塊,再使用
pip install pandas-0.23.1-cp27-none-win32.whl
進(jìn)行pandas模塊的安裝
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Django項(xiàng)目中model的數(shù)據(jù)處理以及頁(yè)面交互方法
今天小編就為大家分享一篇Django項(xiàng)目中model的數(shù)據(jù)處理以及頁(yè)面交互方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
在django項(xiàng)目中,如何單獨(dú)運(yùn)行某個(gè)python文件
這篇文章主要介紹了在django項(xiàng)目中單獨(dú)運(yùn)行某個(gè)python文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
Python使用設(shè)計(jì)模式中的責(zé)任鏈模式與迭代器模式的示例
這篇文章主要介紹了Python使用設(shè)計(jì)模式中的責(zé)任鏈模式與迭代器模式的示例,責(zé)任鏈模式與迭代器模式都可以被看作為行為型的設(shè)計(jì)模式,需要的朋友可以參考下2016-03-03
Python中FTP服務(wù)與SSH登錄暴力破解的實(shí)現(xiàn)
本文學(xué)習(xí)了如何通過(guò) Python 腳本進(jìn)行 FTP、SSH 服務(wù)的登錄爆破,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
Flask請(qǐng)求鉤子與上下文及異常處理分項(xiàng)精解
這篇文章主要介紹了Flask請(qǐng)求鉤子與上下文及異常處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-10-10
Python3.6 + TensorFlow 安裝配置圖文教程(Windows 64 bit)
這篇文章主要介紹了Python3.6 + TensorFlow 安裝配置的教程(Windows 64 bit),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
python提取照片坐標(biāo)信息的實(shí)例代碼
這篇文章主要介紹了python提取照片坐標(biāo)信息的實(shí)例代碼,文中給大家提到了Python利用exifread庫(kù)來(lái)解析照片的經(jīng)緯度,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
Python中print和return的作用及區(qū)別解析
print的作用是輸出數(shù)據(jù)到控制端,就是打印在你能看到的界面上。這篇文章給大家介紹Python中print和return的作用及區(qū)別解析,感興趣的朋友跟隨小編一起看看吧2019-05-05
Python實(shí)現(xiàn)日期判斷和加減操作詳解
這篇文章主要介紹了如何利用Python實(shí)現(xiàn)日期的判斷,以及對(duì)日期的加減操作,文中的示例代碼對(duì)我們學(xué)習(xí)或工作有一定的價(jià)值,需要的可以參考一下2022-01-01

