KNN算法的实现
#!/usr/bin/env python
#-*-coding:utf-8-*-
#knn 的具體實現
import csv
import random
import math
import operator
#導入數據集 文件名,split區分那個集
def loadDataset(filename,split,trainintset=[],testSet=[]):with open(filename,'rb') as csvfile:lines=csv.reader(csvfile)dataset=list(lines)for x in range(len(dataset)-1):for y in range(4):dataset[x][y]=float(dataset[x][y])if random.random()<split:trainingSet.append(dataset[x])else:testSet.append(dataset[x])
#計算距離
def euclideanDistance(instance1,instance2,length):distance=0for x in range(length):distance+=pow((instance1[x]-instance2[x]),2)return math.sqrt(distance)
#得到相鄰的k個鄰居
def getNeighbors(trainingSet,testInstance,k):distance=[]length=len(testInstance)-1#測試集的維度for x in range(len(trainingSet)):dist=euclideanDistance(testInstance,trainingSet[x],length)distance.append((trainingSet[x],dist))distance.sort(key=operatos.itemgetter(1))neighbors=[]for x in range(k):neighbors.append(distances[x][0])return neighbors
#得到那個類占大多數def getResponse(neighbors):classVotes={}for x in range(len(neighbors)):response=neighbors[x][-1]if response in classVotes:classVotes[response]+=1else:classVotes[response]=1sortedVotes=sorted(classVotes.iteritems(),key=operator.itemgetter(1),reverse=True)#按降序排列return sortedVotes[0][0]
#準確率
def getAccuracy(testSet,predictions):correct=0for x in range(len(testSet)):if testSet[x][-1]==predictions[x]:correct+=1return (correct/float(len(testSet)))*100.0def main():trainingSet=[]testSet=[]split=0.67loadDataset(r'data.txt',split,trainingSet,testSet)print('Train set: '+repr(len(trainingSet)))print('Test set: '+repr(len(testSet)))predictions=[]k=3for x in range(len(testSet)):neighbors=getNeighbors(trainingSet,testSet[x],k)result=getResponse(neighbors)predictions.append(result)print('> predicted='+repr(result)+', actual='+repr(testSet[x][-1]))accuracy=getAccuracy(testSet,predictions)print('Accuracy: '+repr(accuracy)+'%')main()
#!/usr/bin/env python#-*-coding:utf-8-*-#knn實現手寫數字識別#1建立工程并導入sklearn包‘import numpy as npfrom os import listdir #使用listdir模塊,用于訪問本地文件from sklearn import neighbors#2加載訓練數據#將加載的32*32的圖片矩陣展開成一列向量def img2vector(fileName): retMat=np.zeros([1024],int)#定義返回的矩陣,大小為1*1024fr=open(fileName)#打開包含32*32大小的數字文件 lines=fr.readlines()#讀取文件的所有行 for i in range(32):#遍歷文件所有行 for j in range(32):#并將01數字存放在retMat中 retMat[i*32+j]=lines[i][j] return retMat#定義加載訓練數據的函數readDataSet;def readDataSet(path): fileList=listdir(path)#獲取文件夾下的所有文件 numFiles=len(fileList)#統計需要讀取的文件的數目dataSet=np.zeros([numFiles,1024],int)#用于存放所有的數字文件 hwLabels=np.zeros([numFiles])#用于存放對應的標簽(與神經網絡的不同) for i in range(numFiles):#遍歷所有的文件 filePath=fileList[i]#獲取文件名稱/路徑 digit=int(filePath.split('_')[0])#通過文件名獲取標簽 hwLabels[i]=digit#直接存放數字,并非one-hot向量 dataSet[i]=img2vector(path+'/'+filePath)#讀取文件內容return dataSet,hwLabelstrain_dataSet,train_hwLabels=readDataSet('digits/trainingDigits/')#訓練的圖片,對應的標簽#3構建KNN分類器knn=neighbors.KNeighborsClassifier(algorithm='kd_tree',n_neighbors=3)knn.fit(train_dataSet,train_hwLabels)#加載測試集dataSet,hwLabels=readDataSet('digits/testDigits/')#構建好的knn分類器對測試集進行預測,并計算預測的錯誤率res=knn.predict(dataSet)#對測試集進行預測error_num=np.sum(res!=hwLabels)#統計分類錯誤的數目num=len(dataSet)#測試集的數目print('Totalnum:',num,' wrong num:', error_num,' WrongRate:',error_num/float(num)) #!/usr/bin/env python #-*-coding:utf-8-*- #knn算法實例鳶尾花預測 from sklearn import neighbors from sklearn import datasetsknn=neighbors.KNeighborsClassifier() #加載數據 iris=datasets.load_iris() #打印數據 print(iris) #訓練KNN分類器 knn.fit(iris.data,iris.target) #KNN實驗 predictedLabel=knn.predict([[0.1,0.2,0.3,0.4]]) print(predictedLabel)
結果解釋: 鳶尾花的數據集 數據代表花瓣的長寬,花萼的長寬 預測目標target 預測結果【0】 #!/usr/bin/env python #-*-coding:utf-8-*- #knn實現手寫數字識別 #1建立工程并導入sklearn包‘ import numpy as np from os import listdir #使用listdir模塊,用于訪問本地文件 from sklearn import neighbors #2加載訓練數據 #將加載的32*32的圖片矩陣展開成一列向量 def img2vector(fileName):retMat=np.zeros([1024],int)#定義返回的矩陣,大小為1*1024fr=open(fileName)#打開包含32*32大小的數字文件lines=fr.readlines()#讀取文件的所有行for i in range(32):#遍歷文件所有行for j in range(32):#并將01數字存放在retMat中retMat[i*32+j]=lines[i][j]return retMat #定義加載訓練數據的函數readDataSet; def readDataSet(path):fileList=listdir(path)#獲取文件夾下的所有文件numFiles=len(fileList)#統計需要讀取的文件的數目dataSet=np.zeros([numFiles,1024],int)#用于存放所有的數字文件hwLabels=np.zeros([numFiles])#用于存放對應的標簽(與神經網絡的不同)for i in range(numFiles):#遍歷所有的文件filePath=fileList[i]#獲取文件名稱/路徑digit=int(filePath.split('_')[0])#通過文件名獲取標簽hwLabels[i]=digit#直接存放數字,并非one-hot向量dataSet[i]=img2vector(path+'/'+filePath)#讀取文件內容return dataSet,hwLabels train_dataSet,train_hwLabels=readDataSet('digits/trainingDigits/') #訓練的圖片,對應的標簽 #3構建KNN分類器 knn=neighbors.KNeighborsClassifier(algorithm='kd_tree',n_neighbors=3) knn.fit(train_dataSet,train_hwLabels) #加載測試集 dataSet,hwLabels=readDataSet('digits/testDigits/') #構建好的knn分類器對測試集進行預測,并計算預測的錯誤率 res=knn.predict(dataSet)#對測試集進行預測 error_num=np.sum(res!=hwLabels)#統計分類錯誤的數目 num=len(dataSet)#測試集的數目 print('Total num:',num,' wrong num:', error_num,' WrongRate:',error_num/float(num))
結果解釋: 預測實例946, wrong num 為10 WrongRate 為 0.010570824524312896
#!/usr/bin/env python#-*-coding:utf-8-*-#knn實現手寫數字識別#1建立工程并導入sklearn包‘import numpy as npfrom os import listdir #使用listdir模塊,用于訪問本地文件from sklearn import neighbors#2加載訓練數據#將加載的32*32的圖片矩陣展開成一列向量def img2vector(fileName): retMat=np.zeros([1024],int)#定義返回的矩陣,大小為1*1024fr=open(fileName)#打開包含32*32大小的數字文件 lines=fr.readlines()#讀取文件的所有行 for i in range(32):#遍歷文件所有行 for j in range(32):#并將01數字存放在retMat中 retMat[i*32+j]=lines[i][j] return retMat#定義加載訓練數據的函數readDataSet;def readDataSet(path): fileList=listdir(path)#獲取文件夾下的所有文件 numFiles=len(fileList)#統計需要讀取的文件的數目dataSet=np.zeros([numFiles,1024],int)#用于存放所有的數字文件 hwLabels=np.zeros([numFiles])#用于存放對應的標簽(與神經網絡的不同) for i in range(numFiles):#遍歷所有的文件 filePath=fileList[i]#獲取文件名稱/路徑 digit=int(filePath.split('_')[0])#通過文件名獲取標簽 hwLabels[i]=digit#直接存放數字,并非one-hot向量 dataSet[i]=img2vector(path+'/'+filePath)#讀取文件內容return dataSet,hwLabelstrain_dataSet,train_hwLabels=readDataSet('digits/trainingDigits/')#訓練的圖片,對應的標簽#3構建KNN分類器knn=neighbors.KNeighborsClassifier(algorithm='kd_tree',n_neighbors=3)knn.fit(train_dataSet,train_hwLabels)#加載測試集dataSet,hwLabels=readDataSet('digits/testDigits/')#構建好的knn分類器對測試集進行預測,并計算預測的錯誤率res=knn.predict(dataSet)#對測試集進行預測error_num=np.sum(res!=hwLabels)#統計分類錯誤的數目num=len(dataSet)#測試集的數目print('Totalnum:',num,' wrong num:', error_num,' WrongRate:',error_num/float(num)) #!/usr/bin/env python #-*-coding:utf-8-*- #knn算法實例鳶尾花預測 from sklearn import neighbors from sklearn import datasetsknn=neighbors.KNeighborsClassifier() #加載數據 iris=datasets.load_iris() #打印數據 print(iris) #訓練KNN分類器 knn.fit(iris.data,iris.target) #KNN實驗 predictedLabel=knn.predict([[0.1,0.2,0.3,0.4]]) print(predictedLabel)
結果解釋: 鳶尾花的數據集 數據代表花瓣的長寬,花萼的長寬 預測目標target 預測結果【0】 #!/usr/bin/env python #-*-coding:utf-8-*- #knn實現手寫數字識別 #1建立工程并導入sklearn包‘ import numpy as np from os import listdir #使用listdir模塊,用于訪問本地文件 from sklearn import neighbors #2加載訓練數據 #將加載的32*32的圖片矩陣展開成一列向量 def img2vector(fileName):retMat=np.zeros([1024],int)#定義返回的矩陣,大小為1*1024fr=open(fileName)#打開包含32*32大小的數字文件lines=fr.readlines()#讀取文件的所有行for i in range(32):#遍歷文件所有行for j in range(32):#并將01數字存放在retMat中retMat[i*32+j]=lines[i][j]return retMat #定義加載訓練數據的函數readDataSet; def readDataSet(path):fileList=listdir(path)#獲取文件夾下的所有文件numFiles=len(fileList)#統計需要讀取的文件的數目dataSet=np.zeros([numFiles,1024],int)#用于存放所有的數字文件hwLabels=np.zeros([numFiles])#用于存放對應的標簽(與神經網絡的不同)for i in range(numFiles):#遍歷所有的文件filePath=fileList[i]#獲取文件名稱/路徑digit=int(filePath.split('_')[0])#通過文件名獲取標簽hwLabels[i]=digit#直接存放數字,并非one-hot向量dataSet[i]=img2vector(path+'/'+filePath)#讀取文件內容return dataSet,hwLabels train_dataSet,train_hwLabels=readDataSet('digits/trainingDigits/') #訓練的圖片,對應的標簽 #3構建KNN分類器 knn=neighbors.KNeighborsClassifier(algorithm='kd_tree',n_neighbors=3) knn.fit(train_dataSet,train_hwLabels) #加載測試集 dataSet,hwLabels=readDataSet('digits/testDigits/') #構建好的knn分類器對測試集進行預測,并計算預測的錯誤率 res=knn.predict(dataSet)#對測試集進行預測 error_num=np.sum(res!=hwLabels)#統計分類錯誤的數目 num=len(dataSet)#測試集的數目 print('Total num:',num,' wrong num:', error_num,' WrongRate:',error_num/float(num))
結果解釋: 預測實例946, wrong num 為10 WrongRate 為 0.010570824524312896
總結
- 上一篇: java中的IO操作之File类
- 下一篇: NAT虚拟网络配置