前言
在K近鄰的原始算法中,沒有對K近鄰的方法進行優化,還是遍歷訓練集,找到與輸入實例最近的K個訓練實例,統計他們的類別,以此作為輸入實例類別的判斷。具體的模型理論見:統計學習方法——K近鄰法(原始方法)
1. K近鄰算法的實現
在算法實現的過程中,利用的是歐氏距離進行點與點之間的距離度量。在進行數據運算的時候,沒有利用numpy,而是利用Python中自帶的list來進行數據的計算。
def
knn
(
x
,
dataSet
,
labels
,
k
)
:
distanceMemories
=
{
}
# 利用字典來記錄距離
for
i
in
range
(
len
(
dataSet
)
)
:
distance
=
euDis
(
x
,
dataSet
[
i
]
)
distanceMemories
[
i
]
=
distance
sortResult
=
sorted
(
distanceMemories
.
items
(
)
,
key
=
lambda
x
:
x
[
1
]
)
distance_min_k
=
sortResult
[
:
k
]
classCount
=
{
}
# 用來記錄前k個中各個類出現的次數
for
i
in
range
(
len
(
distance_min_k
)
)
:
if
labels
[
distance_min_k
[
i
]
[
0
]
]
not
in
classCount
:
classCount
[
labels
[
distance_min_k
[
i
]
[
0
]
]
]
=
0
classCount
[
labels
[
distance_min_k
[
i
]
[
0
]
]
]
+=
1
result
=
sorted
(
classCount
.
items
(
)
,
key
=
lambda
x
:
x
[
1
]
,
reverse
=
True
)
# 對統計結果,按照字典中的各個值,進行降序排序
return
result
[
0
]
[
0
]
def
euDis
(
x
,
y
)
:
# 歐式距離的計算
dim
=
len
(
x
)
temp
=
0
for
i
in
range
(
dim
)
:
temp
+=
(
x
[
i
]
-
y
[
i
]
)
**
2
return
temp
**
0.5
dataSet
=
[
[
3
,
104
]
,
[
2
,
100
]
,
[
1
,
81
]
,
[
101
,
10
]
,
[
99
,
5
]
,
[
98
,
2
]
]
# 這是機器學習實戰一書上的小例子
labels
=
[
"愛情片"
,
"愛情片"
,
"愛情片"
,
"動作片"
,
"動作片"
,
"動作片"
]
print
(
knn
(
[
18
,
90
]
,
dataSet
,
labels
,
3
)
)
# 輸出結果:愛情片
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
