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...