k最近邻算法

K最近邻算法

概述

K最近邻算法适用于找出距离A坐标最近的几个点,可以用来做推荐系统

计算公式以及模拟

K最近邻算法有两个公式:距离公式,相似度公式(余弦)

距离公式

距离公式是:

( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 \sqrt{(x_1-x_2)^2 + (y_1-y_2)^2} (x1x2)2+(y1y2)2

举个栗子:

你要做电影推荐系统,他有以下参数:

(a,     b,      c,      d)
科幻片  动作片  爱情片     喜剧片

四个值是历史评分的总和

小明的打分是(10, 5, 9, 4), 小红的打分是(9, 1, 2, 5), 小张的打分是(10, 3, 4, 5), 假设目前就这几个用户,小红几个小时前看了《独行月球》,小张几个小时前看了《流浪地球》,应该给小明推荐哪一部电影?

这里计算的是四维空间的距离,但是只要扩展一下就行

( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 + ( z 1 − z 2 ) 2 + ( t 1 − t 2 ) 2 \sqrt{(x_1-x_2)^2 + (y_1-y_2)^2 + (z_1-z_2)^2 + (t_1-t_2)^2} (x1x2)2+(y1y2)2+(z1z2)2+(t1t2)2

代入公式,小明与小红在电影评分上的距离为:

( 10 − 9 ) 2 + ( 5 − 1 ) 2 + ( 9 − 2 ) 2 + ( 4 − 5 ) 2 = 67 \sqrt{(10-9)^2 + (5-1)^2 + (9-2)^2 + (4-5)^2} = \sqrt{67} (109)2+(51)2+(92)2+(45)2 =67

非常简单!小明与小红的距离为 67 \sqrt{67} 67

小明与小张在电影评分上的距离为:

( 10 − 10 ) 2 + ( 5 − 3 ) 2 + ( 9 − 4 ) 2 + ( 4 − 5 ) 2 = 30 \sqrt{(10-10)^2 + (5-3)^2 + (9-4)^2 + (4-5)^2} = \sqrt{30} (1010)2+(53)2+(94)2+(45)2 =30

由此可见,小明的电影偏好与小张比较相似,所以应该给小明推荐《流浪地球》

余弦相似度公式

余弦相似度的公式是

c o s ( θ ) = x 1 x 2 + y 1 y 2 x 1 2 + y 1 2 × x 2 2 + y 2 2 cos(\theta) = \frac{x_1x_2+y_1y_2}{\sqrt{x_1^2+y_1^2} \times {\sqrt{x_2^2+y_2^2}}} cos(θ)=x12+y12 ×x22+y22 x1x2+y1y2

别急,这是纸老虎,给你举个栗子就懂了

同样是电影推荐系统的栗子,当然,为了减少计算量,我们只设二维空间的坐标值

(x,     y)
科幻片  喜剧片

小明的电影偏好为(10, 4), 小红的为(9, 5), 小张的为(10, 5),小红几个小时前看了《独行月球》,小明几个小时前看了《流浪地球》,请问?按照余弦相似度,该给小明推荐哪一部电影

代入公式,小明与小红的相似度为:

10 × 9 + 4 × 5 1 0 2 + 4 2 × 9 2 + 5 2 ≈ 0.9919979 \frac{10 \times 9 + 4 \times 5}{\sqrt{10 ^ 2 + 4 ^ 2} \times {\sqrt{9^2+5^2}}} \approx 0.9919979 102+42 ×92+52 10×9+4×50.9919979

余弦相似度的逻辑是:越接近1,越相似

小明与小张的相似度为:
10 × 10 + 4 × 5 1 0 2 + 4 2 × 1 0 2 + 5 2 ≈ 0.996545 \frac{10 \times 10 + 4 \times 5}{\sqrt{10 ^ 2 + 4 ^ 2} \times {\sqrt{10 ^ 2 + 5 ^ 2}}} \approx 0.996545 102+42 ×102+52 10×10+4×50.996545

因为小明与小张的相似度更接近1,所以应该给小明推荐《流浪地球》

Python代码

距离公式的代码解析

由于要使用到根号,所以需要导入math.sqrt

from math import sqrt

还要设置坐标

A_vector = (2, 3) # 实例所需
B_vector = (5, 9)

最后就是计算了

result = sqrt((A_vector[0]-B_vector[0]) ^ 2 + (A_vector[1]-B_vector[1]) ^ 2)
print('坐标{}与坐标{}的距离是{}'.format(A_vector, B_vector, result))

完整代码:

from math import sqrt

A_vector = (2, 3) # 实例所需
B_vector = (5, 9)

result = sqrt((A_vector[0]-B_vector[0]) ^ 2 + (A_vector[1]-B_vector[1]) ^ 2)
print('坐标{}与坐标{}的距离是{}'.format(A_vector, B_vector, result))

输出:

坐标(2, 3)与坐标(5, 9)的距离是1.7320508075688772

余弦相似度的代码解析

导入以及坐标设置就不说了,直接说计算过程

余弦相似度的计算是一个分数,先看分子的计算

(a_Vector[0] * b_Vector[0] + a_Vector[1] * b_Vector[1])

等同于以下数学公式

x 1 x 2 + y 1 y 2 x_1x_2+y_1y_2 x1x2+y1y2

再看分母的计算

# from math import sqrt
(sqrt(a_Vector[0] ** 2 +a_Vector[1] **2) * sqrt(b_Vector[0] ** 2 +b_Vector[1] ** 2)) # ** 等同于 ^

相当于以下数学公式

x 1 2 + y 1 2 × x 2 2 + y 2 2 {\sqrt{x_1^2+y_1^2} \times {\sqrt{x_2^2+y_2^2}}} x12+y12 ×x22+y22

这下明白了吧,直接亮出完整代码

from math import sqrt

a_Vector = (2, 3)
b_Vector = (5, 9)

result = (a_Vector[0] * b_Vector[0] + a_Vector[1] * b_Vector[1]) / (sqrt(a_Vector[0] ** 2 +a_Vector[1] **2) * sqrt(b_Vector[0] ** 2 +b_Vector[1] ** 2))
print("∠ θ = {}".format(result))

关于K最近邻算法的介绍就到这,如果在实际工作中使用此算法,建议使用余弦相似度公式计算,K最近邻算法的应用场景还很多,你可以用它来预测上下班高峰的的人数,预测成绩,做推荐系统……希望这篇博客对你有帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑I客I零

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值