1. 程式人生 > >監督學習算法_k-近鄰(kNN)分類算法_源代碼

監督學習算法_k-近鄰(kNN)分類算法_源代碼

tex 改變 分析 https color () 根據 def 計算

因為自己想學著去寫機器學習的源碼,所以我最近在學習《機器學習實戰》這本書。

《機器學習實戰》是利用Python2完成的機器學習算法的源代碼,並利用機器學習方法來對實際問題進行分析與處理。

(《機器學習實戰》豆瓣讀書網址:https://book.douban.com/subject/24703171/)

以下內容是我通過學習《機器學習實戰》,以及我對k-近鄰(kNN)分類算法的理解,所總結整理出的內容,其中kNN分類算法的源碼為Python3的代碼,希望大家多多批評指正。

kNN分類算法是一類有監督的學習算法,kNN分類算法首先計算出測試樣本點與已知樣本點之間的距離,選擇距離測試樣本點最近的k個已知樣本點,根據k個已知樣本點的類別,通過“投票法”得到測試樣本點的最終分類。

kNN分類算法的優缺點:優點:精度高、對異常值不敏感、無數據輸入假定;缺點:計算復雜度高、空間復雜度高;適用數據範圍:數值型和標稱型(標稱型數據:變量的結果只在有限目標集中取值)。--摘自《機器學習實戰》

kNN分類算法通常使用歐氏距離來計算測試樣本點與已知樣本點之間的距離。

已知兩個點A=(x1, y1)、B=(x2, y2),則A和B的歐氏距離為:

Distance = sqrt( (x1-x2)^2 + (y1-y2)^2 )

kNN分類算法的偽代碼如下:

Step1:計算出測試樣本點與已知樣本點之間的距離;

Step2:將距離按照升序排序;

Step3:選擇距離測試樣本點最近的k個已知樣本點;

Step4:計算k個最近的已知樣本點所在類別出現的頻率;

Step5:k個最近的已知樣本點出現頻率最高的類別,即為測試樣本點的最終分類。

kNN分類算法的源碼:

def classify(test, samples, labels, k):

  import numpy as np
  import operator

  # 改變測試樣本的格式
  samplesize = samples.shape[0]
  testnew = np.tile(test, (samplesize, 1))

  # 計算測試樣本與已知樣本之間的距離
  distances2 = (testnew - samples) ** 2


  distances = (distances2.sum(axis = 1)) ** 0.5

  # 對距離進行升序排序,並返回距離的下標
  sortdistances = distances.argsort()

  #計算k個最近的已知樣本點所在類別出現的次數
  classcount = {}

  for i in range(k):
    sortedlabels = labels[sortdistances[i]]
    classcount[sortedlabels] = classcount.get(sortedlabels, 0) + 1

  #將k個最近的已知樣本點所在類別出現的次數降序排列
  sortedclasscount = sorted(classcount.items(), key = operator.itemgetter(1),reverse = True)

  #返回k個最近的已知樣本點出現頻率最高的類別,即為測試樣本點的最終分類
  return sortedclasscount[0][0]

對 kNN分類算法的源碼進行測試:

import numpy as np

import operator
test = [0, 1]
samples = np.array([[1, 1], [1, 3], [0, 0], [0., .1]])
labels = [‘A‘, ‘A‘, ‘B‘, ‘B‘]
k = 3
print(classify(test, samples, labels, k))

測試代碼的輸出結果為 ‘B‘,即測試樣本點[0, 1]的所屬類別為:B。

以上是我對kNN分類算法的理解以及源代碼,歡迎大家多多批評指正。

後續如果有時間的話,我會增加 監督學習算法_k-近鄰(kNN)分類算法_實戰 這一部分的隨筆整理。

祝好

希望可以和大家互相學習、共同進步。

Violet HE

2019.1.18 00:35

監督學習算法_k-近鄰(kNN)分類算法_源代碼