#-*- 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','b','c','d']
return group,labels
def classify0(inx,dataset,labels,k):
#shape函式是numpy.core.fromnumeric中的函式,它的功能是讀取矩陣的長度,
#datasetsize是sataset的行數,用上面的舉例就是4行
datasetsize = dataset.shape[0]
#前面用tile,把一行inx變成4行一模一樣的(tile有重複的功能,datasetsize是重複4遍,後面的1保證重複完了是4行,而不是一行裡有四個一樣的),然後再減去dataset,是為了求兩點的距離,先要座標相減,這個就是座標相減
diffmat = tile(inx,(datasetsize,1))-dataset
#用上面得到4組目標資料座標和4組inx座標的差值開平方,py裡面**是開平方,[(x1-x2)^2,(y1-y2)^2]
sqdiffmat = diffmat**2
#axis=1是列相加,,這樣得到了4組資料的[(x1-x2)^2+(y1-y2)^2]
sqdistances = sqdiffmat.sum(axis=1)
#開根號,得出距離
distances = sqdistances**0.5
#argsort是排序,將元素按照由小到大的順序返回下標,比如([3,1,2]),它返回的就是([1,2,3])
sorteddistindicies = distances.argsort()
#建立分類字典
classcount={}
#遍歷k次(去前k個最近距離的演算法)
for i in range(k):
voteilabel = labels[sorteddistindicies[i]]
#get是取字典裡的元素,如果之前這個voteilabel是有的,那麼就返回字典裡這個voteilabel裡的值,如果沒有就返回0(後面寫的),這行**的意思就是算離目標點距離最近的k個點的類別,這個點是哪個類別哪個類別就加1
classcount[voteilabel] = classcount.get(voteilabel,0)+1
#key=operator.itemgetter(1)的意思是按照字典裡的第乙個排序,,要按照第1個(ab是第0個),即『1』『2』排序。reverse=true是降序排序
sortedclasscount = sorted(classcount.iteritems(),
key=operator.itemgetter(1),reverse=true)
#返回類別最多的類別
return sortedclasscount[0][0]
執行後:
ipython
import knn
in [2]: group,labels = knn.createdataset()
in [3]: knn.classify0([0,0],group,labels,3)
[ 1.48660687 1.41421356 0. 0.1 ]
[2 3 1 0]
out[3]: 'b'
k 鄰近演算法學習筆記
目錄 採用測量不同特徵值之間的距離進行分類。缺點 適用範圍 工作原理 usr bin env python coding utf 8 from numpy import import matplotlib import matplotlib.pyplot as plt k 近鄰演算法 defclas...
機器學習演算法 K鄰近演算法
coding utf 8 author whf from numpy import import operator def classify inx,dataset,labels,k 得到資料集的行數 shape方法用來得到矩陣或陣列的維數 datasetsize dataset.shape 0 t...
K 鄰近演算法
k 鄰近演算法 1.演算法描述 k 鄰近演算法 k nearest neighbor,knn 分類演算法,是最簡單的機器學習演算法。工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每乙個資料與所屬分類對應的關係。輸入沒有標籤的新資料後,將新資料的每...