系列文章第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


1192

被折叠的 条评论
为什么被折叠?



