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

相似性度量


目录

相似性度量

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

相关推荐
受之以蒙1 分钟前
Rust & WASM 之 wasm-bindgen 基础:让 Rust 与 JavaScript 无缝对话
前端·笔记·rust
G探险者6 分钟前
《如何在 Spring 中实现 MQ 消息的自动重连:监听与发送双通道策略》
java·开发语言·rpc
weixin_437398211 小时前
转Go学习笔记
linux·服务器·开发语言·后端·架构·golang
StrongerIrene1 小时前
rs build 的process.env的值undefined解决方案
开发语言·javascript·ecmascript
风逸hhh1 小时前
python打卡day58@浙大疏锦行
开发语言·python
茫忙然1 小时前
【WEB】Polar靶场 6-10题 详细笔记
笔记
eric*16881 小时前
尚硅谷张天禹老师课程配套笔记
前端·vue.js·笔记·vue·尚硅谷·张天禹·尚硅谷张天禹
让我们一起加油好吗1 小时前
【C++】list 简介与模拟实现(详解)
开发语言·c++·visualstudio·stl·list
Q_970956391 小时前
java+vue+SpringBoo足球社区管理系统(程序+数据库+报告+部署教程+答辩指导)
java·开发语言·数据库
为了更好的明天而战2 小时前
Java 中的 ArrayList 和 LinkedList 区别详解(源码级理解)
java·开发语言