用python實(shí)現(xiàn)k近鄰算法的示例代碼
K近鄰算法(或簡(jiǎn)稱kNN)是易于理解和實(shí)現(xiàn)的算法,而且是你解決問題的強(qiáng)大工具。
什么是kNN
kNN算法的模型就是整個(gè)訓(xùn)練數(shù)據(jù)集。當(dāng)需要對(duì)一個(gè)未知數(shù)據(jù)實(shí)例進(jìn)行預(yù)測(cè)時(shí),kNN算法會(huì)在訓(xùn)練數(shù)據(jù)集中搜尋k個(gè)最相似實(shí)例。對(duì)k個(gè)最相似實(shí)例的屬性進(jìn)行歸納,將其作為對(duì)未知實(shí)例的預(yù)測(cè)。
相似性度量依賴于數(shù)據(jù)類型。對(duì)于實(shí)數(shù),可以使用歐式距離來計(jì)算。其他類型的數(shù)據(jù),如分類數(shù)據(jù)或二進(jìn)制數(shù)據(jù),可以用漢明距離。
對(duì)于回歸問題,會(huì)返回k個(gè)最相似實(shí)例屬性的平均值。對(duì)于分類問題,會(huì)返回k個(gè)最相似實(shí)例屬性出現(xiàn)最多的屬性。
kNN如何工作
kNN屬于基于實(shí)例算法簇的競(jìng)爭(zhēng)學(xué)習(xí)和懶惰學(xué)習(xí)算法。
基于實(shí)例的算法運(yùn)用數(shù)據(jù)實(shí)例(或數(shù)據(jù)行)對(duì)問題進(jìn)行建模,進(jìn)而做出預(yù)測(cè)決策。kNN算法算是基于實(shí)例方法的一種極端形式,因?yàn)槠浔A羲械挠?xùn)練集數(shù)據(jù)作為模型的一部分。
kNN是一個(gè)競(jìng)爭(zhēng)學(xué)習(xí)算法,因?yàn)闉榱俗龀鰶Q策,模型內(nèi)部元素(數(shù)據(jù)實(shí)例)需要互相競(jìng)爭(zhēng)。 數(shù)據(jù)實(shí)例之間客觀相似度的計(jì)算,促使每個(gè)數(shù)據(jù)實(shí)例都希望在競(jìng)爭(zhēng)中“獲勝”或者盡可能地與給定的未知數(shù)據(jù)實(shí)例相似,繼而在預(yù)測(cè)中做出貢獻(xiàn)。
懶惰學(xué)習(xí)是指直到需要預(yù)測(cè)時(shí)算法才建立模型。它很懶,因?yàn)樗辉谧詈笠豢滩砰_始工作。優(yōu)點(diǎn)是只包含了與未知數(shù)據(jù)相關(guān)的數(shù)據(jù),稱之為局部模型。缺點(diǎn)是,在大型訓(xùn)練數(shù)據(jù)集中會(huì)重復(fù)相同或相似的搜索過程,帶來昂貴的計(jì)算開銷。
最后,kNN的強(qiáng)大之處在于它對(duì)數(shù)據(jù)不進(jìn)行任何假設(shè),除了任意兩個(gè)數(shù)據(jù)實(shí)例之間距離的一致計(jì)算。因此,它被稱為成為無參數(shù)或者非線性的,因?yàn)樗鼪]有預(yù)設(shè)的函數(shù)模型。
用python寫程序真的好舒服。
import numpy as np
def read_data(filename):
'''讀取文本數(shù)據(jù),格式:特征1 特征2 …… 類別'''
f=open(filename,'rt')
row_list=f.readlines() #以每行作為列表
f.close()
data_array=[]
labels_vector=[]
while True:
if not row_list:
break
row=row_list.pop(0).strip().split('\t') #去除換行號(hào),分割制表符
temp_data_row=[float(a) for a in row[:-1]] #將字符型轉(zhuǎn)換為浮點(diǎn)型
data_array.append(temp_data_row) #取特征值
labels_vector.append(row[-1]) #取最后一個(gè)作為類別標(biāo)簽
return np.array(data_array),np.array(labels_vector)
def classify(test_data,dataset,labels,k):
'''分類'''
diff_dis_array=test_data-dataset #使用numpy的broadcasting
dis_array=(np.add.reduce(diff_dis_array**2,axis=-1))**0.5 #求距離
dis_array_index=np.argsort(dis_array) #升序距離的索引
class_count={}
for i in range(k):
temp_label=labels[dis_array_index[i]]
class_count[temp_label]=class_count.get(temp_label,0)+1 #獲取類別及其次數(shù)的字典
sorted_class_count=sorted(class_count.items(), key=lambda item:item[1],reverse=True) #字典的值按降序排列
return sorted_class_count[0][0] #返回元組列表的[0][0]
def normalize(dataset):
'''數(shù)據(jù)歸一化'''
return (dataset-dataset.min(0))/(dataset.max(0)-dataset.min(0))
k=3 #近鄰數(shù)
test_data=[0,0] #待分類數(shù)據(jù)
data,labels=read_data('testdata.txt')
print('數(shù)據(jù)集:\n',data)
print('標(biāo)簽集:\n',labels)
result=classify(test_data,normalize(data),labels,k)
print('分類結(jié)果:',result)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python opencv3實(shí)現(xiàn)人臉識(shí)別(windows)
這篇文章主要為大家詳細(xì)介紹了python opencv3實(shí)現(xiàn)人臉識(shí)別程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
anaconda升級(jí)sklearn版本的實(shí)現(xiàn)方法
這篇文章主要介紹了anaconda升級(jí)sklearn版本的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
python異步Web框架sanic的實(shí)現(xiàn)
這篇文章主要介紹了python異步Web框架sanic的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
python開發(fā)簡(jiǎn)單的命令行工具簡(jiǎn)介
這篇文章主要介紹了python開發(fā)簡(jiǎn)單的命令行工具實(shí)例的相關(guān)資料,需要的朋友可以參考下2023-02-02
Python實(shí)現(xiàn)Canny及Hough算法代碼實(shí)例解析
這篇文章主要介紹了Python實(shí)現(xiàn)Canny與Hough算法代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
python如何獲取文件當(dāng)前位置和定位某個(gè)位置
這篇文章主要介紹了python如何獲取文件當(dāng)前位置和定位某個(gè)位置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
卷積神經(jīng)網(wǎng)絡(luò)經(jīng)典模型及其改進(jìn)點(diǎn)學(xué)習(xí)匯總
這篇文章主要為大家介紹了卷積神經(jīng)網(wǎng)絡(luò)經(jīng)典模型及其改進(jìn)點(diǎn)學(xué)習(xí)匯總,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
python 爬取學(xué)信網(wǎng)登錄頁(yè)面的例子
今天小編就為大家分享一篇python 爬取學(xué)信網(wǎng)登錄頁(yè)面的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08

