機器學(xué)習(xí)系列教程-KNN-純手寫

代碼編輯工具:jupyter notebook

01 理論講解

KNN算法
1. KNN算法特點:
KNN算法
2. 算法原理
KNN算法

為了簡化問題卦停,這里只關(guān)心樣本的兩個特征,腫瘤大小和發(fā)現(xiàn)腫瘤的時間奔滑。對應(yīng)紅色(樣本數(shù)據(jù))點表示良性腫瘤,藍色(樣本數(shù)據(jù))表示惡性腫瘤,綠色(預(yù)測數(shù)據(jù))的點表示我們要預(yù)測的數(shù)據(jù)磁携,k=3表示在所有的點里,找到離這個綠色最近的三個點良风,然后判斷是紅色點多還是藍色點多谊迄,綠色點和多的一邊同類闷供。
例如:這里的綠色點,它周圍的3個點都是藍色點统诺,所以這個綠色點應(yīng)該屬于惡性腫瘤歪脏。

3. 歐拉距離

計算距離我們這里采用歐拉距離,就是兩個點對應(yīng)維度上的坐標(biāo)值相減粮呢、平方婿失、求和、開根號的過程

歐拉距離-2維,平面兩個點的距離:


歐拉距離-2維

歐拉距離-3維,三維立體空間兩個點的距離:


歐拉距離-3維

歐拉距離-n維,推導(dǎo)到n空間依然有效


歐拉距離-n維

歐拉距離-n維符-簡潔版:


歐拉距離-n維符-簡潔版

02 代碼實戰(zhàn)

import numpy as np  #導(dǎo)入numpy啄寡,用于科學(xué)計算豪硅,如,矩陣運算
import matplotlib.pyplot as plt #導(dǎo)入圖像顯示庫pyplot这难,如折線圖
import random #導(dǎo)入隨機函數(shù)庫舟误,生成隨機數(shù)
##### 10個樣本數(shù)據(jù)
data_X = [
    [-0.32236679, -1.38462662],#標(biāo)簽值:0
    [-0.60582652, -1.93436036],#標(biāo)簽值:0
    [-2.37209117, -0.34753905],#標(biāo)簽值:0
    [-0.13360596,  0.96327911],#標(biāo)簽值:0
    [-1.43553756, -0.84890974],#標(biāo)簽值:0
    [ 3.70753694,  0.98062288],#標(biāo)簽值:1
    [ 2.029152  , -0.1819102 ],#標(biāo)簽值:1
    [ 5.45626862, -1.20479895],#標(biāo)簽值:1
    [ 4.07688348, -0.29181106],#標(biāo)簽值:1
    [ 4.22392082, -2.92426277] #標(biāo)簽值:1
]
data_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1] #標(biāo)簽數(shù)據(jù),0代表良性腫瘤姻乓,1代表惡性腫瘤嵌溢,是個二分類問題
data_y_name = ['良性腫瘤','惡性腫瘤']#分類名稱,0:良性腫瘤蹋岩,1:惡性腫瘤
X_train = np.array(data_X)  #轉(zhuǎn)為numpy ndarray格式
y_train = np.array(data_y)  #轉(zhuǎn)為numpy ndarray格式
x1 = X_train[y_train == 0,0] #在下標(biāo)為0的列上赖草,標(biāo)簽值為0的所有值,作為x1
y1 = X_train[y_train == 0,1] #在下標(biāo)為0的列上剪个,標(biāo)簽值為0的所有值秧骑,作為y1
plt.scatter(x1,y1,label="良性腫瘤") #把樣本數(shù)據(jù)x1,y1顯示在圖像上

x2 = X_train[y_train == 1,0] #在下標(biāo)為0的列上扣囊,標(biāo)簽值為1的所有值乎折,作為x2
y2 = X_train[y_train == 1,1] #在下標(biāo)為1的列上,標(biāo)簽值為1的所有值侵歇,作為y2
plt.scatter(x2,y2,label="惡性腫瘤") #把樣本數(shù)據(jù)x2骂澄,y2顯示在圖像上

x = np.array([2.093607318, -0.565731514])  #把需要預(yù)測的x顯示在圖像上
plt.scatter(x[0],x[1],label="預(yù)測點")

