優點:精度高,對異常值不敏感,無資料輸入假定(不理解)
缺點:計算複雜度高(需要計算新的資料點與樣本集中每個資料的「距離」,以判斷是否是前k個鄰居),空間複雜度高(巨大的矩陣)。
使用資料範圍:數值型和標稱型
演算法原理:距離公式(歐氏距離)
一般流程:
1.收集資料,可以使用任何方法
2.準備資料,計算距離所需要的數值,最好是結構化的資料格式
3.分析資料,可以使用任何方法
4.訓練演算法,此步驟不適用於k-近鄰演算法(存疑)
5.測試演算法,計算錯誤率
6.使用演算法。首先需要輸入樣本資料和結構化的輸出結果,然後執行k-近鄰算大判定輸入資料分別屬於哪個分類,最後應用對計算出的分類執行後續的處理。
注意:需提前檢視資料的內容,看是否需要處理(歸一化正則化或者標準化)
標準化:(x - mean)/ std,減去均值之後除以標準差,可以通過使用sklearn.preprocessing.scale()函式將給定資料進行標準化,或者使用sklearn.preprocessing.standardscaler類,使用該類的好處在於可以儲存訓練集中的引數(均值、方差)直接使用其物件轉換測試集資料。
歸一化:將屬性縮放到乙個指定範圍(比如0-1) ,另一種常用的方法是將屬性縮放到乙個指定的最大值和最小值之間,這可以通過preprocessing.minmaxscaler類實現。
正則化:將每個樣本縮放到單位範數(每個樣本的範數為1),這個還沒看懂。正則化就是說給需要訓練的目標函式加上一些規則(限制),讓他們不要自我膨脹。
以下是**,未對資料進行預處理以及演算法的儲存(工具:jupyter):
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd
%matplotlib inline
from sklearn.neighbors import kneighborsclassifier,kneighborsregressor
from sklearn.model_selection import train_test_split
data = pd.read_csv('./datingtestset2.txt',header = none,sep ='\t')
dataarray = np.array(data)
x = dataarray[:,0:3]
y = dataarray[:,3]
def begin(x,y):
x_train,x_test,y_train,y_test = train_test_split(x,y)
score = 0
k = 0
for i in range(1,22):
knn = kneighborsclassifier(n_neighbors=i)
knn.fit(x_train,y_train)
ks = knn.score(x_test,y_test)
if ks > score:
score = ks
k = i
sc = 0
l =
for i in range(0,1000):
begin(x,y)
sc+=score
print('平均正確率為:',sc/1000)
print('最佳k值為',max(l, key=l.count))
遺留問題:無論對資料進行何種預處理,正確率一直固定在0.8280000000000016,最佳k值一直為19。
標準化:
from sklearn import preprocessing
x_scaled = preprocessing.scale(x)
sc = 0
l =
for i in range(0,100):
begin(x_scaled,y)
sc+=score
print('平均正確率為:',sc/100)
print('最佳k值為',max(l, key=l.count))
歸一化:
min_max_scaler = preprocessing.minmaxscaler()
x_minmax = min_max_scaler.fit_transform(x)
sc = 0
l =
for i in range(0,100):
begin(x_minmax,y)
sc+=score
print('平均正確率為:',sc/100)
print('最佳k值為',max(l, key=l.count))
正則化:
x_normalized = preprocessing.normalize(x, norm='l2')
sc = 0
l =
for i in range(0,100):
begin(x_normalized,y)
sc+=score
print('平均正確率為:',sc/100)
print('最佳k值為',max(l, key=l.count))
問題分析:懷疑問題出在begin()函式的引數命名上,不應該用x,y
但在同一次切分的情況下,歸一化後的準確率比未進行任何處理的準確率高出0.132。
import numpy as np
import pandas as pd
from sklearn.neighbors import kneighborsclassifier
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
data = pd.read_csv('./datingtestset2.txt',sep = '\t',header = none)
dataarray = np.array(data)
x = dataarray[:,0:3]
y = dataarray[:,3]
x_train,x_test,y_train,y_test = train_test_split(x,y)
min_max_scaler = preprocessing.minmaxscaler()
x_train_minmax = min_max_scaler.fit_transform(x_train)
x_test_minmax = min_max_scaler.fit_transform(x_test)
knn = kneighborsclassifier(n_neighbors=19)
knn.fit(x_train,y_train)
knn.score(x_test,y_test)
#未進行處理的資料準確率為0.8
knn = kneighborsclassifier(n_neighbors=19)
knn.fit(x_train_minmax,y_train)
knn.score(x_test_minmax,y_test)
#歸一化的資料準確率為0.932
機器學習 k 近鄰演算法
一.k 近鄰演算法概述 簡單地說,k 近鄰演算法採用測量不同特徵值之間的距離方法進行分類。k 近鄰演算法 knn 它的工作原理是 存在乙個樣本資料集,也稱訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將資料的每個特徵與樣本集合中資...
機器學習 K近鄰演算法
用例一 from sklearn.neighbors import nearestneighbors import numpy as np x np.array 1,1 2,1 3,2 1,1 2,1 3,2 nbrs nearestneighbors n neighbors 2,algorithm...
學習筆記 K 近鄰演算法
一 k 近鄰演算法概述 適用於 數值型和標量型 1 收集資料 2 準備資料 向量點距離 3 按照距離遞增次序排序 4 選取與當前距離最小的k個點 5 確定選擇k個點所在類別的頻率 6 判斷當前點的的類別 二 k 近鄰演算法實現 python語言實現 共有資料1000行,含有三個資料特徵 每年獲得的飛...