這裡面涉及到一些演算法實現的包,比如得到的每個點,求距離後怎麼處理的問題。
# 前面求歐氏距離就不贅述了,這裡主要是補充一點求出結果後怎麼處理的問題
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 當樣本不平衡時,比如乙個類的樣本容量很大,其他類的樣本容量很小,輸入乙...