'''
created on sep 16, 2010
knn: k nearest neighbors
input: inx: vector to compare to existing dataset (1xn)
dataset: size m data set of known vectors (nxm)
labels: data set labels (1xm vector)
k: number of neighbors to use for comparison (should be an odd number)
output: the most popular class label
@author: pbharrin
'''from numpy import *
#numpy是python語言的乙個擴充套件程式庫。支援高階大量的維度陣列與矩陣運算,此外也針對陣列運算提供大量的數學函式庫。
import pdb
pdb.set_trace()#用於除錯
import operator#operator 模組是 python 中內建的操作符函式介面,它定義了算術,比較和與標準物件 api 相對應的其他操作的內建函式。
#operator 模組是用 c 實現的,所以執行速度比 python **快。
from os import listdir#os.listdir() 方法用於返回指定的資料夾包含的檔案或資料夾的名字的列表。這個列表以字母順序。 它不包括 '.' 和'..' 即使它在資料夾中。
def classify0(inx, dataset, labels, k):
#這個方法每次只能處理乙個樣本
#這裡的dataset是乙個陣列,inx是待分類的樣本,k是neighbor的數量
#inx是以行向量的方式儲存的,dataset也是一行表示乙個樣本
#knn演算法幾乎不需要「訓練」,屬於即開即用那種的
datasetsize = dataset.shape[0]#這是樣本個數
diffmat = tile(inx, (datasetsize,1)) - dataset#ile()函式內括號中的引數代表擴充套件後的維度,而擴充套件是通過複製a來運作的,最終得到乙個與括號內的引數(reps)維度一致的陣列(矩陣)
#將inx複製為和樣本一樣多的行數
sqdiffmat = diffmat**2
sqdistances = sqdiffmat.sum(axis=1)#sum對array求和,如果引數是0,就按列求和,返回乙個行向量;如果引數是1,就按行求和,但是也返回乙個行向量(從計算的角度來看,是列向量轉置之後的)
distances = sqdistances**0.5#**是python中的冪運算,用在矩陣上的效果的對應位置相乘而不是矩陣乘法中的a*a
##現在distances中的每乙個元素代表了待求目標點和每乙個樣本點之間的距離
sorteddistindicies = distances.argsort() #argsort是numpy的方法,從小到大排序(不加引數的話),返回的是index而不是排序後的元素本身
classcount={}#這是個字典型別
(labels)
for i in range(k):
voteilabel = labels[sorteddistindicies[i]]
classcount[voteilabel] = classcount.get(voteilabel,0) + 1#給這個型別加一
sortedclasscount = sorted(classcount.items(), key=operator.itemgetter(1), reverse=true)#選出k中數量最大的label
return sortedclasscount[0][0]##輸出最大的label
def createdataset():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
#[[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]是list型別的二維向量,轉成array可以方便進行向量化計算(array是numpy封裝的)
labels = ['a','a','b','b']
return group, labels
group,labels=createdataset()
classify0([0,0],group,labels,3)
機器學習 演算法 KNN
參考 我感覺knn是最簡單的乙個機器學習演算法,實現很簡單,效果也一般般 就是算個euclideam distance,還有一些可以優化的地方,比如可以加權,第二篇文章提到了 python 如下 coding utf 8 created on aug 30,2013 author blacklaw ...
機器學習 KNN 演算法
一 主要目的 在樣本空間中,找到與待估計的樣本最臨近的k個鄰居,用這幾個鄰居的類別來估計待測樣本的類別 二 適用性 樣本容量比較大的類域的自動分類,而樣本容量較小的類域則容易誤分。尤其適用於樣本分類邊界不規則的情況 三 不足 1 當樣本不平衡時,比如乙個類的樣本容量很大,其他類的樣本容量很小,輸入乙...
機器學習 KNN演算法
一 近 鄰 算 法 knn 原理 工 作 原 理 是 存 在 一 個 樣 本 資料 集 合 也 稱 作 訓練 樣 本 集 並 且 樣 本 集 中 每 個 數 據 都 存 在 標 籤 即 我 們 知 道 樣 本 集 中 每 一 數 據與 所 屬 分 類 的 對 應關係 輸 人 沒 有 標 籤 的 新 ...