機器學習算法手撕系列(一)----K-近鄰算法(KNN)

一.k近鄰基本介紹

(1)算法原理

       knn算法是一個有監督機器學習算法,可以解決分類問題,也可以解決迴歸問題.核心思想是未標記樣本的類別,由距離其最近的k個鄰居投票來決定.

       假設我們有一個已經標記的數據集,即已經知道了數據集中每個樣本所屬的類別,此時,有一個未標記的數據樣本,我們的任務是預測這個數據樣本所屬的類別,其基本原理是,計算待標記的數據樣本和數據集中每個樣本的距離,取距離最近的k個樣本.待標記的數據樣本所屬的類別,就有這k個距離最近的樣本投票產生.

       假設X_test爲待標記的數據樣本,X_train爲已標記的數據集,僞代碼如下:

  • 遍歷X_train中的所有樣本,計算每個樣本與X_test的距離,並把距離保存在Distance數組中
  • 對Distance數組進行排序,取距離最近的k個點,記爲X_knn
  • 在X_knn中統計每個類別的個數,即class0在X_knn中有幾個樣本,class1在X_knn中有幾個樣本等
  • 待標記樣本的類別,就是X_knn中樣本個數最多的那個類別.       

(2)算法優缺點

優點:準確性高,對異常和噪聲有較高的容忍度

缺點:計算量較大,對內存需求也較大,從算法原理可以看出,每次對一個未標記樣本進行分類時,都需要全部計算一遍距離.

(3)算法參數

其算法參數爲k,參數選擇需要根據數據來決定,k值越大,模型的偏差越大,對噪聲數據越不敏感,當k值很大時,可能造成模型欠擬合,k值越小,模型方差越大,當k值過小,就會造成模型過擬合

(4)算法的變種

k-鄰近算法變種有如下幾種;

1.增加鄰居的權重,默認情況下,在計算距離時,都是使用相同權重,事實上,我們可以針對不同的鄰居指定不同的距離權重,如距離越近,權重越高,這個可以通過指定算法的weights參數來實現

2.使用一定半徑內的點取代距離最近的k個點,在scikit-learn裏,RadiusNeighborsClassfier類實現了這個算法的變種,當數據採樣不均勻時,該變種算法可以取得更好性能

 

二.示例:使用knn算法進行分類

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np


from sklearn.datasets.samples_generator import make_blobs
# 生成數據集
centers = [[-2, 2], [2, 2], [0, 4]]
X, y = make_blobs(n_samples=60, centers=centers, random_state=0, cluster_std=0.60)

# 畫出數據
plt.figure(figsize=(16, 10), dpi=144)
c = np.array(centers)
plt.scatter(X[:, 0], X[:, 1], c=y, s=100, cmap='cool')#畫出樣本點
plt.scatter(c[:, 0], c[:, 1], s=100, marker='^', c='orange')#畫出中心點


from sklearn.neighbors import KNeighborsClassifier
# 模型訓練
k = 5
clf = KNeighborsClassifier(n_neighbors=k)
clf.fit(X, y)

# 進行預測
X_sample = [[0,2]]#待預測點
y_sample = clf.predict(X_sample)
neighbors = clf.kneighbors(X_sample, return_distance=False)

# 畫出示意圖
plt.figure(figsize=(16, 10), dpi=144)
plt.scatter(X[:, 0], X[:, 1], c=y, s=100, cmap='cool')#樣本
plt.scatter(c[:, 0], c[:, 1], s=100, marker='^', c='k')#中心點
plt.scatter(X_sample[0][0], X_sample[0][1], marker="x", s=100, cmap='cool')#待預測點
for i in neighbors[0]:
    plt.plot([X[i][0], X_sample[0][0]], [X[i][1], X_sample[0][1]], 'k--', linewidth=0.6)

 運行結果如下:

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章