K 近鄰演算法(2019 07 17學習總結)

2021-09-25 08:41:42 字數 3655 閱讀 5942

優點:精度高,對異常值不敏感,無資料輸入假定(不理解)

缺點:計算複雜度高(需要計算新的資料點與樣本集中每個資料的「距離」,以判斷是否是前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行,含有三個資料特徵 每年獲得的飛...