在本文中,通過python實現knn演算法,而非簡單的呼叫sklearn庫,並通過iris鳶尾花資料集進行訓練和測試。詳情參見以下**:
if
__name__ =='__main__':trainx, trainy, testx, testy=loadsplitdataset()
prey=knn(testx)
evaluateknn()
# 和切分資料集為訓練集和測試集
# 訓練集:trainx、trainy;
# 測試集:testx、testy;
defloadsplitdataset():
#隨機生成訓練集和測試集 不能確定比例
iris = datasets.load_iris()
randarray=np.random.randint(2,size=len(iris.data))
print(len(randarray))
trainx = iris.data[randarray==0]
trainy=iris.target[randarray==0]
testx = iris.data[randarray == 1]
testy=iris.target[randarray == 1]
returntrainx, trainy, testx, testy
def
loadsplitdataset(rate=
0.8):
iris = datasets.load_iris()
#確定訓練集和測試集的比例
shuffleindex=np.random.permutation(
len(iris.data))
trainsize=
int(rate *
len(iris.data))
trainx= iris.data[shuffleindex[:trainsize]]
trainy=iris.target[shuffleindex[:trainsize]]
testx= iris.data[shuffleindex[trainsize:]]
testy = iris.target[shuffleindex[trainsize:]]
return
trainx, trainy, testx, testy
#knn演算法實現#testx為測試樣本及
# k為鄰近的樣本點數量
defknn(testx,k=5):
predy =
forxintestx:
# 計算樣本點訓練集的歐氏距離
distance = [np.sqrt(np.sum(np.power(x_train - x, 2)))forx_trainintrainx]
# 從小到大排序,每個數的索引位置
indexsort = np.argsort(distance)
# 獲得距離樣本點最近的k個點的標記值y
neark_y = [trainy[i]foriinindexsort[:k]]
# 統計鄰近k個點標記值的數量
cnty = counter(neark_y)
# 返回標記值最多的那個標記
y_predict = cnty.most_common(1)[0][0]
returnpredy
#計算測試的準確率defevaluateknn():
cnt = np.sum(prey == testy)
acc=np.divide(cnt,len(testx))
print("the accurate of knn:",round(acc,4))
Python實現KNN演算法
from numpy import import operator def creatdataset group array 1.0,1.1 1.0,1.0 0,0 0,0.1 lables a a b b return group,lables def classify0 inx,dataset,...
python實現knn演算法
importnumpyasnp importoperator defcreatedataset group np.array 1.0 1.1 1.0 1.0 0.0 0.0 0.0 0.1 labels a a b b returngroup,labels 分類演算法 inx待分類的點 defcla...
python實現KNN演算法
具體 如下 import numpy as np import matplotlib.pyplot as plt class myknn def init self,k self.k k def compute self,x train,y train,x test dist i 0 計算歐式距離 ...