plt.show() #顯示圖像,效果如下
image.png
#通過歐拉距離計算預(yù)測點到每一個樣本點之前的距離
distances = []
for x_train in data_X:
    d = np.sqrt(np.sum((x_train - x) ** 2))
    distances.append(d)
distances
[2.5509841405146267,
 3.02656372208528,
 4.471025714203831,
 2.7015463116527125,
 3.540487745720093,
 2.235169062199137,
 0.38919569511900787,
 3.422849429893747,
 2.0021030817310623,
 3.178192143708816]
#對計算出來的結(jié)果進行排序惕虑,返回排序后的下標(biāo)順序
sort_distances = np.argsort(distances)
sort_distances
array([6, 8, 5, 0, 3, 1, 9, 7, 4, 2], dtype=int64)
k = 4 #設(shè)置KNN的k值為3
X_top = X_train[sort_distances[0:k]] #計算舉例最近的三個點
X_top

array([[ 2.029152  , -0.1819102 ],
       [ 4.07688348, -0.29181106],
       [ 3.70753694,  0.98062288],
       [-0.32236679, -1.38462662]])
#離的最近的k個點和預(yù)測點之前畫虛線
for top in X_top:
    line_x = [top[0],x[0]]
    linx_y = [top[1],x[1]]
    plt.plot(line_x,linx_y,':')

#畫樣本點
plt.scatter(x1,y1) #良性腫瘤
plt.scatter(x2,y2) #惡性腫瘤

#畫預(yù)測點
plt.scatter(x[0],x[1]) 

#圖像顯示
plt.show()
image.png
#通過距離最近的k個值坟冲,獲取指定樣本的標(biāo)簽
y_top_k = y_train[sort_distances[0:k]]
y_top_k
array([1, 1, 1, 0])
from collections import Counter
#統(tǒng)計不同分類標(biāo)簽的個數(shù)
votes = Counter(y_top6)
votes
Counter({1: 3, 0: 1})
#獲取最多分類的那個標(biāo)簽值
lvalue = votes.most_common(1)[0][0]
lvalue
1
#通過標(biāo)簽值顯示對于的分類名稱
data_y_name[lvalue]
'惡性腫瘤'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市溃蔫,隨后出現(xiàn)的幾起案子健提,更是在濱河造成了極大的恐慌,老刑警劉巖伟叛,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件私痹,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機紊遵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門雹锣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人癞蚕,你說我怎么就攤上這事』愿纾” “怎么了桦山?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長醋旦。 經(jīng)常有香客問我恒水,道長,這世上最難降的妖魔是什么饲齐? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任钉凌,我火速辦了婚禮,結(jié)果婚禮上捂人,老公的妹妹穿的比我還像新娘御雕。我一直安慰自己,他們只是感情好滥搭,可當(dāng)我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布酸纲。 她就那樣靜靜地躺著,像睡著了一般瑟匆。 火紅的嫁衣襯著肌膚如雪闽坡。 梳的紋絲不亂的頭發(fā)上愁溜,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天疾嗅,我揣著相機與錄音,去河邊找鬼冕象。 笑死,一個胖子當(dāng)著我的面吹牛交惯,可吹牛的內(nèi)容都是我干的次泽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼席爽,長吁一口氣:“原來是場噩夢啊……” “哼意荤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起只锻,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤玖像,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捐寥,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡笤昨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了握恳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞒窒。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖乡洼,靈堂內(nèi)的尸體忽然破棺而出崇裁,到底是詐尸還是另有隱情,我是刑警寧澤束昵,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布拔稳,位于F島的核電站,受9級特大地震影響锹雏,放射性物質(zhì)發(fā)生泄漏巴比。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一礁遵、第九天 我趴在偏房一處隱蔽的房頂上張望轻绞。 院中可真熱鬧,春花似錦榛丢、人聲如沸铲球。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稼病。三九已至,卻和暖如春掖鱼,著一層夾襖步出監(jiān)牢的瞬間然走,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工戏挡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芍瑞,地道東北人。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓褐墅,卻偏偏與公主長得像拆檬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子妥凳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,665評論 2 354

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