2 **
# -*- coding: utf-8 -*-import math
import csv
import random
import operator
'''@author:hunter
@time:2017.03.31
'''class knearestneighbor(object):
def __init__(self):
pass
def loaddataset(self,filename, split, trainingset, testset): # 載入資料集 split以某個值為界限分類train和test
with open(filename, 'r') 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: # 將所有資料載入到train和test中 生成0和1的隨機浮點數
else:
def calculatedistance(self,testdata, traindata, length): # 計算距離
distance = 0 # length表示維度 資料共有幾維
for x in range(length):
distance += pow((testdata[x]-traindata[x]), 2)
return math.sqrt(distance)
def getneighbors(self,trainingset, testinstance, k): # 返回最近的k個邊距
distances =
length = len(testinstance)-1
for x in range(len(trainingset)): #對訓練集的每乙個數計算其到測試集的實際距離
dist = self.calculatedistance(testinstance, trainingset[x], length)
print('訓練集:{}-距離:{}'.format(trainingset[x], dist))
distances.sort(key=operator.itemgetter(1)) # 把距離從小到大排列
neighbors =
for x in range(k): #排序完成後取前k個距離
print(neighbors)
return neighbors
def getresponse(self,neighbors): # 根據少數服從多數,決定歸類到哪一類
classvotes = {}
for x in range(len(neighbors)):
response = neighbors[x][-1] # 統計每乙個分類的多少
if response in classvotes:
classvotes[response] += 1
else:
classvotes[response] = 1 # 初始值為1
print(classvotes.items())
sortedvotes = sorted(classvotes.items(), key=operator.itemgetter(1), reverse=true) #reverse按降序的方式排列
return sortedvotes[0][0]
def getaccuracy(self,testset, predictions): # 準確率計算
correct = 0
for x in range(len(testset)):
if testset[x][-1] == predictions[x]: #predictions是**的和testset實際的比對
correct += 1
print('共有{}個**正確,共有{}個測試資料'.format(correct,len(testset)))
return (correct/float(len(testset)))*100.0
def run(self):
trainingset =
testset =
split = 0.75
self.loaddataset(r'testdata.txt', split, trainingset, testset) #資料劃分
print('train set: ' + str(len(trainingset)))
print('test set: ' + str(len(testset)))
#generate predictions
predictions =
k = 3 # 取最近的3個資料
# correct =
for x in range(len(testset)): # 對所有的測試集進行測試
neighbors = self.getneighbors(trainingset, testset[x], k) #找到3個最近的鄰居
result = self.getresponse(neighbors) # 找這3個鄰居歸類到哪一類
# print('predictions: ' + repr(predictions)) 返回乙個它在python中的描述
# print('>predicted=' + repr(result) + ', actual=' + repr(testset[x][-1]))
# print(correct)
accuracy = self.getaccuracy(testset,predictions)
print('accuracy: ' + repr(accuracy) + '%')
if __name__ == '__main__':
a = knearestneighbor()
a.run()
k最鄰近演算法 加權kNN
上篇文章中提到為每個點的距離增加乙個權重,使得距離近的點可以得到更大的權重,在此描述如何加權。該方法最簡單的形式是返回距離的倒數,比如距離d,權重1 d。有時候,完全一樣或非常接近的商品權重會很大甚至無窮大。基於這樣的原因,在距離求倒數時,在距離上加乙個常量 weight 1 distance co...
機器學習分類篇 最鄰近規則分類KNN
最鄰近規則分類演算法 k nearest neighbor cover和hart在1968年提出了最初的鄰近演算法,也被稱為基於例項的學習或懶惰學習,與決策樹演算法相比,處理訓練集的時候並不建立任何模型,進行分類時才將測試樣例和所有已知例項進行比較進而分類。如上圖,主要有兩種色塊,藍色方塊和紅色三角...
knn鄰近演算法
knn演算法即為k鄰近演算法,是一種監督式的機器學習演算法,且它是用來進行分類的。注意此演算法需要和 k means演算法進行區別,因為都有個k。工作原理是 存在乙個樣本資料集合,也稱作訓練樣本集,且樣本集中每個資料都存在標籤,知道樣本集中與所屬分類的對應關係。輸入沒有定義的新資料後,將新資料的每個...