机器学习之kNN算法(纯python实现)
前面文章分別簡單介紹了線性回歸,邏輯回歸,貝葉斯分類,并且用python簡單實現。這篇文章介紹更簡單的 knn, k-近鄰算法(kNN,k-NearestNeighbor)。 k-近鄰算法(kNN,k-NearestNeighbor),是最簡單的機器學習分類算法之一,其核心思想在于用距離目標最近的k個樣本數據的分類來代表目標的分類(這k個樣本數據和目標數據最為相似)。
原理
kNN算法的核心思想是用距離最近(多種衡量距離的方式)的k個樣本數據來代表目標數據的分類。
具體講,存在訓練樣本集, 每個樣本都包含數據特征和所屬分類值。 輸入新的數據,將該數據和訓練樣本集匯中每一個樣本比較,找到距離最近的k個,在k個數據中,出現次數做多的那個分類,即可作為新數據的分類。
如上圖: 需要判斷綠色是什么形狀。當k等于3時,屬于三角。當k等于5是,屬于方形。 因此該方法具有一下特點:- 監督學習:訓練樣本集中含有分類信息
- 算法簡單, 易于理解實現
- 結果收到k值的影響,k一般不超過20.
- 計算量大,需要計算與樣本集中每個樣本的距離。
- 訓練樣本集不平衡導致結果不準確問題
接下來用oython 做個簡單實現, 并且嘗試用于約會網站配對。
python簡單實現
def classify(inX, dataSet, labels, k):"""定義knn算法分類器函數:param inX: 測試數據:param dataSet: 訓練數據:param labels: 分類類別:param k: k值:return: 所屬分類"""dataSetSize = dataSet.shape[0] #shape(m, n)m列n個特征diffMat = np.tile(inX, (dataSetSize, 1)) - dataSetsqDiffMat = diffMat ** 2sqDistances = sqDiffMat.sum(axis=1)distances = sqDistances ** 0.5 #歐式距離sortedDistIndicies = distances.argsort() #排序并返回indexclassCount = {}for i in range(k):voteIlabel = labels[sortedDistIndicies[i]]classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 #default 0sortedClassCount = sorted(classCount.items(), key=lambda d:d[1], reverse=True)return sortedClassCount[0][0] 復制代碼算法的步驟上面有詳細的介紹,上面的計算是矩陣運算,下面一個函數是代數運算,做個比較理解。
def classify_two(inX, dataSet, labels, k):m, n = dataSet.shape # shape(m, n)m列n個特征# 計算測試數據到每個點的歐式距離distances = []for i in range(m):sum = 0for j in range(n):sum += (inX[j] - dataSet[i][j]) ** 2distances.append(sum ** 0.5)sortDist = sorted(distances)# k 個最近的值所屬的類別classCount = {}for i in range(k):voteLabel = labels[ distances.index(sortDist[i])]classCount[voteLabel] = classCount.get(voteLabel, 0) + 1 # 0:map defaultsortedClass = sorted(classCount.items(), key=lambda d:d[1], reverse=True)return sortedClass[0][0] 復制代碼有了上面的分類器,下面進行最簡單的實驗來預測一下:
def createDataSet():group = np.array([[1, 1.1], [1, 1], [0, 0], [0, 0.1]])labels = ['A', 'A', 'B', 'B']return group, labels 復制代碼上面是一個簡單的訓練樣本集。
if __name__ == '__main__':dataSet, labels = createDataSet()r = classify_two([0, 0.2], dataSet, labels, 3)print(r) 復制代碼執行上述函數:可以看到輸出B, [0 ,0.2]應該歸入b類。
上面就是一個最簡單的kNN分類器,下面有個例子。
kNN用于判斷婚戀網站中人的受歡迎程度
訓練樣本集中部分數據如下:
40920 8.326976 0.953952 3 14488 7.153469 1.673904 2 26052 1.441871 0.805124 1 75136 13.147394 0.428964 1 38344 1.669788 0.134296 1 復制代碼第一列表示每年獲得的飛行??屠锍虜?#xff0c; 第二列表示玩視頻游戲所耗時間百分比, 第三類表示每周消費的冰淇淋公升數。第四列表示分類結果,1, 2, 3 分別是 不喜歡,魅力一般,極具魅力。
如上圖可以看到并無明顯的分類。
可以看到不同的人根據特征有明顯的區分。因此可以使用kNN算法來進行分類和預測。
調整不同的測試比例,對比結果。
可以看到基本的得到所屬的分類。
完成代碼和數據請參考:
github:kNN
總結
- kNN
- 監督學習
- 數據可視化
- 數據歸一化,不影響計算
總結
以上是生活随笔為你收集整理的机器学习之kNN算法(纯python实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 视频转码能力哪家强?腾讯云、阿里云、七牛
- 下一篇: 从简历筛选看怎么写一篇有亮点的简历