Task 05|基于KNN的手寫數字識別

KNN 算法的思想

KNN(K Neareast Neighbours) 又稱 K 鄰近算法旱幼,是一種直觀明了的算法查描,可以理解為“近朱者赤近墨者黑”突委。

你也許聽過一句話“一個人的收入是身邊交往最多的五個人的收入的平均值”,這就是“密友五次理論”冬三,這個理論恰好就體現了 KNN 算法的思想匀油。


以上圖為例,假設有兩種數據勾笆,紅色五角星和藍色三角形敌蚜,現在我們不知道綠色方塊是屬于哪一類,我們該怎么判斷呢窝爪?

如果我們用 KNN 算法的思想來判斷弛车,找到綠色方塊最近的幾個鄰居齐媒,根據最近幾個鄰居的來推測綠色方塊是屬于哪一類。

假設 K = 5纷跛,距離綠色方塊最近的 5 個鄰居是 3 藍 + 2 紅喻括;

假設 K = 10,距離綠色方塊最近的 10 個鄰居是 6 紅 + 4藍

由上面的步驟中還有 2 個問題需要確定:

1. 怎么計算距離

兩個樣本間的距離代表了樣本之間的相似度贫奠,距離越大差異性越大唬血;距離越小相似性越高。 KNN 中常用的距離計算方式有

  • 歐氏距離

    歐氏距離是我們最常用的距離公式唤崭,在 n 維空間中的歐式距離可以表示為:

  • 曼哈頓距離

    曼哈頓距離等于兩個點在坐標系上絕對軸距總和:

2. 怎么判定類別

  • 少數服從多數拷恨,取 K 個樣本中類別最多的為預測類別
  • 加權法,依據離預測樣本的距離遠近設定權值谢肾,越近的權重越大

解決了這兩個問題后我們來梳理一下 KNN 算法的流程腕侄,KNN 模型的建立過程大概有這幾部:

  1. 給定測試樣本,計算它與訓練集中每一個樣本的距離
  2. 找出距離最近的 K 個樣本勒叠,作為測試樣本的鄰近
  3. 依據這 K 個鄰近樣本的類別來預測樣本的類別

K 值的選擇

那么問題來了兜挨,怎么選擇 K 值呢眯分? K 值的大小直接影響了 KNN 的預測結果。 如果 K 值過小噪舀,如果鄰近點是噪聲點,那這個噪聲的影響會過大与倡,這樣會產生過擬合昆稿; 如果 K 值過大溉潭,那么距離較遠的樣本也會對預測結果造成影響,雖然這樣能減小誤差馋贤,但是也會讓整個模型變得簡單畏陕,產生欠擬合的情況。 在實際應用中犹芹,一般采用交叉驗證的方式選擇 K 值,選擇在較小的范圍实昨,同時在驗證集上準確率最高的最終確定為 K 值荒给。

動手練習

用 KNN 算法來進行手寫數字分類刁卜,使用的是sklearn中自帶的數據集。

import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_digits
from sklearn.metrics import accuracy_score
from sklearn import preprocessing
import matplotlib.pyplot as plt

# 加載數據
digits = load_digits()
data = digits.data
print(data.shape)

# 查看第一個數字圖像
print(digits.target[0])
plt.gray()
plt.imshow(digits.images[0])
plt.show()

分割數據為訓練集和測試集挑辆,由于要進行距離計算鱼蝉,而且我們只關心數字的形狀魁亦,所以先將圖像數據進行Z-Score規(guī)范化會更好:

train_x, test_x, train_y, test_y = train_test_split(data, digits.target, test_size = 0.2, random_state = 2020)

# Z-Score
scaler = preprocessing.StandardScaler()
train_scaled_x = scaler.fit_transform(train_x)
test_scaled_x = scaler.transform(test_x)

用 KNN 模型進行訓練和預測:

knn = KNeighborsClassifier()
knn.fit(train_scaled_x, train_y)
pred_y = knn.predict(test_scaled_x)

print("knn accuracy: %.4f" % accuracy_score(test_y, pred_y))

最后預測準確度為 0.9861 KNN 模型雖然簡單洁奈,但有時效果還是不錯的~~

總結一下 KNN 算法的優(yōu)缺點:

  • 優(yōu)點:

    • 模型簡單,易于理解利术、易于實現低矮、無需估計參數
    • 適合對稀有事件進行分類
    • 特別適合多分類問題
  • 缺點:

    • 對測試樣本分類時的計算量大,內存開銷大轮蜕,評分慢
    • 可解釋性差良姆,無法給出決策樹那樣的規(guī)則
    • 當樣本不平衡時幔戏,在選取 K 個鄰居時容易造成大容量樣本占多數的情況,影響分類結果
    • 沒有提前訓練過程痊剖,直到要分類預測時才對進行,這是一種消極學習法

END

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末找颓,一起剝皮案震驚了整個濱河市击狮,隨后出現的幾起案子益老,更是在濱河造成了極大的恐慌,老刑警劉巖档冬,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酷誓,死亡現場離奇詭異态坦,居然都是意外死亡,警方通過查閱死者的電腦和手機娘扩,發(fā)現死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門壮锻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猜绣,“玉大人,你說我怎么就攤上這事牺陶±敝” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵狮鸭,是天一觀的道長。 經常有香客問我灾部,道長惯退,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任锁蠕,我火速辦了婚禮匿沛,結果婚禮上榛鼎,老公的妹妹穿的比我還像新娘。我一直安慰自己抡笼,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著框沟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拧晕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音队丝,去河邊找鬼。 笑死臭墨,一個胖子當著我的面吹牛,可吹牛的內容都是我干的胧弛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼践图!你這毒婦竟也來了?” 一聲冷哼從身側響起德崭,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤眉厨,失蹤者是張志新(化名)和其女友劉穎兽狭,沒想到半個月后憾股,有當地人在樹林里發(fā)現了一具尸體服球,經...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡斩熊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年粉渠,在試婚紗的時候發(fā)現自己被綠了圾另。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖饺著,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情幼衰,我是刑警寧澤渡嚣,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站绝葡,受9級特大地震影響藏畅,放射性物質發(fā)生泄漏。R本人自食惡果不足惜愉阎,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一榜旦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧澡屡,春花似錦咐旧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肉盹,卻和暖如春上忍,著一層夾襖步出監(jiān)牢的瞬間纳本,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工吓笙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留面睛,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓土涝,卻偏偏與公主長得像但壮,于是被迫代替她去往敵國和親茵肃。 傳聞我的和親對象是個殘疾皇子袭祟,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內容