一、演算法簡要
「物以類聚人以群分」是生活的現實寫照,knn就是讓那些距離近的人或物歸為一類。
問題定義:基於給定的一些示例(事物的屬性features和該事物的分類class),對於某個特定或一系列事物的features,來對未定事物進行分類classifying。
一般把給出了事物features和class的集合叫做測試集trainingset,未給定即待定的事物集合稱為測試集testset。
knn基本思想:輸入沒有標籤或分類的新資料後,將新資料的特徵features與測試集中的每乙個資料特徵進行比較,然後提取樣本中k個特徵最相似資料(最鄰近的)的分類標籤,選擇k個最相似資料中出現次數最多的分類,作為新資料或新事物的分類。
二、演算法一般流程偽**
1.資料的準備
2.資料預處理:格式、是否要歸一化(各個features之間的scale差距過大)等
3.分析資料:為了便於演算法的實踐,可以對原始資料集或預處理後的資料集進行一些實驗性的統計和圖示
4.訓練演算法:knn沒有引數需要訓練,但需要設定k值以及相似度計算方法
5.測試演算法:基於testset進行計算
6.真實演算法部署:可能需要進行語言抓換或平台部署
三、knn偽**
1.計算已知類別資料集中的點與需要**點之間的距離;
2.按照距離進行遞增排序;
3.選擇最近的k個點;
4.統計k個點中class最多的class
5.返回**結果
四、實現
from numpy import *
import matplotlib.pyplot as plt
import matplotlib
import operator
def file2matrix(filename):
fr = open(filename)
arrayolines = fr.readlines()
fr.close()
numberoflines = len(arrayolines)
returnmat = zeros((numberoflines,3))
'''zeros這個函式是numpy命名空間中的,這裡標頭檔案中from import將numpy下所有變數命名都引入了,還有一種方式是import numpy但這個時候用zeros時需要加上numpy.zeros()。用from import方式是將所有相關變數名都引入了,所以對重構產生一定影響,不過一般還好'''
classlabelvector =
index =0
for line in arrayolines:
line = line.strip("\n")
listfromline = line.split('\t')
returnmat[index,:] = listfromline[0:3]
index=index+1
return returnmat, classlabelvector
def plot(datamatrix, label):
fig=plt.figure()
ax=fig.add_subplot(111)
ax.scatter(datamatrix[:,1],datamatrix[:,2],0.01*array(datamatrix),0.01*array(label))
plt.show()
'''(val-min)/(max-min)'''
def norm0(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 = normdataset/tile(ranges,(m,1))
return normdataset
'''(val-mean)/std'''
def norm1(dataset):
meanvals = dataset.mean(0)
stdvals = dataset.std(0)
normdataset = zeros(shape(dataset))
m = dataset.shape[0]
normdataset = dataset - tile(meanvals,(m,1))
normdataset = normdataset/tile(stdvals,(m,1))
return normdataset
'''euclidean distance'''
def classify0(inx, trainset, labels, k):
datasetsize = trainset.shape[0]
diffmat = tile(inx, (datasetsize,1))-trainset
sqdiffmat = diffmat**2
sqdistance = sqdiffmat.sum(axis=1)
distances = sqdistance**0.5
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]
'''manhattan distance'''
def classify1(inx, trainset, labels, k):
datasetsize = trainset.shape[0]
diffmat = tile(inx, (datasetsize,1))-trainset
diffmat = abs(diffmat)
distances = diffmat.sum(axis=1)
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]
'''chebyshev distance'''
def classify2(inx, trainset, labels, k):
datasetsize = trainset.shape[0]
diffmat = tile(inx, (datasetsize,1))-trainset
distances = diffmat.max(1)
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]
def knn(filename, testratio, k):
dataset, labels = file2matrix(filename)
normmat = norm0(dataset)
m = normmat.shape[0]
numtestvecs = int(m*testratio)
errorcount = 1.0
for i in range(numtestvecs):
classifierresult = classify2(normmat[i,:],normmat[numtestvecs:m,:],labels[numtestvecs:m],k)
if(classifierresult != labels[i]):
errorcount+=1.0
print "total error rate of test set is: %f"%(errorcount/float(numtestvecs))
filename="datingtestset2.txt"
knn(filename,0.1,2)
knn(filename,0.1,3)
knn(filename,0.1,4)
knn(filename,0.1,5)
knn(filename,0.1,6)
機器學習演算法(1) KNN
k nearest neighbor algorithm 右圖中,綠色圓要被決定賦予哪個類,是紅色三角形還是藍色四方形?如果k 3,由於紅色三角形所佔比例為2 3,綠色圓將被賦予紅色三角形那個類,如果k 5,由於藍色四方形比例為3 5,因此綠色圓被賦予藍色四方形類。k最近鄰 k nearest ne...
1 KNN 學習筆記
k near neighbor 優點 缺點 計算複雜度高,空間複雜度高 一般演算法流程 1 收集 準備和分析資料 2 訓練資料 不適用 knn 演算法 3 測試資料 4 使用演算法 準備 createdataset knn 分類演算法的流程 5 classify0 file2matrix 準備資料 ...
機器學習1 KNN文字分類
思想 1.找到與資料最相近k個資料 根據余弦相似度 2.分別找出k條資料的類別,同類別相加,得到最大值,則該類別為測試資料的所屬類。encoding utf 8 from pylab import reload sys defcreatedataset group 1.0,1.1 2.0,2.1 1...