# -- coding: utf-8 --from numpy import *
import operator
def createdataset():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['a','a','b','b']
return group,labels
def classify0(inx,dataset,labels,k):
print 'inx'
print inx
#獲取行數
datasetsize = dataset.shape[0]
print 'datasetsize:'
print datasetsize
#將用於分類的輸入向量重複訓練集樣本的行數-訓練集樣本
print 'tile(inx,(datasetsize,1))'
print tile(inx,(datasetsize,1))
diffmat = tile(inx,(datasetsize,1))-dataset
print 'diffmat'
print diffmat
#將差值做平方操作
sqdiffmat = diffmat**2
print 'sqdiffmat'
print sqdiffmat
#將矩陣按行相加
sqdistances = sqdiffmat.sum(axis=1)
print 'sqdistances'
print sqdistances
#相加後開根號
distances = sqdistances**0.5
print'distances'
print distances
#按從小到大大索引排序 假如[3,1,2],排序結果為[1,2.0],結果應該是訓練集的列數
sorteddistindicies = distances.argsort()
print 'sorteddistindicies'
print sorteddistindicies
classcount = {}
#遍歷for i in range(k):
#sorteddistindicies[i]獲取距離按照索引排序後的第i個值
#labels[sorteddistindicies[i]]獲取距離索引對應的label
print 'i='+str(i)
#獲取當前索引對應的標籤
voteilabel = labels[sorteddistindicies[i]]
print 'voteilabel='+voteilabel
print 'classcount.get(voteilabel,0)='+str(classcount.get(voteilabel,0))
#對標籤進行計數
classcount[voteilabel]=classcount.get(voteilabel,0)+1
print 'classcount'
print classcount
#對獲取的標籤通過數量進行逆序排序
sortedclasscount = sorted(classcount.iteritems(),key=operator.itemgetter(1),reverse=true)
print 'sortedclasscount'
print sortedclasscount
return sortedclasscount[0][0]
group,labels=knn.createdataset();
print group
print labels
print knn.classify0([0.1,0.2],group,labels,3)
最終的輸出結果為
[[ 1. 1.1]
[ 1. 1. ]
[ 0. 0. ]
[ 0. 0.1]]
['a', 'a', 'b', 'b']
inx[0.1, 0.2]
datasetsize:
4tile(inx,(datasetsize,1))
[[ 0.1 0.2]
[ 0.1 0.2]
[ 0.1 0.2]
[ 0.1 0.2]]
diffmat
[[-0.9 -0.9]
[-0.9 -0.8]
[ 0.1 0.2]
[ 0.1 0.1]]
sqdiffmat
[[ 0.81 0.81]
[ 0.81 0.64]
[ 0.01 0.04]
[ 0.01 0.01]]
sqdistances
[ 1.62 1.45 0.05 0.02]
distances
[ 1.27279221 1.20415946 0.2236068 0.14142136]
sorteddistindicies
[3 2 1 0]
i=0voteilabel=b
classcount.get(voteilabel,0)=0
i=1voteilabel=b
classcount.get(voteilabel,0)=1
i=2voteilabel=a
classcount.get(voteilabel,0)=0
classcount
sortedclasscount
[('b', 2), ('a', 1)]
b
(機器學習實戰)K 近鄰演算法學習過程
k 近鄰演算法,簡單地說,k 近鄰演算法採用測量不同特徵值之間的距離方法進行分類 k近鄰演算法特徵 詳細優點 精度高 對異常值不敏感 無資料輸入假定 缺點計算複雜度高 空間複雜度高 適用資料範圍 數值型和標稱型 k 近鄰演算法的一般流程 收集資料 可以使用任何方法 準備資料 距離計算所需要的數值,最...
機器學習 k 近鄰演算法
一.k 近鄰演算法概述 簡單地說,k 近鄰演算法採用測量不同特徵值之間的距離方法進行分類。k 近鄰演算法 knn 它的工作原理是 存在乙個樣本資料集,也稱訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將資料的每個特徵與樣本集合中資...
機器學習 K近鄰演算法
用例一 from sklearn.neighbors import nearestneighbors import numpy as np x np.array 1,1 2,1 3,2 1,1 2,1 3,2 nbrs nearestneighbors n neighbors 2,algorithm...