machine learning Knn演算法 最鄰近規則取樣(三)自己實現演算法
阿新 • • 發佈:2018-12-10
import csv
import random
import math
import operator
#匯入資料集,split將資料分為兩部分,訓練集和測試集 def loadDataset(filename,split,trainingSet=[],testSet=[]): with open(filename,'rt') as csvfile: lines=csv.reader(csvfile)#讀取每一行到檔案中 dataset=list(lines)#將檔案轉為一個list 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]) #計算兩個例項之間的距離,length表示維度 def euclideanDistance(instance1,instance2,length): distance=0 for x in range(length): distance+=pow((instance1[x]-instance2[x]),2) return math.sqrt(distance)#sqrt()開方函式 #從訓練集中返回離測試yigeyangbenK個最近鄰居 def getNeighbors(trainingSet,testInstance,k): distances=[] length=len(testInstance)-1#維度 for x in range(len(trainingSet)): dist=euclideanDistance(testInstance,trainingSet[x],length)#對於訓練集中的每一個X 算出和測試樣本的距離 distances.append((trainingSet[x],dist))#將算出來的距離加入到容器當中 distances.sort(key=operator.itemgetter(1))#利用排序的方法將距離從小到大排序出來 neighbors=[] for x in range(k): neighbors.append(distances[x][0]) return neighbors#找到最近的k個鄰居 #在k個最近的鄰居中找到佔個數最多的那個類 def getResponse(neighbors): classVotes={} for x in range(len(neighbors)): response=neighbors[x][-1] if response in classVotes: classVotes[response]+=1 else: classVotes[response]=1 #之所以會出現上述錯誤是因為python3中已經沒有這個屬性,直接改為items即可: sortedVotes=sorted(classVotes.items(),key=operator.itemgetter(1),reverse=True)#對每個類佔的個數排序按降序 return sortedVotes[0][0]#返回排在最前面的類 #計算精確度。當所有的測試集預測完後% def getAccuracy(testSet,predictions): correct=0 for x in range(len(testSet)): if testSet[x][-1]==predictions[x]: correct+=1 return (correct/float(len(testSet)))*100.0 def main(): trainingSet=[] testSet=[] split=0.67 loadDataset(r'/home/htt/htt/machineL/Knn/irisdata.txt',split,trainingSet,testSet) print('train set:'+repr(len(trainingSet))) print('test set:'+repr(len(testSet))) predictions=[] k=3 for 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()