【从零到一学AI】第2篇:矩阵不是魔法:用Excel就能理解的线性代数

系列文章第2篇 | 从零到一学AI:数学不可怕

导语:上一篇文章中,小李开始了她的AI数学之旅。今天,我们要解决她遇到的第一个"拦路虎"——线性代数。别担心,我们不会用复杂的公式,而是用Excel表格和一个有趣的故事:如何用数学给女朋友推荐电影。


小李的新挑战:矩阵到底是什么?

小李学AI的第二周,遇到了第一个大难题。

"我看到推荐算法的教程里到处都是矩阵,什么用户-物品矩阵、特征矩阵、权重矩阵..."她在微信上抱怨,"这些密密麻麻的数字方阵看得我头晕,感觉像在看天书。"

我问她:"你平时用Excel吗?"

"当然用啊,做报表、整理数据都用Excel。"

"那恭喜你,你其实已经在用矩阵了!Excel表格就是矩阵的最直观表现。"

小李愣了一下:"真的吗?"

是的,矩阵其实就是一个二维表格,就像Excel一样简单!


从Excel到矩阵:一个恋爱故事

让我用一个真实的故事来解释矩阵。

我的朋友小王想给女朋友小美推荐电影,但他们的口味很不一样。小王喜欢科幻片,小美喜欢爱情片。怎么找到两人都喜欢的电影呢?

小王决定用"数据驱动"的方法解决这个问题。

第一步:建立用户评分表格

小王收集了他们对一些电影的评分(1-5分):

电影 小王评分 小美评分
复仇者联盟 5 2
泰坦尼克号 2 5
星际穿越 5 4
我的野蛮女友 1 5
盗梦空间 4 3

这个Excel表格,就是一个矩阵!

在数学表示中,我们可以写成:

          
          
          
        评分矩阵 R = [
    [5, 2],  # 复仇者联盟
    [2, 5],  # 泰坦尼克号
    [5, 4],  # 星际穿越
    [1, 5],  # 我的野蛮女友
    [4, 3]   # 盗梦空间
]

看到了吗?矩阵就是把表格里的数据按行列排列起来!


矩阵运算:Excel中的魔法

现在小王想知道:他和小美的口味到底有多相似?

算法概念:余弦相似度

小李问我:"为什么要用余弦相似度?直接算平均分不行吗?"

我解释道:"想象一下,你和小王都喜欢吃东西,但你喜欢吃甜的,他喜欢吃咸的。如果只是简单算平均分,就忽略了你们的口味方向不同。"

"余弦相似度就像是测量两个人喜好的'方向一致性'。它不关心你们打分的高低,只关心你们的打分模式是否一致。"

用Excel计算相似度

在Excel中,我们可以这样计算:

          
          
          
        # 假设A列是小王的评分,B列是小美的评分

# 计算向量的点积(内积)
=SUMPRODUCT(A2:A6, B2:B6)

# 计算小王评分的模长
=SQRT(SUMPRODUCT(A2:A6, A2:A6))

# 计算小美评分的模长
=SQRT(SUMPRODUCT(B2:B6, B2:B6))

# 计算余弦相似度
=SUMPRODUCT(A2:A6, B2:B6) / (SQRT(SUMPRODUCT(A2:A6, A2:A6)) * SQRT(SUMPRODUCT(B2:B6, B2:B6)))

让我们用Python来验证这个计算:

          
          
          
        import numpy as np

# 小王和小美的评分向量
wang_scores = np.array([5, 2, 5, 1, 4])
mei_scores = np.array([2, 5, 4, 5, 3])

# 计算余弦相似度
def cosine_similarity(a, b):
    dot_product = np.dot(a, b)  # 点积:对应元素相乘后求和
    norm_a = np.linalg.norm(a)  # 向量a的模长:sqrt(5²+2²+5²+1²+4²)
    norm_b = np.linalg.norm(b)  # 向量b的模长:sqrt(2²+5²+4²+5²+3²)
    return dot_product / (norm_a * norm_b)

similarity = cosine_similarity(wang_scores, mei_scores)
print(f"小王和小美的口味相似度: {similarity:.3f}")

# 详细计算过程
print(f"点积: {np.dot(wang_scores, mei_scores)}")  # 5*2 + 2*5 + 5*4 + 1*5 + 4*3 = 10+10+20+5+12=47
print(f"小王评分模长: {np.linalg.norm(wang_scores):.3f}")  # sqrt(25+4+25+1+16)=sqrt(71)≈7.416
print(f"小美评分模长: {np.linalg.norm(mei_scores):.3f}")   # sqrt(4+25+16+25+9)=sqrt(79)≈8.124

输出结果:

          
          
          
        小王和小美的口味相似度: 0.761
点积: 57
小王评分模长: 8.426
小美评分模长: 8.888

小李看到结果后说:"0.761的相似度!这说明他们的共同点还挺多的呢!虽然小王喜欢科幻片,小美喜欢爱情片,但他们在电影品味上其实有相当程度的一致性。这个结果很符合实际情况——情侣之间通常会有一些共同的审美标准!"

我补充道:"是的,0.761的相似度可以理解为他们的口味有76%的一致性。在余弦相似度中,这个数值已经相当不错了,说明他们在评价电影时有很多相似的判断标准,只是各自的偏好方向略有不同。"


矩阵分解:发现隐藏的偏好

小李接着问:"我经常听说推荐系统能发现用户的'隐藏偏好',这是怎么做到的?"

我笑着说:"这就是矩阵分解的魔力了!让我用一个侦探破案的故事来解释。"

算法概念:奇异值分解(SVD)

"想象小王是个侦探,他有一堆用户对电影的评分数据,但不知道这些电影具体属于什么类型。"

"SVD就像是一个神奇的'电影基因检测仪',它能通过分析评分模式,自动发现每部电影的'隐藏基因':"

  • 动作基因:这部电影有多少打斗场面
  • 爱情基因:浪漫成分有多少
  • 科幻基因:科幻元素的比例
  • 深度基因:思想深刻程度

"更重要的是,它还能发现每个用户的'口味DNA'!"

SVD分解实战

小王像个电影侦探,用SVD算法来"解剖"这些评分数据。他想:"如果我能找到每部电影的隐藏特征,那就能知道为什么有些人喜欢这部电影,有些人不喜欢。"SVD就像个超级显微镜,能把复杂的评分模式分解成简单的"基因"因子。小王看着分解结果,兴奋地想:"原来《复仇者联盟》和《变形金刚》有相似的'动作基因',而《泰坦尼克号》和《我的野蛮女友》共享'爱情基因'!"

假设小王收集了更多朋友的评分数据:

          
          
          
        import numpy as np
from sklearn.decomposition import TruncatedSVD

# 用户-电影评分矩阵(行:电影,列:用户)
# 用户:[小王, 小美, 小张, 小李]
ratings_matrix = np.array([
    [5, 2, 5, 1],  # 复仇者联盟
    [2, 5, 1, 5],  # 泰坦尼克号
    [5, 4, 4, 2],  # 星际穿越
   &nbs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智能波哨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值