如何比较相似

如何比较相似

在数据科学中,经常需要知道个体间差异的大小,进而评价个体的相似性和类别

首先这里的个体是一个泛化的概念,个体的相似既可以指两个人的相似、两个物品的相似,也可以是人和物的相似、两个分布的相似、两个数据集的相似等

1.欧式距离

用距离衡量个体之间的差异时,距离越大,说明个体差异越大,个体之间越不相似。

欧式距离的计算公式
d i s t ( x , y ) = ∑ i = 1 k ( x i − y i ) 2 dist(x, y) = \sqrt{\sum_{i=1}^{k}{(x_i-y_i)^2}} dist(x,y)=i=1k(xiyi)2
公式说明:

x,y代表两个个体,对应着两个多维的向量

xi,yi是两个向量在维度i上的值

import numpy as np
users = ['u1', 'u2', 'u3', 'u4', 'u5', 'u6']
#用户-行为评分矩阵
rating_matrix = np.array([[4, 3, 0, 0, 5, 0],
                          [5, 0, 4, 0, 4, 0],
                          [4, 0, 5, 3, 4, 0],
                          [0, 3, 0, 0, 0, 5],
                          [0, 4, 0, 0, 0, 4],
                          [0, 0, 2, 4, 0, 5]
                          ])
#根据公式计算用户u1和u2的距离
d1 = np.sqrt(np.sum(np.square(rating_matrix[0, :] - rating_matrix[1, :])))
print(d1)

d 1 = 5.196152422706632 d1 = 5.196152422706632 d1=5.196152422706632

如果我们想得到所有样本两两之间距离的方法,这个方法在scikit-learn已经存在

import pandas as pd
from sklearn.metrics.pairwise import euclidean_distances
import numpy as np
users = ['u1', 'u2', 'u3', 'u4', 'u5', 'u6']

rating_matrix = np.array([[4, 3, 0, 0, 5, 0],
                          [5, 0, 4, 0, 4, 0],
                          [4, 0, 5, 3, 4, 0],
                          [0, 3, 0, 0, 0, 5],
                          [0, 4, 0, 0, 0, 4],
                          [0, 0, 2, 4, 0, 5]
                          ])

eucl_dists = euclidean_distances(rating_matrix)
dist_df = pd.DataFrame(eucl_dists, columns=users, index=users)

print(dist_df)

结果如图所示:

u1u2u3u4u5u6
u10.0000005.1961526.6332508.1240387.6157739.746794
u25.1961520.0000003.3166259.5393929.4339819.273618
u36.6332503.3166250.00000010.0000009.8994958.185353
u48.1240389.53939210.0000000.0000001.4142145.385165
u57.6157739.4339819.8994951.4142140.0000006.082763
u69.7467949.2736188.1853535.3851656.0827630.000000

用户距离矩阵是一个方阵,对角线元素全为0,也就是自己和自己的距离为0;

用户距离矩阵是一个对称矩阵,比如u1与u2的距离等于u2与u1的距离

2.夹角余弦相似度

除了使用距离我们还可以使用相似度来很很衡量用户的相似性,常用的相似度为余弦相似度
c o s ( θ ) = a ⃗ ⋅ b ⃗ ÷ ( ∣ ∣ a ⃗ ∣ ∣ ∣ b ⃗ ∣ ∣ ) cos(\theta) =\vec{a}\cdot\vec{b}\div(||\vec{a}|||\vec{b}||) cos(θ)=a b ÷(a b )

import numpy as np
users = ['u1', 'u2', 'u3', 'u4', 'u5', 'u6']

rating_matrix = np.array([[4, 3, 0, 0, 5, 0],
                          [5, 0, 4, 0, 4, 0],
                          [4, 0, 5, 3, 4, 0],
                          [0, 3, 0, 0, 0, 5],
                          [0, 4, 0, 0, 0, 4],
                          [0, 0, 2, 4, 0, 5]
                          ])

#用于计算一个向量的模长
def mod(vec):
	x = np.sum(vec**2)
	return x**0.5


#用于计算两个向量的夹角的余弦值
def sim(vec1, vec2):
	s = np.dot(vec1, vec2) / (mod(vec1) * mod(vec2))
	return s

#计算两个用户的相似度
cos_sim = sim(rating_matrix[0], rating_matrix[1])
print(cos_sim)

scikit-learn也提供了计算所有样本两两之间的相似度并且得到矩阵相似度的方法:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.metrics.pairwise import cosine_similarity
users = ['u1', 'u2', 'u3', 'u4', 'u5', 'u6']

rating_matrix = np.array([[4, 3, 0, 0, 5, 0],
                          [5, 0, 4, 0, 4, 0],
                          [4, 0, 5, 3, 4, 0],
                          [0, 3, 0, 0, 0, 5],
                          [0, 4, 0, 0, 0, 4],
                          [0, 0, 2, 4, 0, 5]
                          ])

cos_sims = cosine_similarity(rating_matrix)
sims_df = pd.DataFrame(cos_sims, columns=users, index=users)
print(sims_df)
sns.heatmap(sims_df, cmap='Blues', annot=True, fmt='.2f')
plt.show()

相似度矩阵的特点:
矩阵是一个方阵,对角元素都是1,即自己和自己的相似度最大,为1.

矩阵时是对称矩阵,u1和u2的相似度等于u2和u1的相似度。

上面代码还使用了热力图,用可视化的方法来观察相似度矩阵。

颜色越高代表相似度越高。

在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值