機器學習演算法——kNN(k-近鄰演算法)

藺昌黎發表於2020-10-12

演算法概述

通過測量不同特徵值之間的距離進行 [分類]

  • 優點:精度高、對異常值不敏感、無資料輸入假定。
  • 缺點:計算複雜度高、空間複雜度高。
  • 適用資料範圍: 數值型標稱型

演算法流程

  • 資料
    • 樣本資料(多維多行資料 + 標籤)
    • 預測資料(多維一行資料)

  • 比較預測資料與樣本資料的距離

    • 歐氏距離
  • 將樣本資料按照距離從小到大排序

  • 選取前 k 個樣本資料,取出現次數最多的樣本標籤作為預測資料的分類標籤

程式碼示例

import collections
import numpy as np

def culEuDistance(x1, x2):
    """
    計算歐氏距離
    """
    return ((x1 - x2)**2).sum()**0.5

def knn(X, dataSet, labels, k):
    """
    比較預測資料與歷史資料集的歐氏距離,選距離最小的k個歷史資料中最多的分類。
    :param X:           需要預測的資料特徵
    :param dataSet:     歷史資料的資料特徵
    :param labels:      與dataSet對應的標籤
    :param k:           前k個
    :return:            label標籤
    """
    if isinstance(dataSet, list):
        dataSet = np.array(dataSet)
    rowNum = dataSet.shape[0]
    X = np.tile(X,(rowNum,1))
    distances = np.empty(rowNum)
    for row in range(rowNum):
        distances[row] = culEuDistance(X[row], dataSet[row])
    sortedIdx = distances.argsort()
    candidates = []
    for i in range(k):
        candidates.append(labels[sortedIdx[i]])
    return collections.Counter(candidates).most_common(1)[0][0]

if __name__ == "__main__":
    # print(culEuDistance(np.array([3,4]), np.array([2,1])))
    X = [101,20]
    dataSet = [[3,104],[2,100],[1,81],[101,10],[99,5],[98,2]]
    labels = ['愛情片','愛情片','愛情片','動作片','動作片','動作片']
    print(knn(X,dataSet,labels,k=3))

    # 動作片

相關文章