sklearn源码中余弦距离的python代码实现

1、问题描述:在进行sklearn包学习的时候,发现其中的sklearn.metrics.pairwise.pairwise_distance函数可以实现各种距离度量,恰好我用到了余弦距离,于是就调用了该函数pairwise_distances(train_data, metric='cosine')但是对其中细节不是很理解,所以自己动手写了个实现。

2、问题解决:
余弦的距离公式:
d c o s i n e = 1 − u ⋅ v ∥ u ∥ ⋅ ∥ v ∥ d_{cosine} = 1 - \frac{u \cdot v }{\lVert u \rVert \cdot \lVert v \rVert} dcosine=1uvuv

# 导入必要的包
from math import sqrt
import numpy as np

# d是数据
test_similarity = np.dot(d, d.T)
n_users = d.shape[0]
def normal_l2(u, v):
	"""
	计算二范数
	"""
    norm_l2_u = sqrt(np.dot(u,u))
    norm_l2_v = sqrt(np.dot(v,v))
    return norm_l2_u * norm_l2_v 

for i in range(n_users):
    for j in range(n_users):
        test_similarity[i][j] /= normal_l2(d[i], d[j])
# 下面和sklearn源码一致
test_similarity *= -1
test_similarity += 1
# 将结果进行截断,不然会有负值(其实是0)
np.clip(test_similarity, 0, 2, out=test_similarity)
# 将结果变成普通的小数表示,不加这一步则会得到科学记数法的表示
test_similarity[np.diag_indices_from(test_similarity)] = 0.0
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值