01 K近鄰演算法
阿新 • • 發佈:2020-12-24
K近鄰演算法採用測量不同特徵值之間的距離方法進行分類
- 優點:精讀高,對異常值不敏感,無資料輸入假定
- 缺點:計算算雜度高,空間複雜度高。適合資料範圍:數值型和標稱型
K近鄰演算法是分類資料最簡單最有效的演算法。是基於例項的學習,使用演算法時我們必須有接近實際資料的訓練
樣本資料。K近鄰演算法必須儲存全部資料集,如果訓練資料集很大,必須使用大量的儲存空間。
由於必須對資料集中的每個資料計算距離值,實際使用時可能非常耗時。
它無法給出任何資料的基礎結構資訊,因此,我們也無法知曉平均例項樣本和典型例項樣本具體有什麼特徵
import numpy as np import operator def createDataSet(): group = np.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: np.ndarray, labels: list, k: int) -> str: """ k Nearest Neighbors -- 歐式距離 :param inX: 輸入向量 :param dataSet: 輸入的訓練樣本集 :param labels: 標籤向量 :param k: 選擇最近鄰居的數目 :return: 最受歡迎的標籤 """ dataSetSize = dataSet.shape[0] # 距離計算 # 行重複dataSetSize次,列1次 diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet # 平方和 sqDiffMat = diffMat ** 2 sqDistances = sqDiffMat.sum(axis=1) # 開方 distances = sqDistances ** 0.5 # 排序索引 sortedDistIndicies = distances.argsort() classCount = {} # 選擇距離最小的額k個點 for i in range(k): voteIlabel = labels[sortedDistIndicies[i]] classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 # 對第1維的元素進行降序排序 sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) return sortedClassCount[0][0] if __name__ == '__main__': group, labels = createDataSet() print(classify0([0, 0], group, labels, 3))