knn通過測量不同特徵值之間的距離進行分類。大致思路:乙個樣本在k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某乙個類別。那麼該樣本也屬於這個類別。
用圖來舉例子
1.資料預處理
主要是將提供的資料集處理成函式可以處理的資料
def
file2matrix
(filename):
fr = open(filename)
arrayoflines = fr.readlines()
numberoflines = len(arrayoflines)
returnmat = zeros((numberoflines,3))
classlabelvector =
index = 0
for line in arrayoflines:
line = line.strip()
listfromline = line.split("\t")
returnmat[index,:] = listfromline[0:3] # 第index行的資料
index+=1
return returnmat,classlabelvector
當多個維度的資料我們認為是同等重要的時候,通常採用的方法是將數值歸一化,這樣可以避免數字差值對計算結果造成的影響。
2.1歸一化公式
newvalue = (oldvalue-min)/(max-min)2.2 歸一化(正則化)**實現
## normalization
defautonorm
(dataset):
minvals = dataset.min(0) ## 0 means 陣列的第二維(縱列)
maxvals = dataset.max(0)
ranges = maxvals-minvals
normdataset = zeros(shape(dataset))
m = dataset.shape[0] #shape[1]為第二維的長度(橫列),shape[0]為第一維的長度(縱列)
## newvalue = (oldvalue-min)/(max-min)
normdataset = dataset - tile(minvals,(m,1))
normdataset = normdataset/tile(ranges,(m,1))
return normdataset,ranges,minvals
需要注意的是,sklearn提供了函式,也可以直接呼叫sklearn的api
from sklearn import preprocessing
returnmat,classlabel = file2metrix("datingtestset2.txt")
horatio = 0.10
num_neighbors = 3
normmat = preprocessing.normalize(returnmat,'l2')
演算法的原理很簡單就不贅述了,直接上**吧
classify0()有四個輸入引數:用於分類的輸入向量inx,輸入的訓練樣本集為dataset,標籤向量labels,最後的引數k表示選擇最近鄰居的數目
def
classify0
(inx, dataset, labels, k):
datasetsize = dataset.shape[0]
diffmat = tile(inx, (datasetsize,1)) - dataset
sqdiffmat = diffmat**2
# axis代表的是第幾維的陣列 0為1維,1為2維
sqdistances = sqdiffmat.sum(axis=1)
distances = sqdistances**0.5
# argsort()函式是將x中的元素從小到大排列,提取其對應的index(索引),然後輸出到y
sorteddistindicies = distances.argsort()
classcount={}
for i in range(k):
voteilabel = labels[sorteddistindicies[i]]
classcount[voteilabel] = classcount.get(voteilabel,0) + 1
sortedclasscount = sorted(classcount.iteritems(), key=operator.itemgetter(1), reverse=true)
return sortedclasscount[0][0]
採用sklearn的api實現knn演算法
from sklearn import neighbors
deftestknn
(): returnmat,classlabel = file2metrix("datingtestset2.txt")
horatio = 0.10
## 測試集的數量
num_neighbors = 3
##選擇k的數量
normmat = preprocessing.normalize(returnmat,'l2')
m = normmat.shape[0]
numtestvecs = int(m*horatio)
classifier = neighbors.kneighborsclassifier(num_neighbors,weights='distance')
classifier.fit(returnmat[numtestvecs:,],classlabel[numtestvecs:])
### predict 來得到**的結果
error_count = 0
for item,result in zip(returnmat[:numtestvecs],classlabel[:numtestvecs]):
#告訴模型這是乙個example,而不是多個
test_value = item.reshape(1,-1)
predict_result = classifier.predict(test_value)[0]
print
"predicted output:",classifier.predict(test_value)[0]
if predict_result != result:
error_count +=1
print
"error_rate is %f" % (error_count/float(m*0.9))
K近鄰(KNN) 分類演算法
k近鄰 knn 分類演算法 knn是non parametric分類器 不做分布形式的假設,直接從資料估計概率密度 是memory based learning.knn不適用於高維資料 curse of dimension machine learning的python庫很多,比如mlpy 更多pa...
K NN演算法(K 近鄰演算法)
k nn 演算法是一種分類演算法。所謂 k近鄰演算法,即是 給定乙個 訓練資料集,對新的 輸入例項,在 訓練資料集中找到與 該例項最鄰近的 k個例項 也就是k個 鄰居 這k 個例項的多數屬於某個 類,就把該輸入 例項分類到 這個類中。例如 如果k 3,綠 色圓點的最近的3個 鄰居是2個 紅色小三角形...
K 近鄰演算法 KNN
knn k nearest neighbor 假設訓練集有記錄 r1 r2,rn共n條,訓練集的特徵向量及其對應的類別都是已知的,每個記錄的特徵向量為 t1 t2,tk共k個特徵,待測試的記錄為ru 1 計算ru 的特徵向量與訓練集的每條記錄 即r1 r2,rn 的特徵向量的歐式距離,選取距離最小的...