1. 程式人生 > >machine learning Knn演算法 最鄰近規則取樣(三)自己實現演算法

machine learning Knn演算法 最鄰近規則取樣(三)自己實現演算法

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()