思考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 自程式設計實現感知機模型,對訓練資料集進行分類,並對比誤分類點選擇次序不同對最終結果的影響。可採用函式式程式設計或物件導向的程式...