K近鄰 自程式設計和sklearn實現)

2021-10-03 16:40:40 字數 3820 閱讀 8833

思考k近鄰演算法的模型複雜度體現在**?什麼情況下會造成過擬合?

答:模型複雜度體現在k上;k較小時,容易造成過擬合;k較大時,容易造成欠擬合。

給定乙個二維空間的資料集t=,試基於歐式距離,找到資料點s(5,3)的最近鄰(k=1),並對s點進行分類**。

import numpy as np

import matplotlib.pyplot as plt

from collections import counter

defdraw

(x_train,y,x_new)

:#正負例項點初始化

x_po=np.zeros(x_train.shape[1]

) x_ne=np.zeros(x_train.shape[1]

)#區分正負例項點

for i in

range

(y.shape[0]

):if y[i]==1

: x_po=np.vstack(

(x_po,x_train[i]))

else

: x_ne=np.vstack(

(x_ne,x_train[i]))

#例項點繪圖

plt.plot(x_po[1:

,0],x_po[1:

,1],

"g*"

,label=

"1")

plt.plot(x_ne[1:

,0],x_ne[1:

,1],

"rx"

,label=

"-1"

) plt.plot(x_new[:,

0],x_new[:,

1],"bo"

,label=

"test_points"

)#測試點座標值標註

for xy in

zip(x_new[:,

0],x_new[:,

1]):

plt.annotate(

"test{}"

.format

(xy)

,xy)

#設定座標軸

plt.axis([0

,10,0

,10])

plt.xlabel(

"x1"

) plt.ylabel(

"y1"

)#顯示圖例

plt.legend(

)#顯示影象

plt.show(

)class

knn:

def__init__

(self,x_train,y_train,k=3)

:#所需引數初始化

self.k=k

self.x_train=x_train

self.y_train=y_train

defpredict

(self,x_new)

:#計算歐式距離

distances=

[(np.linalg.norm(x_new-self.x_train[i]

,ord=2

),self.y_train[i]

)for i in

range

(self.x_train.shape[0]

)]#對所有距離進行排序

distances.sort(key =

lambda x:x[0]

)#取前k個最小距離對應的類別(也就是y值)

y_list=

[distances[i][-

1]for i in

range

(self.k)

]print

("分類統計之前:"

,y_list)

#對上述k個點進行分類統計

y_count=counter(y_list)

.most_common(

)print

("分類統計之後:"

,y_list)

return y_count[0]

[0]def

main

(x_train,y,x_new)

:for k in

range(1

,6,2

):#構建knn例項

model=knn(x_train,y,k=k)

y_predict=model.predict(x_new)

print

("k={},被分類為:{}"

.format

(k,y_predict)

)if __name__==

"__main__"

:#定義訓練集和標籤和要**的點

x_train=np.array([[

5,4]

,[9,

6],[

4,7]

,[2,

3],[

8,1]

,[7,

2]])

y=np.array([1

,1,1

,-1,

-1,-

1]) x_new=np.array([[

5,3]

])#繪圖 draw(x_train,y,x_new)

#主函式

main(x_train,y,x_new)

import numpy as np

import matplotlib.pyplot as plt

from collections import counter

from sklearn.neighbors import kneighborsclassifier

defmain

(x_train,y,x_new)

:for k in

range(1

,6,2

):#構建knn例項

model=kneighborsclassifier(n_neighbors=k,n_jobs=-1

)#選擇合適的演算法

model.fit(x_train,y)

#** y_predict=model.predict(x_new)

#print clf.score(x_test, y_test)

print

("**正確率:"

.format

(model.score([[

5,3]

],[[

1]])

))print

("k={},被分類為:{}"

.format

(k,y_predict)

)if __name__==

"__main__"

:#定義訓練集和標籤和要**的點

x_train=np.array([[

5,4]

,[9,

6],[

4,7]

,[2,

3],[

8,1]

,[7,

2]])

y=np.array([1

,1,1

,-1,

-1,-

1]) x_new=np.array([[

5,3]

])#主函式

main(x_train,y,x_new)

"""輸出如下:

**正確率:100%

k=1,被分類為:[1]

**正確率:0%

k=3,被分類為:[-1]

**正確率:0%

k=5,被分類為:[-1]

"""

sklearn學習 k近鄰

比如我們要 中心點的顏色,以k 3為半徑畫乙個圓 圖中實線圓 此時紅點多於藍點,那麼我們推測中心點為紅色,以k 5為半徑畫乙個圓 圖中虛線圓 此時藍點多於紅點,那麼我們推測中心點為藍色。鳶尾花種類的 如下 from sklearn import datasets from sklearn.model...

機器學習 sklearn之k 近鄰演算法

k 近鄰演算法 k nearest neighbour algorithm 又稱為knn演算法,是資料探勘技術中原理最簡單的演算法。knn 的工作原理 給定乙個已知標籤類別的訓練資料集,輸入沒有標籤的新資料後,在訓練資料集中找到與新資料最接近的k個例項,如果這k個例項中的多數屬於某個類別,那麼新資料...

感知機自程式設計與sklearn實現

對於下面題目,分別用自程式設計和 sklearn 庫實現。已知訓練資料集d,其正例項點是x1 3,3 t,x2 4,3 t,負例項點是x3 1,1 t 1 用python 自程式設計實現感知機模型,對訓練資料集進行分類,並對比誤分類點選擇次序不同對最終結果的影響。可採用函式式程式設計或物件導向的程式...