統計學習方法 K近鄰法 python實現

2021-08-09 12:56:56 字數 3435 閱讀 2814

k近鄰是一種常用的分類與回歸演算法,簡單直觀。

原理:

k近鄰模型

模型有3個要素——距離度量方法、k值的選擇和分類決策規則。

模型

當3要素確定的時候,對任何例項(訓練或輸入),它所屬的類都是確定的,相當於將特徵空間分為一些子空間。

距離度量

對n維實數向量空間rn,經常用lp距離或曼哈頓minkowski距離。距離的度量詳見部落格

k值的選擇

k較小,容易被雜訊影響,發生過擬合。

k較大,較遠的訓練例項也會對**起作用,容易發生錯誤。

分類決策規則

使用0-1損失函式衡量,那麼誤分類率是:

nk是近鄰集合,要使左邊最小,右邊的必須最大,

所以多數表決=經驗最小化。

k近鄰法的實現:

kd樹

演算法核心在於怎麼快速搜尋k個近鄰出來,樸素做法是線性掃瞄,不可取,這裡介紹的方法是kd樹。

構造kd樹

對資料集t中的子集s初始化s=t,取當前節點node=root取維數的序數i=0,對s遞迴執行: 

找出s的第i維的中位數對應的點,通過該點,且垂直於第i維座標軸做乙個超平面。該點加入node的子節點。

該超平面將空間分為兩個部分,對這兩個部分分別重複此操作(s=s',++i,node=current),直到不可再分。

搜尋效率

kd樹搜尋的平均時間複雜度為logn.。所以,當樣本較小時,kd樹搜尋與暴力搜尋接近;但當資料量很大,kd樹搜尋能節省很多搜尋時間。一般來說,k維的資料,資料集超過2k時,kd樹能表現的比較好。

python實現

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

"""created on thu oct 19 13:17:31 2017

@author: lizheng

"""#encoding:utf-8

import csv #用於處理csv檔案

import random #用於隨機數

import math

import operator # 函式操作

#載入資料集

def loaddataset(filename,split,trainingset=,testset = ):

with open(filename,"r") as csvfile:

#這裡如果是open("d:\iris.txt","rb")會提示有錯誤

#錯誤為「error: iterator should return strings, not bytes (did you open the file in text mode?)」

lines = csv.reader(csvfile)

dataset = list(lines)

for x in range(len(dataset)-1):

for y in range(4):

dataset[x][y] = float(dataset[x][y])

if random.random()predicted = " + repr(result) + ",actual = " + repr(testset[x][-1]) )

accuracy = getaccuracy(testset, predictions)

print( "accuracy:" + repr(accuracy) + "%")

if __name__ =="__main__":

main()

from sklearn.neighbors import kdtree

x =[[2, 3],

[5, 4],

[9, 6],

[4, 7],

[8, 1],

[7, 2]]

s=[[5,3]]

x.extend(s)

tree = kdtree(x, leaf_size=2, metric='euclidean')

tree.query(x, k=3) #生成kdtree

dist, ind = tree.query(s, k=7)

i = ind[0][1]

print("s-k-nearest :",x[i],"didistance: ",dist[0][i])#返回s的最近鄰和歐氏距離

#print(tree.query(x, k=2, return_distance=false) )

使用scikit-learn的knn演算法進行分類的乙個例項

from sklearn import neighbors  

import numpy as np

#資料集

group =np.array([[1.0,1.1],[2.0,2.1],[1.0,1.0],[0,0],[0,0.1],[0.5,0.9]])

labels = ['a','a','a','b','b','b']

knn = neighbors.kneighborsclassifier()

#訓練資料集

knn.fit(group,labels)

#**

predict = knn.predict([[1,2],[3,3]])

print(predict)

使用iris鳶尾花資料集 的乙個例項

from sklearn.datasets import load_iris  

from sklearn import neighbors

#檢視iris資料集

iris = load_iris()

print(iris)

knn = neighbors.kneighborsclassifier()

#訓練資料集

knn.fit(iris.data, iris.target)

#**

predict = knn.predict([[1,2,2,5]])

print (predict)

print (iris.target_names[predict])

python中常用包——sklearn主要模組和基本使用方法(jorocco的部落格)

統計學習方法 k近鄰法

k近鄰法 knn 是一種基本的分類與回歸方法 分類這種需求,滲透到我們生活的方方面面 分類演算法可以幫助我們完成這些繁瑣的操作,並根據我們的要求不斷修正分類結果。分類演算法其實蠻多的,這裡順著書本順序,詳細講解knn演算法,再與k means k means 演算法進行簡單對比。k近鄰法是這樣乙個過...

統計學習方法 K近鄰法

k近鄰演算法簡單 直觀給定乙個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最鄰近的k個例項,這k個例項的多數屬於某個類,就把該輸入例項分為這個類.下面先敘述k近鄰演算法,然後再討論其細節。近鄰法的特殊情況 k 1情形,稱為最近鄰演算法.對於輸入的例項點 特徵向量 x xx,最近鄰法將訓練資...

《統計學習方法》 k近鄰法

k近鄰法是一種基本分類與回歸方法。在這裡我們只討論分類問題中的k近鄰法。三要素 k值的選擇 距離度量 分類決策規則 最後會引入一種k近鄰的實現方法 kd樹。輸入 訓練資料集t 輸出 例項x所屬的類y 根據給定的距離度量,在訓練集中找到和x最近的k個點 在這k個點中根據分類決策規則,決定x的類別 注意...