機器學習(二)k 近鄰分類演算法(kNN)

2021-07-17 02:13:05 字數 2785 閱讀 1304

1、k-近鄰演算法概述

k-近鄰演算法採用

測量不同特徵值之間的距離的方法進行分類。

優點:精度高、對異常值不敏感、無資料輸入假定;

缺點:計算複雜度高、空間複雜度高;

適用資料範圍:數值型和標稱型。

2、工作原理:

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

3、流程

*收集資料

*準備資料:距離計算所需要的數值,最好是結構化的資料格式。

*分析資料:

*訓練演算法:此步驟不適用於k-近鄰演算法

*測試演算法:計算錯誤率

*使用演算法:首先需要輸入樣本資料和結構化的輸出結果,然後執行k-近鄰演算法判定輸入資料分別屬於哪個分類,最後應用對計算出的分類執行後續的處理。

python實現:

# -*- coding: utf-8 -*-

'''created on sun aug 21 18:44:27 2016

knn: k nearest neighbors

input:      

inx:用於分類的輸入向量

dataset:輸入的訓練樣本集

labels:標籤向量

k:表示用於選擇最近鄰居的數目

標籤向量的元素數目和矩陣dataset的行數相同

output: 分類結果

@author: gnahznib

'''# 匯入科學計算包numpy

from numpy import *

# 匯入運輸符模組

import operator

from os import listdir

# k-鄰近演算法實現

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

# 已知分類的資料集(訓練集)的行數

datasetsize = dataset.shape[0]

# 1、計算歐式距離

# tile函式將輸入點拓展成與訓練集相同維數的矩陣,再計算歐氏距離

diffmat = tile(inx, (datasetsize,1)) - dataset  # 樣本與訓練集的差值矩陣

sqdiffmat = diffmat**2  # 差值矩陣平方

sqdistances = sqdiffmat.sum(axis=1)  # 計算每一行上元素的和

distances = sqdistances**0.5  # 開方得到尤拉距離矩陣

sorteddistindicies = distances.argsort()  # 按distances中元素進行公升序排序後得到的對應下標的列表     

# 2、選擇距離最小的k個點    

classcount={}          

for i in range(k):

voteilabel = labels[sorteddistindicies[i]]

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

# 按classcount字典的第2個元素(即類別出現的次數)從大到小排序

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

return sortedclasscount[0][0]

4、示例:

1)使用python匯入資料

in [

12]: from numpy import *

in [

13]: import operator

in [

14]: 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

...:

in [

15]: import knn

in [

16]: group,labels = knn.createdataset()

in [

17]: group

out[

17]:

array([[ 1. ,  1.1],

[ 1. ,  1. ],

[ 0. ,  0. ],

[ 0. ,  0.1]])

in [

18]: labels

out[

18]: ['a', 'a', 'b', 'b']

2)實施knn演算法

in [

19]: knn.classify0([0, 0], group, labels, 3)

out[

19]: 'b'

in [

20]: knn.classify0([1.5, 0.5], group, labels, 3)

out[

20]: 'a'

3)測試分類器

分類器錯誤率=分類器給出錯誤結果的次數 / 測試執行的總數 

《機器學習實戰》 k近鄰分類演算法kNN

knn全稱為k nearest neighbors,是模式識別中比較簡單的一種演算法,可以用於分類和回歸。使用時,輸入的訓練樣本帶有標籤,輸出根據是用於分類還是回歸 分類問題的輸出為 找出k個和要 物件最近鄰的樣本,這k個樣本中,大多數 屬於哪一類即為 物件的分類標籤。回歸問題的輸出為 找出k個和回...

機器學習 k 近鄰 kNN 演算法

一 基本原理 存在乙個樣本資料集合 也稱訓練樣本集 並且樣本集中每個資料都存在標籤。輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取樣本集中特徵最相似資料 最近鄰 的分類標籤。我們一般只選擇樣本集中前k k通常是不大於20的整數 個最相似的資料,最後選擇k個...

機器學習 k近鄰演算法 kNN

knn演算法通過計算當前測試樣本與離它最近的k個點的距離,進行投票,得到它最有可能的分類結果。首先來看看機器學習演算法的基本流程 由此可見knn演算法的特點 1.k近鄰演算法是非常特殊的,可以認為是沒有模型的演算法。2.為了和其他演算法統一,可以認為訓練資料集就是模型本身。這也是scikit lea...