"""
將資料點(1, 1.1)定義為類a, 資料點(0, 0.1)定義為類b
k-鄰近演算法實現:
1.計算已知類別資料集中的點與當前點之間的距離
2.按照距離遞增次序排序
3.選取與當前點距離最小的k個點
4.確定前k個點所在的類別的出現頻率
5.返回前k個點出現頻率最高的類別作為當前點的**分類
"""from numpy import *
import operator
def createdataset():
group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
labels = ["a", "a", "b", "b"]
return group, labels
def classify0(inx, dataset, labels, k):
"""共有四個輸入引數:用於分類的輸入向量是inx,輸入的訓練樣本集為dataset
標籤向量為labels, 最後的引數k表示用於選擇最鄰近的數目,其中標籤向量的元素數目和
矩陣dataset的行數相同。計算的距離為歐氏距離
:param inx:
:param dataset:
:param labels:
:param k:
:return:
"""# 計算歐氏距離
datasetsize = dataset.shape[0] # dataset.shape[0]輸出的是資料集的行數,shape[1]輸出的是資料集的列數
diffmat = tile(inx, (datasetsize, 1)) - dataset # tile函式共有兩個引數,tile(a, reps), a指待輸入陣列,reps決定a重複的次數,整個函式用於重複陣列a來構建新的陣列
sqdiffmat = diffmat ** 2 # 計算歐氏距離
sqdistances = sqdiffmat.sum(axis=1) # 按行求和,
distance = sqdistances ** 0.5 # 開根號,結果為該未知資料集到每乙個已知資料集的歐氏距離
# 選擇距離最小的k個點
sorteddistindicies = distance.argsort() # argsort()方法返回陣列值從小到大的索引
classcount = {}
for i in range(k):
voteilabel = labels[sorteddistindicies[i]] # 獲取所屬類別
classcount[voteilabel] = classcount.get(voteilabel, 0) + 1 # get方法返回指定鍵的值,如果不存在則返回預設值(0:設定預設值為0)
sortedclasscount = sorted(classcount.items(), key=operator.itemgetter(1), reverse=true) # items()返回字典列表操作後的迭代 sorted(可迭代物件, 自定義的比較函式, 順序預設為fslse,正序)
return sortedclasscount[0][0]
if __name__ == '__main__':
group, labels = createdataset()
print(group)
print(labels)
result = classify0([0, 0], group, labels, 3)
print(result)
K鄰近演算法 KNN
k nearest neighbor knn演算法 如果乙個樣本在特徵空間中的k個最相似 即特徵空間中最鄰近 的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。所選擇的鄰居都是已經正確分類的物件。如果k 3,則綠色圓形的類別與紅色三角形相同 如果k 5,則綠色圓形的類別與藍色正方形相同 the...
k最鄰近演算法 加權kNN
上篇文章中提到為每個點的距離增加乙個權重,使得距離近的點可以得到更大的權重,在此描述如何加權。該方法最簡單的形式是返回距離的倒數,比如距離d,權重1 d。有時候,完全一樣或非常接近的商品權重會很大甚至無窮大。基於這樣的原因,在距離求倒數時,在距離上加乙個常量 weight 1 distance co...
機器學習 K 鄰近演算法 KNN
k 鄰近演算法 有監督演算法 演算法工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每乙個資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將新資料的每乙個特徵與樣本集中資料對應的特徵進行比較,然後演算法提供樣本集中特徵最相似資料 最鄰近 的分類標...