機器學習經典演算法筆記 KNN

2021-09-27 13:38:53 字數 4127 閱讀 2460

這裡面涉及到一些演算法實現的包,比如得到的每個點,求距離後怎麼處理的問題。

# 前面求歐氏距離就不贅述了,這裡主要是補充一點求出結果後怎麼處理的問題

nearest = np.argsort(distances)

# 這裡對每個距離進行排列,得出index

# 假設k=6的話

topx =

[y_train[i]

for i in nearest[

:k]]

# y_train[i] 是標籤,得到的是乙個類別列表

# 下一步是求出類別列表中哪種類別是最多的

from collections import counter

votes = counter(topx)

# 這裡counter函式返回的是乙個字典型別,每個類別對應的數量字典

votes.most_common(1)

[0][

0]# 字典中最多的一類是 most_common返回的是元組列表,引數1是最多的一類

下面是用sklearn庫來呼叫實現knn演算法

from sklearn.neighbors import kneighborsclassifier

knn_classfier = kneighborsclassifier(n_neighbors=6)

# 這裡的6即是k值

knn_classfier.fit(x_train,y_train)

# 第乙個引數是訓練資料集,第二個引數是標籤向量

knn_classfier.predict(x)

# 這裡x是輸入的待**的值,這是個向量

判斷機器學習演算法的效能

shuffle_indexes = np.random.permutation(

len(x)

)# 隨機生成len(x)個索引

test_ratio =

0.2# 測試資料集比例

test_size =

int(

len(x)

* test_ratio)

test_indexes = shuffle_indexes[

:test_size]

train_indexes = shuffle_indexes[test_size:

]x_train = x[train_indexes]

# 訓練資料集

y_train = y[train_indexes]

x_test = x[test_indexes]

# 測試資料集

y_test = y[test_indexes]

"""首先是訓練訓練資料集中的樣本

然後對測試資料集進行**

最後比對**資料集中的label中一樣的比例,來**準確率

"""y_predict = knn_classfier.predict(x_test)

sum(y_predict == y_test)

/len

(y_test)

# 計算準確率

我們也可以使用sklearn中自帶的訓練資料集和測試資料集分離器

from sklearn.model_selection import train_test_split

x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=

0.2)

# 接下來的步驟同上

接下來是乙個例子,手寫數字資料集

import matplotlib.pyplot as plt

from sklearn import datasets

digits = datasets.load_digits(

)x = digits.data

y = digits.target

x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=

0.2)

# 分離測試資料集和訓練資料集

# 接下來就是同上了,沒有什麼好說的

# 求準確度的有個可以呼叫的函式

from sklearn.metrics import accuracy_score

accuracy_score(y_test,y_predict)

下面引入超引數

這裡的超引數,打個比方,k=3的情況,三個點,其中兩個同型別的點距離測試值比較遠,而另乙個型別的點比較近,這種情況下,只是單一的考慮數量來決定該點是哪種型別,明顯是不太妥當的,應該是適當的考慮一下權值,比如說把距離的倒數作為權值考慮進去,距離越大的權值越小

knn_classfier = kneighborsclassifier(n_neighbors=

6, weights =

)# 這裡可以選擇uniform/distance

""" 這裡還有一點需要提出來的是,距離問題,之前我們提到的距離都是指尤拉距離,但是這是不嚴謹的,

準確的來說應該用明可夫斯基距離,當p=2時,明式距離才等於尤拉距離

"""knn_classfier = kneighborsclassifier(n_neighbors=

6, weights =

"distance"

, p = ?)

# p可以不斷取值來確定最大的準確度,這裡要強調的是,只有weights = "distance",才能有p引數

網格搜尋(grid search)

param_grid =[,

]from sklearn.model_selection import gridsearchcv

knn_clf = kneighborsclassifier(

)# 定義乙個空的分類器

grid_search = gridsearchcv(knn_clf, param_grid)

grid_search.fit(x_train, y_train)

grid_search.best_params_ # 最佳引數以字典的形式返回給你

grid_search.best_score_ # 最佳引數對應的準確度

# 下面是怎麼用這個分類器

knn_clf = grid_search.best_estimator_ # 這裡返回的是最佳的分類器

knn_clf.predict(x_test)

knn_clf.score(x_test, y_test)

# 返回準確率

# 其實這裡網格搜尋可以選擇並行處理來加快處理速度

grid_search = gridsearchcv(knn_clf, param_grid, n_jobs=m)

# 這裡的m是採用的m核處理,當m=-1時,是計算機所有的核都在處理這個問題

資料歸一化處理

對於一些資料,相差太大的話,在求距離的時候會有很多不便之處,比如座標為(0.1,1000)和(0.5,1633)這樣求距離的話,顯然是不太合適的,所以需要對資料進行處理,這裡一般的處理方式是 xscale = (x-xmin)/(xmax-xmin) 把所有的距離對映到0-1之間,適合於分布有明顯的邊界,比如說考試分數多是在0-100,無明顯邊界,比如說年薪有的人10000,有的人100000000,根本無法對映到一塊,這時候我們需要均值方差歸一化 xscale = (x-xmean)/s 其中xmean是均值,s 為方差

from sklearn.preprocessing import standardscaler

standarscaler = standardscaler(

)standarscaler.fit(x_train)

x_train = standarscaler.transform(x_train)

# 對矩陣進行歸一化之後產生的結果,返回x_train

x_test_standard = standarscaler.transform(x_test)

# 對矩陣進行歸一化之後產生的結果,返回x_test

knn演算法到此結束了

機器學習經典演算法1 knn

一 演算法簡要 物以類聚人以群分 是生活的現實寫照,knn就是讓那些距離近的人或物歸為一類。問題定義 基於給定的一些示例 事物的屬性features和該事物的分類class 對於某個特定或一系列事物的features,來對未定事物進行分類classifying。一般把給出了事物features和cl...

機器學習 演算法 KNN

參考 我感覺knn是最簡單的乙個機器學習演算法,實現很簡單,效果也一般般 就是算個euclideam distance,還有一些可以優化的地方,比如可以加權,第二篇文章提到了 python 如下 coding utf 8 created on aug 30,2013 author blacklaw ...

機器學習 KNN 演算法

一 主要目的 在樣本空間中,找到與待估計的樣本最臨近的k個鄰居,用這幾個鄰居的類別來估計待測樣本的類別 二 適用性 樣本容量比較大的類域的自動分類,而樣本容量較小的類域則容易誤分。尤其適用於樣本分類邊界不規則的情況 三 不足 1 當樣本不平衡時,比如乙個類的樣本容量很大,其他類的樣本容量很小,輸入乙...