核心思想:前k個最相似資料中出現次數最多的類別,作為新資料的類別。
核心函式:計算距離函式,投票函式
#-*- coding : utf-8 -*-
import random
import sys
from collections import counter
from operator import itemgetter
reload(sys)
sys.setdefaultencoding("utf-8")
def create********():
# 生成三角形三個角的度數
anglec = 0
while(anglec <= 0):
anglea = random.randint(1, 179)
angleb = random.randint(1, 179)
anglec = 180 - anglea - angleb
if max([anglea, angleb, anglec]) < 90:
label = 'r' # 銳角三角形
elif max([anglea, angleb, anglec]) == 90:
label = 'z' # 直角三角形
else:
label = 'd' # 鈍角
return anglea, angleb, anglec, label
def createdataset(n,filename):
# 生成資料集文字檔案
f = open(filename, 'w')
for i in range(n):
anglea, angleb, anglec, label = create********()
row = str(anglea) + '\t' + str(angleb) + '\t' + str(anglec) + '\t' + str(label) + '\n'
f.writelines(row)
f.close()
def loadfile2matrix(filename):
# load文字檔案生成矩陣
f = open(filename, 'r')
labelmatrix =
datamatrix =
for line in f.readlines():
splitline = line.strip('\n').split('\t')
return labelmatrix, datamatrix
def calcdistance(veca, vecb):
# 計算兩個向量之間的歐式距離
sumofsquare = 0
for i in range(len(veca)):
sumofsquare += (veca[i]-vecb[i]) ** 2
distance = sumofsquare ** (1.0/2)
return distance
def vote(candidatelist):
count_timesdict = counter(candidatelist)
count_timestuple = sorted(count_timesdict.iteritems(), key=itemgetter(1), reverse = true)
voteresult = str(count_timestuple[0][0])
return voteresult
def knn(testvec, datamatrix, labelmatrix, k):
distancedict = {}
# 計算新向量到各已分類向量的距離
for i in range(len(datamatrix)):
distance = calcdistance(testvec, datamatrix[i])
distancedict[distance] = labelmatrix[i]
# 按距離從小到大排序
distancetuple = sorted(distancedict.iteritems(), key=itemgetter(0), reverse = false)
candidatelist =
# 取出距離最小的k個對應的類別標籤,並進行投票判別新向量的類別
for j in range(k):
classifylabel = vote(candidatelist)
return classifylabel
def testclassifier(testdatamatrix, testlabelmatrix, datamatrix, labelmatrix, k):
errorcount = 0
for i in range(len(testdatamatrix)):
vec = testdatamatrix[i]
classifylabel = knn(vec, datamatrix, labelmatrix, k)
# 當根據knn演算法**的類別,與測試資料的真實類別不一致時,錯分個數增加1
if not classifylabel == testlabelmatrix[i]:
errorcount += 1
# 分類準確率
pricision = 1 - float(errorcount)/len(testdatamatrix)
print 'the pricision of this knn classifier is:', pricision
if __name__ == '__main__':
createdataset(10000, 'dataset.txt')
labelmatrix, datamatrix = loadfile2matrix('dataset.txt')
createdataset(1000, 'testdataset.txt')
testlabelmatrix, testdatamatrix = loadfile2matrix('testdataset.txt')
testclassifier(testdatamatrix, testlabelmatrix, datamatrix, labelmatrix, 5)
K 近鄰演算法 KNN
knn k nearest neighbor 假設訓練集有記錄 r1 r2,rn共n條,訓練集的特徵向量及其對應的類別都是已知的,每個記錄的特徵向量為 t1 t2,tk共k個特徵,待測試的記錄為ru 1 計算ru 的特徵向量與訓練集的每條記錄 即r1 r2,rn 的特徵向量的歐式距離,選取距離最小的...
K近鄰演算法 KNN
k近鄰演算法 knn 何謂k近鄰演算法,即k nearest neighbor algorithm,簡稱knn演算法,單從名字來猜想,可以簡單粗暴的認為是 k個最近的鄰居,當k 1時,演算法便成了最近鄰演算法,即尋找最近的那個鄰居。為何要找鄰居?打個比方來說,假設你來到乙個陌生的村莊,現在你要找到與...
K 近鄰(KNN)演算法
思路是 如果乙個樣本在特徵空間中的k個最相似 即特徵空間中最鄰近 的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。knn演算法中,所選擇的鄰居都是已經正確分類的物件。該方法在定類決策上只依據最鄰近的乙個或者幾個樣本的類別來決定待分樣本所屬的類別。該演算法在分類時有個主要的不足是,當樣本不平衡...