import numpy as np
import operator as opt
import matplotlib.pyplot as plt
import collections as clt
from sklearn import datasets
# K-近鄰算法 鳶尾花數據測試
# KNN分類算法
# 算法描述:
# 1.參數說明:待分類向量x、訓練數據集(特徵向量組)A、標籤向量、參數(k)
# 2.計算x與A中所有向量的距離,並返回排序索引數組
# 3.標籤向量使用2中的索引數組,取出前k個標籤名,出現次數最多的就是x的標籤
def KNN(x, dataSet, lable, k):
assert 1 <= k <= dataSet.shape[0] ," k must be valid "
assert dataSet.shape[0]==lable.shape[0],"數據集和標籤集不對等"
assert x.shape[0] == dataSet.shape[1],"待測數據與數據集特徵數不相等"
# 計算距離
# 計算測試數據集rows(數據量)
dataSetSize = dataSet.shape[0]
# 將x擴展爲dataSet同大小的矩陣,
# 使用numpy中的universal function對矩陣元素分別進行計算的原則,避免使用循環
X = np.tile(x, (dataSetSize, 1)) # 複製dataSetSize-1個x向量
# 計算距離
distances = (((X-dataSet)**2).sum(axis=1))**0.5
# 根據距離進行排序,並返回索引數組
index_SortByDistance = distances.argsort()
# 獲取距離最近的三個標籤
hyperLables = []
for i in range(k):
hyperLables.append(lable[index_SortByDistance[i]])
# 獲取出現次數最多的標籤
return clt.Counter(hyperLables).most_common(1)[0][0]
# 獲取鳶尾花數據集
iris = datasets.load_iris()
# 訓練數據:每種花選取25個數據,注意標籤要和數據一一對應
datasets = np.vstack(
(iris.data[0:25, ...], iris.data[50:75, ...], iris.data[100:125, ...]))
lable = np.hstack(
(iris.target[0:25], iris.target[50:75], iris.target[100:125]))
# 遍歷剩下的待分類數據
a = [i for i in range(150) if ((i >= 25) and (i < 50)) or (
(i >= 75) and (i < 100)) or ((i >= 125) and (i < 150))]
success_num = 0
fail_num = 0
for i in a:
x = iris.data[i, ...]
xtarget = KNN(x, datasets, lable, 1)
if(iris.target_names[xtarget] == iris.target_names[iris.target[i]]):
# print("分類成功")
success_num += 1
else:
# print("分類失敗")
fail_num += 1
print("分類完成:成功({});失敗({})".format(success_num, fail_num))
使用sklearn封裝好的KNN算法
import numpy as np
from sklearn.neighbors import KNeighborsClassifier as KNN
from sklearn import datasets
# 獲取鳶尾花數據集
iris = datasets.load_iris()
# 訓練數據:每種花選取25個數據,注意標籤要和數據一一對應
dataSet = np.vstack((iris.data[0:25, ...], iris.data[50:75, ...], iris.data[100:125, ...]))
lable = np.hstack((iris.target[0:25], iris.target[50:75], iris.target[100:125]))
# 創建KNN分類器
# 1.sklearn 中的算法都被包裝成面向對象風格,因此使用算法時,要先實例化
KNN_classifier = KNN(n_neighbors=6) #規定 k = 6
# 2.fit 爲訓練模型的過程,由於KNN本質上無模型,但是爲了和別的算法統一,將訓練數據集當作模型
KNN_classifier.fit(dataSet,lable)
# 3.進行預測(分類)
X = np.vstack((iris.data[25:50, ...], iris.data[75:100, ...], iris.data[125:150, ...]))
result = KNN_classifier.predict(X)
print(result)