knn演算法實現

2021-09-28 15:54:35 字數 4033 閱讀 6260

knn演算法(自己實現)鳶尾花資料集

一.題目描述

題目:自己實現knn演算法(用鳶尾花資料集)

knn演算法描述:在訓練集中資料和標籤已知的情況下,輸入測試資料,將測試資料的特徵與訓練集中對應的特徵進行相互比較,找到訓練集中與之最為相似的前k個資料,則該測試資料對應的類別就是k個資料**現次數最多的那個分類

二. 演算法構造

knn演算法通過計算物件間距離來作為各個物件之間的非相似性指標,在這裡距離一般使用歐氏距離或曼哈頓距離:

演算法描述為:

1)計算測試資料與各個訓練資料之間的距離;

2)按照距離的遞增關係進行排序;

3)選取距離最小的k個點;

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

5)返回前k個點**現頻率最高的類別作為測試資料的**分類。

程式流程圖:

演算法流程圖:

三.**實現

import pandas as pd

import numpy as np

from math import sqrt

from collections import counter

class

knnclass

:def

__init__

(self,k)

:'''初始化'''

assert k>=1,

"k必須是有效的"

self.k=k

self._x=

none

self._y=

none

deffit

(self,x,y)

:assert x.shape[0]

== y.shape[0]

assert self.k<=x.shape[0]

,"k 必須是有效的"

self._x=x

self._y=y

return self

defpredict

(self,xp)

:'''給定待**數劇集,給出**結果向量'''

assert self._x is

notnone

and self._y is

notnone

assert xp.shape[1]

==self._x.shape[1]

yp=[self._predict(x)

for x in xp]

return np.array(yp)

def_predict

(self,x)

:'''給定單個資料,返回**類別'''

assert x.shape[0]

==self._x.shape[1]

,"必須相同"

'''計算距離'''

distances=

[sqrt(np.

sum(

(x_t-x)**2

))for x_t in self._x]

nearest=np.argsort(distances)

topk_y=

[self._y[i]

for i in nearest[

:self.k]

] votes=counter(topk_y)

return votes.most_common(1)

[0][

0]defknnratio

(self,yn,yp)

: n =

0assert yn.shape[0]

== yp.shape[0]

for i in

range(40

):if yn[i]

!= yp[i]

: n=n+

1return(40

-n)/

40def

_repr_

(self)

:return

"knn(k=%d)"

%self.k

"訓練集"

knn_cl=knnclass(k=6)

mydata_csv=pd.read_csv(

'iris.csv'

)mydata_csv.columns=

['sepal_len'

,'sepal_width'

,'petal_len'

,'petal_width'

,'class'

]mydata_csv[

'class'

]= mydata_csv[

'class'].

(lambda x: x.split(

'-')[1

]) x = mydata_csv[

['sepal_len'

,'sepal_width'

,'petal_len'

,'petal_width']]

y = mydata_csv[

'class'

]"print(x)"

x=np.array(x)

y=np.array(y)

knn_cl.fit(x,y)

"測試集"

mydata_csv2=pd.read_csv(

'iris0.csv'

)mydata_csv2.columns=

['sepal_len'

,'sepal_width'

,'petal_len'

,'petal_width'

,'class'

]mydata_csv2[

'class'

]= mydata_csv2[

'class'].

(lambda x: x.split(

'-')[1

]) x_new = mydata_csv2[

['sepal_len'

,'sepal_width'

,'petal_len'

,'petal_width']]

.values

y_new = mydata_csv2[

'class'

].values

"print(x_new)"

print

("測試集結果"

)print

(y_new)

y_predict=knn_cl.predict(x_new)

print

("**結果"

)print

(y_predict)

r=knn_cl.knnratio(y_new,y_predict)

print

('測試集的正確率為:'

,r)

四.實驗總結對knn演算法的認識:knn就是根據「新資料的分類取決於它的鄰居」進行的,演算法的目的就是根據新資料和訓練集的距離,找出它的鄰居,然後分析這幾位鄰居大多數的分類,新資料型別就是它幾位鄰居的大多數型別。

實現演算法過程出現的問題:

(1)第一次用的資料集是xlsl格式,出現下面問題,格式不正確,目前沒有解決這個格式錯誤問題,最後換成了csv格式。

(2)測試集和訓練集資料匹配問題,但是輸出都是4,莫名其妙的問題,最後發現自己呼叫錯函式,一組資料應該呼叫的是_predict()函式,呼叫成了predict()函式

執行的結果截圖:

KNN演算法實現

knn k 近鄰 knn,k nearestneighbor 演算法是一種基本分類與回歸方法,我們這裡只討論分類問題中的 k 近鄰演算法。k 近鄰演算法的輸入為例項的特徵向量,對應於特徵空間的點 輸出為例項的類別,可以取多類。k 鄰演算法假設給定乙個訓練資料集,其中的例項類別已定。分類時,對新的例項...

Python實現KNN演算法

from numpy import import operator def creatdataset group array 1.0,1.1 1.0,1.0 0,0 0,0.1 lables a a b b return group,lables def classify0 inx,dataset,...

python實現knn演算法

importnumpyasnp importoperator defcreatedataset group np.array 1.0 1.1 1.0 1.0 0.0 0.0 0.0 0.1 labels a a b b returngroup,labels 分類演算法 inx待分類的點 defcla...