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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是用Python代码实现cv2.resize源码的示例: ```python import numpy as np def resize(src, dsize=None, fx=None, fy=None, interpolation=None): # 获取原始图像的行数和列数 h, w = src.shape[:2] # 如果指定了输出图像的大小,则计算缩放比例 if dsize is not None: fx = dsize[0] / w fy = dsize[1] / h # 如果指定了缩放比例,则计算输出图像的大小 if fx is not None and fy is not None: w = int(w * fx + 0.5) h = int(h * fy + 0.5) # 创建输出图像 dst = np.zeros((h, w, src.shape[2]), dtype=src.dtype) # 根据指定的插值方法进行缩放 if interpolation == cv2.INTER_NEAREST: for i in range(h): for j in range(w): x = int(j / fx + 0.5) y = int(i / fy + 0.5) dst[i, j] = src[y, x] elif interpolation == cv2.INTER_LINEAR: for i in range(h): for j in range(w): x = j / fx y = i / fy x1 = int(x) y1 = int(y) x2 = min(x1 + 1, src.shape[1] - 1) y2 = min(y1 + 1, src.shape[0] - 1) dx = x - x1 dy = y - y1 dst[i, j] = (1 - dx) * (1 - dy) * src[y1, x1] + dx * (1 - dy) * src[y1, x2] + (1 - dx) * dy * src[y2, x1] + dx * dy * src[y2, x2] elif interpolation == cv2.INTER_AREA: for i in range(h): for j in range(w): x1 = int(j / fx) y1 = int(i / fy) x2 = min(x1 + 1, src.shape[1] - 1) y2 = min(y1 + 1, src.shape[0] - 1) dst[i, j] = np.mean(src[y1:y2+1, x1:x2+1], axis=(0, 1)) elif interpolation == cv2.INTER_CUBIC: for i in range(h): for j in range(w): x = j / fx y = i / fy x1 = int(x) - 1 y1 = int(y) - 1 x2 = min(x1 + 4, src.shape[1] - 1) y2 = min(y1 + 4, src.shape[0] - 1) dx = x - x1 dy = y - y1 A = np.array([[1, x1, x1**2, x1**3], [1, x2, x2**2, x2**3], [0, 1, 2*x1, 3*x1**2], [0, 1, 2*x2, 3*x2**2]]) b = np.array([src[y1, x1], src[y2, x2], (src[y1, x2] - src[y1, x1]) / (x2 - x1), (src[y2, x2] - src[y2, x1]) / (x2 - x1)]) c = np.linalg.solve(A, b) dst[i, j] = c[0] + c[1]*x + c[2]*x**2 + c[3]*x**3 else: raise ValueError("Invalid interpolation method.") return dst ``` 注意:这里的代码仅是示例,具体实现可能与cv2.resize源码有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值