相似性度量
目录
相似性度量
1.欧氏距离
2.余弦相似度
3.两者区别
4.应用实例
(1)评估用户消费能力(欧式距离)
(2)人群聚类(余弦相似度)
1.欧氏距离
欧氏距离是一种常用的距离度量方法,适用于衡量多维空间中各个点之间的绝对距离。它通过计算两点之间的直线距离来衡量它们的距离。在多维空间中,欧氏距离可以通过对每个坐标维度上的差值进行平方求和后再开方得到。这种方法可以有效地衡量多维空间中点之间的距离,并可用于各种应用场景中:
![](https://i-blog.csdnimg.cn/direct/87aa079d59c540b6852ea2eaadd47ccc.png)
同理推导:
![](https://i-blog.csdnimg.cn/direct/e5d47a772f3e4846bbd9d40934d0f7af.png)
2.余弦相似度
向量夹角越大,即方向差异越大,余弦值cosθ就会越小,即相似度越小;向量夹角越小,即方向差异越小,余弦值cosθ就会越大,即相似度越大:
![](https://i-blog.csdnimg.cn/direct/87a704ac47d14a08b6e7d38aef477783.png)
3.两者区别
欧式距离和余弦相似度使用的场景不同:
(1)欧氏距离是一种常用的距离度量方法,特别适用于衡量多维空间中各个点之间的绝对差异。它通过计算两点之间的直线距离来衡量它们的距离。在数值特征的分析中,欧氏距离可以用来比较个体之间的差异,尤其适用于需要从维度的数值大小中体现差异的情况。
例如,在用户行为指标分析中,欧氏距离可以用来衡量不同用户之间在各个行为指标上的差异,从而判断他们的用户价值差异。通过计算用户在各个行为指标上的数值差异,可以使用欧氏距离来度量不同用户之间的相似性或差异性。这可以帮助我们进行用户细分、推荐系统、个性化定制等方面的工作。
(2)余弦相似度主要用于比较向量之间的方向差异,而对于绝对数值并不敏感。它通常被用来分析用户对不同内容的评分,从而理解他们的兴趣差异。此外,余弦相似度还可以解决用户之间度量标准不一致的问题,从而提高分析结果的准确性。
4.应用实例
(1)评估用户消费能力(欧式距离)
**示例**
某月用户消费数据:
张三 | 李四 | 王五 | |
消费次数 | 2 | 20 | 3 |
总消费额 | 10 | 100 | 15 |
将这些数据工程化为向量:
①张三、李四之间的余弦相似度:sim=cosθ=1
张三、王五之间的余弦相似度:sim=cosθ=1
李四、王五之间的余弦相似度:sim=cosθ=1
由于余弦相似度无法评估用户的消费能力,我们在使用余弦相似度进行分析时需要注意其局限性。余弦相似度主要用于比较向量之间的方向差异,而无法准确地衡量绝对的数值差异。
②张三、李四之间的欧式距离:dist=91.8
张三、王五之间的欧式距离:dist=5.1
李四、王五之间的欧式距离:dist=86.7
通过欧式距离的测量,可以得出在数值特征上张三与王五之间的差距最小,而与李四之间的差距较大。这可以暗示李四在数值特征上具有较高的消费能力。
**代码及运行结果**
python">import numpy as np
import matplotlib.pyplot as plt#欧式距离
def calculate_EuclideanDistance(vec1,vec2):return np.sqrt(np.sum(np.square(vec1-vec2)))#余弦相似度
def calculate_CosinSim(vec1,vec2):return (np.dot(vec1,vec2))/(np.linalg.norm(vec1)*np.linalg.norm(vec2))#创建三个一维向量
a_1=np.array([2,10]) #[ 2 10]
b_1=np.array([20,100]) #[ 20 100]
c_1=np.array([3,15]) #[ 3 15]#求取欧式距离
print("distance ab:",calculate_EuclideanDistance(a_1,b_1))
print("distance ac:",calculate_EuclideanDistance(a_1,c_1))
print("distance bc:",calculate_EuclideanDistance(b_1,c_1))
# distance ab: 91.78235124467012
# distance ac: 5.0990195135927845
# distance bc: 86.68333173107735print("sim ab:",calculate_CosinSim(a_1,b_1))
print("sim ac:",calculate_CosinSim(a_1,c_1))
print("sim bc:",calculate_CosinSim(b_1,c_1))
# sim ab: 1.0
# sim ac: 1.0
# sim bc: 1.0#绘制三个向量的图相
plt.xlim(0,30)
plt.ylim(0,110)
plt.grid(color='#A9A9A9')
plt.plot(a_1[0],a_1[1],'ro')
plt.plot(b_1[0],b_1[1],'go')
plt.plot(c_1[0],c_1[1],'bo')
plt.show()
![](https://i-blog.csdnimg.cn/direct/818c8d54ef6a4eb98abb4994091e1135.png)
(2)人群聚类(余弦相似度)
**示例**
某月用户对某手机商品的评分数据:
张三 | 李四 | 王五 | |
华为手机 | 1.0 | 5.0 | 5.0 |
苹果手机 | 1.0 | 5.0 | 0 |
将这些数据工程化为向量:
①张三、李四之间的欧式距离:dist=5.7
张三、王五之间的欧式距离:dist=4.1
李四、王五之间的欧式距离:dist=5.0
由于三者之间的欧氏距离差异不明显,使用欧式距离无法有效对人群进行聚类。
②张三、李四之间的余弦相似度:sim=cosθ=1
张三、王五之间的余弦相似度:sim=cosθ=0.71
李四、王五之间的余弦相似度:sim=cosθ=0.71
因为张三和李四之间的余弦相似度达到最大值,可以得出他们两人的兴趣相似度较高。然而,根据王五与张三、李四之间的余弦相似度较低,可以推断他们之间的兴趣相似度较低。
**代码及运行结果**
python">import numpy as np
import matplotlib.pyplot as plt#欧式距离
def calculate_EuclideanDistance(vec1,vec2):return np.sqrt(np.sum(np.square(vec1-vec2)))#余弦相似度
def calculate_CosinSim(vec1,vec2):return (np.dot(vec1,vec2))/(np.linalg.norm(vec1)*np.linalg.norm(vec2))#创建三个一维向量
a_2=np.array([1,1]) #[ 1 1]
b_2=np.array([5,5]) #[ 5 5]
c_2=np.array([5,0]) #[ 5 0]#求取欧式距离
print("distance ab:",calculate_EuclideanDistance(a_2,b_2))
print("distance ac:",calculate_EuclideanDistance(a_2,c_2))
print("distance bc:",calculate_EuclideanDistance(b_2,c_2))
# distance ab: 5.656854249492381
# distance ac: 4.123105625617661
# distance bc: 5.0print("sim ab:",calculate_CosinSim(a_2,b_2))
print("sim ac:",calculate_CosinSim(a_2,c_2))
print("sim bc:",calculate_CosinSim(b_2,c_2))
# sim ab: 0.9999999999999998
# sim ac: 0.7071067811865475
# sim bc: 0.7071067811865475#绘制三个向量的图相
plt.xlim(0,10)
plt.ylim(0,20)
plt.grid(color='#A9A9A9')
plt.plot(a_2[0],a_2[1],'ro')
plt.plot(b_2[0],b_2[1],'go')
plt.plot(c_2[0],c_2[1],'bo')
plt.show()