线性代数于工程应用中的实践:以代码实例拆解相似性度量问题的求解逻辑

相似性度量


目录

相似性度量

1.欧氏距离

2.余弦相似度

3.两者区别

4.应用实例

(1)评估用户消费能力(欧式距离)

(2)人群聚类(余弦相似度)


1.欧氏距离

欧氏距离是一种常用的距离度量方法,适用于衡量多维空间中各个点之间的绝对距离。它通过计算两点之间的直线距离来衡量它们的距离。在多维空间中,欧氏距离可以通过对每个坐标维度上的差值进行平方求和后再开方得到。这种方法可以有效地衡量多维空间中点之间的距离,并可用于各种应用场景中:
图一

同理推导:
图二

2.余弦相似度

向量夹角越大,即方向差异越大,余弦值cosθ就会越小,即相似度越小;向量夹角越小,即方向差异越小,余弦值cosθ就会越大,即相似度越大:
图三

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.68333173107735

print("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()

图四

(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.0

print("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()

相关推荐
声网5 分钟前
a16z 最新 Voice AI 报告:语音将成为关键切入点,而非最终产品本身丨 Voice AI 学习笔记
人工智能·笔记·学习
萧鼎5 分钟前
使用Python的Tabulate库优雅地格式化表格数据
python
程序员小远12 分钟前
接口自动化测试框架(pytest+allure+aiohttp+ 用例自动生成)
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·pytest
钮钴禄·爱因斯晨37 分钟前
赛博算命之 ”梅花易数“ 的 “JAVA“ 实现 ——从玄学到科学的探索
java·开发语言·python
云边有个稻草人1 小时前
DeepSeek与人工智能的结合:探索搜索技术的未来
人工智能·笔记·科技·算法·deepseek
卜及中1 小时前
【Go语言快速上手】第二部分:Go语言进阶
开发语言·后端·golang
进阶的小叮当2 小时前
Vue+Node调用Python并将结果显示到Web页面中
vue.js·python·node.js
BuHuaX2 小时前
C#元组和Unity Vector3
开发语言·unity·c#·游戏引擎·全文检索
《雨声》2 小时前
第3章《VTK可视化基础》
开发语言·c++·qt·算法
Perfect_www2 小时前
Jupyter Notebook自动保存失败等问题的解决
ide·python·jupyter