效果圖:
import math
import matplotlib.pyplot as plt
import numpy as np
defclassifyapoint
(points, p, k=3)
: distance =
# grop裝的的0或1;feature裝的是各個點座標
for group in points:
for feature in points[group]
:# 算出測試集點p和訓練集上的每乙個點之間的歐氏距離(即勾股定理)
euclidean_distance = math.sqrt(
(feature[0]
- p[0]
)**2+
(feature[1]
- p[1]
)**2)
# 把這些距離和所屬類別放入乙個陣列內
(euclidean_distance, group)
)# 先按照歐氏距離由小到大排序,然後切出前k個數放入distanc作為代表
# list 的 sort 方法返回的是對已經存在的列表進行操作,無返回值,
# 而內建函式 sorted 方法返回的是乙個新的 list,而不是在原來的基礎上進行的操作。
# 因此不會對原list順序修改
distance =
sorted
(distance)
[:k]
print
(distance)
# 記錄這些距離屬於類0或類1的個數
freq1 =
0 freq2 =
0# 若前k個最小的距離當中屬於類0的個數更多,則屬於類0;反之則屬於類1
for d in distance:
if d[1]
==0: freq1 +=
1elif d[1]
==1: freq2 +=
1# 返回所屬概率更大的那一類
return
0if freq1 > freq2 else
1
def
main()
:# 通過字典把這些點分成兩類,用鍵0和1表示
# 鍵0表示屬於類0
# 鍵1表示屬於類1
points =
# 測試點
p1 =(3
,5) p2 =(5
,3) x1 =[1
,2,3
,3,3.5,2
,2,1
] y1 =[12
,5,6
,10,8
,11,9
,7] x2 =[5
,3,4
,7,6
,3.8
,5.6,4
] y2 =[3
,2,9
,2,1
,1,4
,2] plt.title(
"class 0 & class 1"
) plt.scatter(x1, y1, c=
'g', marker=
'o', s=60)
plt.scatter(x2, y2, c=
'r', marker=
's', s=60)
plt.scatter(p1[0]
, p1[1]
, s=
100, marker=
'h', c=
'y')
# 黃色的
plt.scatter(p2[0]
, p2[1]
, s=
100, marker=
'h', c=
'b')
# 藍色的
plt.grid(linestyle=
'--'
) plt.axis([0
,15,0
,15])
plt.text(p1[0]
, p1[1]
," p1"
) plt.text(p2[0]
, p2[1]
," p2"
) plt.show(
)# k的值
k =5print
("p1**在類:{}"
.format
(classifyapoint(points, p1, k)))
print
("p2**在類:{}"
.format
(classifyapoint(points, p2, k)))
if __name__ ==
'__main__'
: main(
)
KNN(k 近鄰)演算法簡單實現
knn是通過測量不同特徵值之間的距離進行分類。它的思路是 如果乙個樣本在特徵空間中的k個最相似 即特徵空間中最鄰近 的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別,其中k通常是不大於20的整數。knn演算法中,所選擇的鄰居都是已經正確分類的物件。該方法在定類決策上只依據最鄰近的乙個或者幾個樣...
KNN K近鄰 演算法 簡單實現
k近鄰 knn,k nearestneighbor 分類演算法是資料探勘分類技術中最簡單的方法之一。所謂k近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。cover和hart在1968年提出了最初的鄰近演算法。knn是一種分類 classification 演算法,它...
簡單的string類的模擬實現
綜述 c 標準庫提供了乙個字串型別string 該型別可以直接定義乙個字串物件,並且對字串進行各種操作 以下是本人根據c 標準庫中的string類,簡單的模擬實現該類 先看cpulspuls中string類的成員函式 其中我只實現圖中列出函式原型的幾個成員函式 1 實現之前先看看這寫函式及其過載函式...