本文實(shí)例講述了機(jī)器學(xué)習(xí)之KNN算法原理及Python實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:
創(chuàng)新互聯(lián)技術(shù)團(tuán)隊(duì)10余年來(lái)致力于為客戶提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、成都品牌網(wǎng)站建設(shè)、成都全網(wǎng)營(yíng)銷(xiāo)推廣、搜索引擎SEO優(yōu)化等服務(wù)。經(jīng)過(guò)多年發(fā)展,公司擁有經(jīng)驗(yàn)豐富的技術(shù)團(tuán)隊(duì),先后服務(wù)、推廣了上1000家網(wǎng)站,包括各類(lèi)中小企業(yè)、企事單位、高校等機(jī)構(gòu)單位。文中代碼出自《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》CH02,可參考本站:
機(jī)器學(xué)習(xí)實(shí)戰(zhàn) (Peter Harrington著) 中文版
機(jī)器學(xué)習(xí)實(shí)戰(zhàn) (Peter Harrington著) 英文原版 [附源代碼]
KNN算法介紹
KNN是一種監(jiān)督學(xué)習(xí)算法,通過(guò)計(jì)算新數(shù)據(jù)與訓(xùn)練數(shù)據(jù)特征值之間的距離,然后選取K(K>=1)個(gè)距離最近的鄰居進(jìn)行分類(lèi)判(投票法)或者回歸。若K=1,新數(shù)據(jù)被簡(jiǎn)單分配給其近鄰的類(lèi)。
KNN算法實(shí)現(xiàn)過(guò)程
(1)選擇一種距離計(jì)算方式, 通過(guò)數(shù)據(jù)所有的特征計(jì)算新數(shù)據(jù)與已知類(lèi)別數(shù)據(jù)集中的數(shù)據(jù)點(diǎn)的距離;
(2)按照距離遞增次序進(jìn)行排序,選取與當(dāng)前距離最小的k個(gè)點(diǎn);
(3)對(duì)于離散分類(lèi),返回k個(gè)點(diǎn)出現(xiàn)頻率最多的類(lèi)別作預(yù)測(cè)分類(lèi);對(duì)于回歸則返回k個(gè)點(diǎn)的加權(quán)值作為預(yù)測(cè)值;
算法關(guān)鍵
(1)數(shù)據(jù)的所有特征都要做可比較的量化
若是數(shù)據(jù)特征中存在非數(shù)值的類(lèi)型,必須采取手段將其量化為數(shù)值。例如樣本特征中包含顏色,可通過(guò)將顏色轉(zhuǎn)換為灰度值來(lái)實(shí)現(xiàn)距離計(jì)算。
(2)樣本特征要做歸一化處理
樣本有多個(gè)參數(shù),每一個(gè)參數(shù)都有自己的定義域和取值范圍,他們對(duì)距離計(jì)算的影響不一樣,如取值較大的影響力會(huì)蓋過(guò)取值較小的參數(shù)。所以樣本參數(shù)必須做一些scale處理,最簡(jiǎn)單的方式就是所有特征的數(shù)值都采取歸一化處置。
(3)需要一個(gè)距離函數(shù)以計(jì)算兩個(gè)樣本之間的距離
距離的定義:歐氏距離、余弦距離、漢明距離、曼哈頓距離等,一般選歐氏距離作為距離度量,但是這是只適用于連續(xù)變量。在文本分類(lèi)這種非連續(xù)變量情況下,漢明距離可以用來(lái)作為度量。通常情況下,如果運(yùn)用一些特殊的算法來(lái)計(jì)算度量的話,K近鄰分類(lèi)精度可顯著提高,如運(yùn)用大邊緣最近鄰法或者近鄰成分分析法。
(4)確定K的值
K值選的太大易引起欠擬合,太小容易過(guò)擬合。交叉驗(yàn)證確定K值。
KNN分類(lèi)
分類(lèi)算法常采用多數(shù)表決決定。一個(gè)缺點(diǎn)是出現(xiàn)頻率較多的樣本將會(huì)主導(dǎo)測(cè)試點(diǎn)的預(yù)測(cè)結(jié)果。解決這個(gè)缺點(diǎn)的方法之一是在進(jìn)行分類(lèi)時(shí)將K個(gè)鄰居到測(cè)試點(diǎn)的距離考慮進(jìn)去。若樣本到測(cè)試點(diǎn)距離d,則選1/d為該鄰居的權(quán)重,統(tǒng)計(jì)k個(gè)鄰居所有類(lèi)標(biāo)簽的權(quán)重和,值大的就是新數(shù)據(jù)點(diǎn)的預(yù)測(cè)類(lèi)標(biāo)簽。
KNN回歸
KNN回歸是取K個(gè)鄰居類(lèi)標(biāo)簽值得加權(quán)作為新數(shù)據(jù)點(diǎn)的預(yù)測(cè)值。
優(yōu)缺點(diǎn)
(1)KNN算法的優(yōu)點(diǎn)
(2)KNN算法缺點(diǎn)
KNN實(shí)現(xiàn)
import numpy as np import operator import matplotlib import matplotlib.pyplot as plt from os import listdir def Create_DataSet(): group = np.array([[1.0, 1.1],[1.0,1.0],[0,0],[0,0.1]]) labels = ['A','A','B','B'] return group,labels