機器學習 KNN演算法

2021-10-06 09:00:49 字數 3185 閱讀 1497

#knn

k-nn演算法採用測量不同特徵值之間的距離方法進行分類

優點:簡單直觀、精度高、對異常值不敏感

缺點: 計算複雜、空間複雜度高

分類器**:

def

classify0

(inx, dataset, labels, k)

:#分類器**

datasetsize = dataset.shape[0]

#numpy函式shape[0]返回dataset的行數

diffmat = tile(inx,

(datasetsize,1)

)- dataset #在列向量方向重複inx共一次(橫向),行向量方向重複inx共datasetsize次(縱向)

sqdiffmat = diffmat**

2#二維特徵相減後平方

sqdistances = sqdiffmat.

sum(axis=1)

#sum()元素相加,sum(0)列相加,sum(1)行相加

distances = sqdistances**

0.5#開平方

sorteddistindicies = distances.argsort(

)#返回distances中元素從小到大的索引值classcount={} #記錄類別此數的字典

for i in

range

(k):

#排序迴圈

voteilabel = labels[sorteddistindicies[i]

] classcount[voteilabel]

= classcount.get(voteilabel,0)

+1sortedclasscount =

sorted

(classcount.iteritems(),

key=operator.itemgetter(1)

, reverse=ture)

return sortedclasscount[0]

[0]#返回次數最多的類別

距離度量方式:

1、尤拉距離

2、曼哈頓距離

3、切比夫距離

分類器使用詳細**:

knn.pyfrom numpy import

*#模組匯入(科學計算包numpy)

import operator #模組匯入(運算子)

defcreatedataset()

: group = array([[

1.0,

1.1],[

1.0,

1.0],[

0,0]

,[0,

0.1]])

labels=

[『a』, 『a』, 『b』, 『b』]

return group, labels

deffile2matrix

(filename)

:#讀取檔案資料fr = open(filename)

arrayolines = fr.readlines(

) numberoflines =

len(arrayolines)

returnmat = zeros(

(numberoflines,3)

) classlabelvector =

index =

0for line in arrayolines

line = line.strip(

)#擷取回車字元

listfromline = line.split(『\t』)

#分割資料為元素列表

returnmat[index,:]

=listfromline[0:

3]int(listfromline[-1

])) index +=

1return returnmat,classlabelvector

defautonorm

(dataset)

:#歸一化特徵值(平衡各類資料權重)

minvals = dataset.

min(0)

maxvals = dataset.

max(0)

ranges = maxvals - minvals

normdataset = zeros(shape(dataset)

) m = dataset.shape[0]

normdataset = dataset - tile(minvals,

(m,1))

normdataset = nermdataset/tile(ranges,

(m,1))r

return normdataset, ranges, minvals

defdatingclasstest()

:#分類器測試**,計算錯誤率

horatio =

0.10

datingdatamat,datinglables = file2matrix(『datingtestset.txt』)

normmat,ranges, minvals = autonorm(datingdatamat)

m = normmat.shape[0]

numtestvecs =

int(m*horatio)

errorcount =

0.0for i in

range

(numtestvecs)

: classifierresult=classify0(normmat[i,:]

,mornmat[numtestvecs:m,:]

,datinglabels[numtestvecs:m],3

) print 「the classifier came back with

:%d, the real answer is

:%d」 %

(classifierresult, datinglabels[i]

) if(classifierresult != datinglabels[i]

): errorcount +=

1.0 print 「the total errror rate is

:%f」 %

(errorcount/

float

(numtestvecs)

)

機器學習 演算法 KNN

參考 我感覺knn是最簡單的乙個機器學習演算法,實現很簡單,效果也一般般 就是算個euclideam distance,還有一些可以優化的地方,比如可以加權,第二篇文章提到了 python 如下 coding utf 8 created on aug 30,2013 author blacklaw ...

機器學習 KNN 演算法

一 主要目的 在樣本空間中,找到與待估計的樣本最臨近的k個鄰居,用這幾個鄰居的類別來估計待測樣本的類別 二 適用性 樣本容量比較大的類域的自動分類,而樣本容量較小的類域則容易誤分。尤其適用於樣本分類邊界不規則的情況 三 不足 1 當樣本不平衡時,比如乙個類的樣本容量很大,其他類的樣本容量很小,輸入乙...

機器學習 KNN演算法

一 近 鄰 算 法 knn 原理 工 作 原 理 是 存 在 一 個 樣 本 資料 集 合 也 稱 作 訓練 樣 本 集 並 且 樣 本 集 中 每 個 數 據 都 存 在 標 籤 即 我 們 知 道 樣 本 集 中 每 一 數 據與 所 屬 分 類 的 對 應關係 輸 人 沒 有 標 籤 的 新 ...