機器學習 KNN演算法

2021-08-15 21:21:53 字數 2526 閱讀 9289

一、近 鄰 算 法 (knn)原理:

工 作 原 理 是 : 存 在 一 個 樣 本 資料 集 合 , 也 稱 作 訓練 樣 本 集 , 並 且 樣 本 集 中 每 個 數 據 都 存 在 標 籤 , 即 我 們 知 道 樣 本 集 中 每 一 數 據與 所 屬 分 類 的 對 應關係 。輸 人 沒 有 標 籤 的 新 數 據 後 , 將 新 數 據 的 每 個 特 徵 與 樣 本 集 中 數 據 對 應的特 徵 進 行 比較 , 然 後 算 法 提 取 樣 本 集 中 特 徵 最 相 似 數 據 ( 最 近 鄰 ) 的 分 類 標 籤 。一 般 來 說 , 我 們只 選 擇 樣 本 數 據 集 中 前 k個 最 相 似 的 數 據 ,這 就 是 k- 近 鄰 算 法 中 k 的 出 處 , 通 常 k 是 不 大 於 20 的 整 數 。最 後 , 選 擇 k 個 最 相 似 數 據 中 出 現 次 數 最 多 的 分 類 , 作 為 新 數 據 的 分 類。

二、knn演算法一般流程:

(1) 收集 數 據 : 可 以 使 用 任 何 方 法 。

(2) 準 備 數 據 : 距 離 計 算 所 需 要 的 數 值 , 最 好 是 結 構 化 的 數 據 格 式 。

(3) 分 析 數 據 : 可 以 使 用 任 何 方 法 。

(4) 訓練 算 法 : 此步 驟 不 適 用 於 k-近 鄰 算 法 。

(5) 測 試 算 法 : 計 算 錯 誤 率 。

(6) 使 用 算 法 : 首 先 需 要 輸 入 樣 本 數 據 和 結 構 化 的 輸 出 結 果 , 然 後 運 行 女 -近 鄰 算 法 判 定 輸

入 數 據 分 別 屬 於 哪 個 分 類 , 最 後 應用 對 計 算 出 的 分 類 執 行 後 續 的 處 理 。

三、knn演算法步驟:

對 未 知 類 別 屬 性 的 數 據 集 中 的 每 個 點依 次 執 行 以 下 操 作 :

(1) 計 算 已 知 類 別 數 據 集 中 的 點與 當 前 點之 間 的 距 離 ;

(2) 按 照 距 離 遞 增 次 序 排 序 ;

(3) 選 取 與 當 前 點距 離 最 小 的 k個 點;

(4) 確 定 前 k 個 點所 在 類 別 的 出 現 頻 率 ;

(5) 返回 前 k 個 點出 現 頻 率 最 高 的 類 別 作 為 當 前 點的 預 測 分 類

下面來看**:

# -*- 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

# 輸入向量inx 訓練樣本集dataset 標籤向量lables

def classify0(inx, dataset, labels, k):

# shape 為求陣列或矩陣維度的函式 對於二維陣列來說 shape[0]表示其行數

datasetsize = dataset.shape[0]

# tile(a,n),功能是將陣列a重複n次,構成乙個新的陣列

# tile(intx,(datasetsize,1))) 將陣列intx 轉為datasize行1列

diffmat = tile(inx, (datasetsize,1)) - dataset

# 矩陣diffmat每項求平方

sqdiffmat = diffmat**2

# sum(axis=1)將乙個矩陣的每一行向量相加

sqdistances = sqdiffmat.sum(axis=1)

# 開方

distances = sqdistances**0.5

# 排序 argsort函式返回的是陣列值從小到大的索引值

sorteddistindicies = distances.argsort()

classcount = {}

# 選擇距離最小的k個點

for i in range(k):

voteilabel = labels[sorteddistindicies[i]]

classcount[voteilabel] = classcount.get(voteilabel,0) + 1

# 通過逆序排序找到k個中出現次數最多的分類

sortedclasscount = sorted(classcount.iteritems(), key=operator.itemgetter(1),reverse=true)

return sortedclasscount[0][0]

if __name__ == "__main__":

group,labels = createdataset()

print classify0([1,1], group, labels, 3)

機器學習 演算法 KNN

參考 我感覺knn是最簡單的乙個機器學習演算法,實現很簡單,效果也一般般 就是算個euclideam distance,還有一些可以優化的地方,比如可以加權,第二篇文章提到了 python 如下 coding utf 8 created on aug 30,2013 author blacklaw ...

機器學習 KNN 演算法

一 主要目的 在樣本空間中,找到與待估計的樣本最臨近的k個鄰居,用這幾個鄰居的類別來估計待測樣本的類別 二 適用性 樣本容量比較大的類域的自動分類,而樣本容量較小的類域則容易誤分。尤其適用於樣本分類邊界不規則的情況 三 不足 1 當樣本不平衡時,比如乙個類的樣本容量很大,其他類的樣本容量很小,輸入乙...

機器學習 kNN演算法

最近鄰居法 knn演算法,又譯k 近鄰演算法 是一種用於分類和回歸的非引數統計方法。例如 根據腫瘤大小和時間兩個特徵對腫瘤的良性和惡性的 其中綠色為良性,紅色為惡性,現在要 藍色這一資料是良性還是惡性,那麼對於knn演算法是怎麼 的呢?大概思路 首先取乙個k值 要點一 k值的取法 之後取離索要 的點...