前言
在K近鄰的原始算法中,沒有對(duì)K近鄰的方法進(jìn)行優(yōu)化,還是遍歷訓(xùn)練集,找到與輸入實(shí)例最近的K個(gè)訓(xùn)練實(shí)例,統(tǒng)計(jì)他們的類別,以此作為輸入實(shí)例類別的判斷。具體的模型理論見:統(tǒng)計(jì)學(xué)習(xí)方法——K近鄰法(原始方法)
1. K近鄰算法的實(shí)現(xiàn)
在算法實(shí)現(xiàn)的過程中,利用的是歐氏距離進(jìn)行點(diǎn)與點(diǎn)之間的距離度量。在進(jìn)行數(shù)據(jù)運(yùn)算的時(shí)候,沒有利用numpy,而是利用Python中自帶的list來進(jìn)行數(shù)據(jù)的計(jì)算。
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個(gè)中各個(gè)類出現(xiàn)的次數(shù)
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
)
# 對(duì)統(tǒng)計(jì)結(jié)果,按照字典中的各個(gè)值,進(jìn)行降序排序
return
result
[
0
]
[
0
]
def
euDis
(
x
,
y
)
:
# 歐式距離的計(jì)算
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
]
]
# 這是機(jī)器學(xué)習(xí)實(shí)戰(zhàn)一書上的小例子
labels
=
[
"愛情片"
,
"愛情片"
,
"愛情片"
,
"動(dòng)作片"
,
"動(dòng)作片"
,
"動(dòng)作片"
]
print
(
knn
(
[
18
,
90
]
,
dataSet
,
labels
,
3
)
)
# 輸出結(jié)果:愛情片
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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