【python+機器學(xué)習(xí)1】python 實現(xiàn) KNN

歡迎關(guān)注哈希大數(shù)據(jù)微信公眾號【哈希大數(shù)據(jù)】

1 KNN算法基本介紹
K-Nearest Neighbor(k最鄰近分類算法)咆蒿,簡稱KNN,是最簡單的一種有監(jiān)督的機器學(xué)習(xí)算法缭黔。也是一種懶惰學(xué)習(xí)算法蒂破,即開始訓(xùn)練僅僅是保存所有樣本集的信息,直到測試樣本到達才開始進行分類決策惧互。

KNN算法的核心思想:要想確定測試樣本屬于哪一類喇伯,就先尋找所有訓(xùn)練樣本中與該測試樣本“距離”最近的前K個樣本,然后判斷這K個樣本中大部分所屬的類型艾猜,就認為是該測試樣本的類型攀甚。也就是所謂的“近朱者赤近墨者黑”秋度,根據(jù)與其最近的k個樣本的類型決定其自身的類型钱床。因此K的確定和測算距離的方式是影響樣本最終分類準確率的重要因素。

常用的測算距離的方法是多維空間的歐式距離法事期。

其優(yōu)點為:易于理解纸颜,實現(xiàn)簡單,無需估計參數(shù)唠倦,無需訓(xùn)練涮较。

缺點為:需要保存所有的訓(xùn)練數(shù)據(jù),內(nèi)存開銷大候齿,而且訓(xùn)練數(shù)據(jù)較多時會導(dǎo)致很高的算法復(fù)雜度,訓(xùn)練數(shù)據(jù)類型不均勻可能會導(dǎo)致預(yù)測準確率下降周霉。

2 標準數(shù)據(jù)集介紹
我們將采用scikit-learn庫中自帶的鳶尾花數(shù)據(jù)集進行測試润匙≡谢洌可以在D:\anaconda python\pkgs\scikit-learn-0.19.0-np113py36_0\Lib\site-packages\sklearn\datasets\data路徑下查看元數(shù)據(jù),部分數(shù)據(jù)實例如下圖(共計150條數(shù)據(jù))厂财。

image

鳶尾花數(shù)據(jù)集包括鳶尾花的測量數(shù)據(jù)(特征屬性)以及其所屬的類別璃饱。

測量數(shù)據(jù)特征包括: 萼片長度荚恶、萼片寬度、花瓣長度谒撼、花瓣寬度

所屬類別有三類: Iris Setosa廓潜,Iris Versicolour,Iris Virginica 呻畸,用數(shù)字0,1,2表示悼院。

#通過python加載鳶尾花數(shù)據(jù)集

from sklearn import datasetsiris = datasets.load_iris()

# 獲取鳶尾花屬性數(shù)據(jù)并查看數(shù)據(jù)特征

iris_X = iris.dataprint(iris.data.shape)

# 獲取鳶尾花類別數(shù)據(jù)

iris_y = iris.target

拆分****數(shù)據(jù)集****為訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù):

# 方法一:使用python的train_test_split庫進行數(shù)據(jù)集拆分

iris_train_X , iris_test_X, iris_train_y ,iris_test_y = train_test_split(iris_X, iris_y, test_size=0.2,random_state=0)

# 方法二:隨機選擇部分數(shù)據(jù)(20%)作為測試集(適用于少量數(shù)據(jù))

np.random.seed(0)
select = np.random.permutation(len(iris_y))
iris_X_train = iris_X[select[:-30]]
iris_y_train = iris_y[indices[:-30]]
iris_X_test = iris_X[indices[-30:]]
iris_y_test = iris_y[indices[-30:]]

3 KNN算法python實現(xiàn)

在此我們將直接使用python的scikit-learn 庫中的 neighbors.KNeighborsClassifier類据途,通過KNN算法對測試集中鳶尾花進行分類。

首先進行類的初始化

knn =KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=1, n_neighbors=5, p=2, weights='uniform')

參數(shù)介紹

l n_neighbors=5爽醋,就是KNN中的k便脊,默認為5。

l weights='uniform'遂赠,是距離計算中使用的權(quán)重,默認為'uniform' 是等權(quán)加權(quán)筷弦,也可以選'distance'是按照距離的倒數(shù)進行加權(quán)抑诸,也可以自己設(shè)置其他加權(quán)方式。(給距離增加權(quán)重奸绷,如果越近的距離權(quán)重越高层玲,能在一定程度上避免樣本分布不平均的問題)

l metric='minkowski'辛块、p=2,表示采用的是歐氏距離的計算润绵。

計算距離的方式默認為閔可夫斯基距離,是一組距離的定義授药。

兩個n維變量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的閔可夫斯基距離:

image

悔叽。

其中p=1時娇澎,為曼哈頓距離睹晒;p=2時,為歐氏距離戚啥;p→∞時锉试,為切比雪夫距離。根據(jù)變參數(shù)p的不同拖云,閔氏距離可以表示一類的距離。

