#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 原理 工 作 原 理 是 存 在 一 個 樣 本 資料 集 合 也 稱 作 訓練 樣 本 集 並 且 樣 本 集 中 每 個 數 據 都 存 在 標 籤 即 我 們 知 道 樣 本 集 中 每 一 數 據與 所 屬 分 類 的 對 應關係 輸 人 沒 有 標 籤 的 新 ...