KNN 機器學習演算法

2022-03-12 00:46:36 字數 2239 閱讀 3820

'''

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 原理 工 作 原 理 是 存 在 一 個 樣 本 資料 集 合 也 稱 作 訓練 樣 本 集 並 且 樣 本 集 中 每 個 數 據 都 存 在 標 籤 即 我 們 知 道 樣 本 集 中 每 一 數 據與 所 屬 分 類 的 對 應關係 輸 人 沒 有 標 籤 的 新 ...