l algorithm='auto'乏苦,是分類時采取的算法尤筐,有'brute'、'kd_tree'和'ball_tree'拢驾,三種默認按照數(shù)據(jù)特征從這三種中選擇最合適的改基。其中kd-tree基于歐氏距離的特性可以快速處理20維以內(nèi)的數(shù)據(jù)集,balltree基于更一般的距離特性稠腊,適合處理高維數(shù)據(jù)鸣哀。(三種算法的具體實現(xiàn)之后會進行詳細介紹)

l leaf_size=30我衬,是kd_tree或ball_tree生成的樹的樹葉(二叉樹中未分枝的節(jié)點)的大小。

l n_job=1井仰,是并行計算的線程數(shù)量破加,默認是1,輸入-1則設(shè)為CPU的內(nèi)核數(shù)合是。

# ****提供數(shù)據(jù)集進行訓(xùn)練

knn.fit(iris_X_train, iris_y_train)

# ****預(yù)測測試集數(shù)據(jù)鳶尾花類型

predict_result = knn.predict(iris_X_test)print(predict_result)

# ****計算預(yù)測的準確率

print(knn.score(iris_X_test, iris_y_test))

4 完整源碼及輸出結(jié)果

!/usr/bin/python
-- coding: utf-8 --
KNN調(diào)用
import numpy as np
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn import datasets

導(dǎo)入鳶尾花數(shù)據(jù)并查看數(shù)據(jù)特征
iris = datasets.load_iris()
print('數(shù)據(jù)量',iris.data.shape)

拆分屬性數(shù)據(jù)
iris_X = iris.data

拆分類別數(shù)據(jù)
iris_y = iris.target

方法一:拆分測試集和訓(xùn)練集,并進行預(yù)測
iris_train_X , iris_test_X, iris_train_y ,iris_test_y = train_test_split(iris_X, iris_y, test_size=0.2,random_state=0)
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(iris_train_X, iris_train_y)
knn.predict(iris_test_X)

方法二:拆分測試集和訓(xùn)練集
np.random.seed(0)
permutation隨機生成0-150的系列
indices = np.random.permutation(len(iris_y))
iris_X_train = iris_X[indices[:-30]]
iris_y_train = iris_y[indices[:-30]]
iris_X_test = iris_X[indices[-30:]]
iris_y_test = iris_y[indices[-30:]]
knn = KNeighborsClassifier()

提供訓(xùn)練集進行順利
knn.fit(iris_X_train, iris_y_train)

預(yù)測測試集鳶尾花類型
predict_result = knn.predict(iris_X_test)
print('預(yù)測結(jié)果',predict_result)

計算預(yù)測的準確率
print('預(yù)測準確率'聪全,knn.score(iris_X_test, iris_y_test))

輸出結(jié)果
"D:\anaconda python\python3.6.exe" D:/machine_learning/coding/knntest.py
數(shù)據(jù)量 (150, 4)
預(yù)測結(jié)果 [0 2 0 0 2 0 2 1 1 1 2 2 2 1 0 1 2 2 0 1 1 2 1 0 0 0 2 1 2 0]
預(yù)測準確率 0.933333333333
Process finished with exit code 0

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末难礼,一起剝皮案震驚了整個濱河市鹤竭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吝岭,老刑警劉巖吧寺,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稚机,死亡現(xiàn)場離奇詭異,居然都是意外死亡赖条,警方通過查閱死者的電腦和手機纬乍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門仿贬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜓氨,你說我怎么就攤上這事队伟。” “怎么了刀荒?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵棘钞,是天一觀的道長宜猜。 經(jīng)常有香客問我硝逢,道長绅喉,這世上最難降的妖魔是什么柴罐? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任憨奸,我火速辦了婚禮,結(jié)果婚禮上似芝,老公的妹妹穿的比我還像新娘板甘。我一直安慰自己盐类,他們只是感情好,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布蝇闭。 她就那樣靜靜地躺著呻引,像睡著了一般吐咳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上韭脊,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天沪羔,我揣著相機與錄音,去河邊找鬼琅豆。 笑死篓吁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的冻押。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稿茉!你這毒婦竟也來了狈邑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎择份,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體良瞧,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年训唱,在試婚紗的時候發(fā)現(xiàn)自己被綠了褥蚯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡况增,死狀恐怖赞庶,靈堂內(nèi)的尸體忽然破棺而出澳骤,到底是詐尸還是另有隱情歧强,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布为肮,位于F島的核電站摊册,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏颊艳。R本人自食惡果不足惜茅特,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棋枕。 院中可真熱鬧白修,春花似錦、人聲如沸戒悠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绸狐。三九已至卤恳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寒矿,已是汗流浹背突琳。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留符相,地道東北人拆融。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像啊终,于是被迫代替她去往敵國和親镜豹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容