📋 本篇内容

向量概念 → 矩阵运算 → 特征值 → 矩阵分解 → AI应用

🎯 1. 向量:AI的基本语言

1.1 什么是向量?

生活类比:向量就像是"带方向的箭头"

# 向量的本质:一组有序的数字
import numpy as np

# 例子1:一个学生的成绩
student_scores = np.array([85, 90, 78])  # [数学, 英语, 物理]
# 这就是一个3维向量!
# 为什么是3维?因为用3个数字来描述这个学生的成绩
# 第1维:数学成绩 = 85
# 第2维:英语成绩 = 90
# 第3维:物理成绩 = 78
# 💡 向量的维度 = 用来描述对象的特征数量

# 例子2:一张图片的像素
# 一个32x32的灰度图片 = 1024维向量
# 为什么是1024维?因为 32 × 32 = 1024 个像素点
# 每个像素点的灰度值(0-255)就是向量的一个维度
image = np.array([0, 15, 230, ...])  # 1024个数字,每个数字代表一个像素的灰度值
# 0 = 黑色,255 = 白色,中间值 = 不同程度的灰色

# 💡 更直观的理解:
# 想象把一张32×32的图片"拉平"成一条线
# 原本是:
#   第1行:[0, 15, 230, ...]  (32个像素)
#   第2行:[45, 100, 200, ...] (32个像素)
#   ...
#   第32行:[...]              (32个像素)
# 拉平后:[0, 15, 230, ..., 45, 100, 200, ..., ...]  (1024个数字)
# 这就是一个1024维向量!

# 例子3:一个词的特征
# "苹果"这个词可以表示为:
word_apple = np.array([0.2, 0.8, 0.1, 0.9])  # [水果性, 科技性, 颜色, 甜度]
# 为什么是4维?因为我们选择用4个特征来描述"苹果"这个词
# 第1维:水果性 = 0.2(不太像水果?其实应该是0.9,这里假设是品牌"苹果")
# 第2维:科技性 = 0.8(很有科技感,想到iPhone)
# 第3维:颜色   = 0.1(红色程度,这里假设指的是公司logo)
# 第4维:甜度   = 0.9(如果是水果苹果,很甜)
# 💡 在AI中,词向量通常有几百维,用来捕捉词的各种语义特征

# 📌 总结:向量维度的本质
# 向量的维度 = 描述对象所需的数字个数
# - 3个成绩 → 3维向量
# - 1024个像素 → 1024维向量  
# - 4个特征 → 4维向量
# 维度越高,描述越详细,但计算也越复杂

# 🎮 游戏玩家的类比:六边形战士!
# 想象游戏中描述一个英雄的能力:
hero_stats = np.array([90, 85, 70, 95, 80, 88])
# [攻击, 防御, 速度, 技能, 生命, 魔法] → 6维向量
# 
# 在雷达图上:
#        攻击(90)
#           /\
#    魔法  /  \  防御
#    (88) /____\ (85)
#        /      \
#   生命/        \速度
#  (80)/          \(70)
#      \          /
#       \________/
#         技能(95)
#
# 这就是"六边形战士"!用6个维度描述英雄的全面能力
# AI也是这样:用多个维度来描述和理解事物!

为什么AI需要向量?

  • 计算机只认识数字
  • 向量可以表示任何东西:图片、文字、声音
  • 向量之间可以计算相似度

1.2 向量的基本运算

import numpy as np

# 创建向量
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# 1️⃣ 向量加法(对应位置相加)
# 生活类比:两个人的工资分别是 [基本工资, 奖金, 补贴]
salary_A = np.array([5000, 2000, 1000])
salary_B = np.array([6000, 1500, 800])
total = salary_A + salary_B  # [11000, 3500, 1800]
print(f"总工资: {total}")

# 2️⃣ 向量数乘(每个元素乘以同一个数)
# 生活类比:工资涨20%
salary = np.array([5000, 2000, 1000])
after_raise = salary * 1.2  # [6000, 2400, 1200]
print(f"涨薪后: {after_raise}")

# 3️⃣ 点积(Dot Product)- 最重要!
# 生活类比:计算总分
scores = np.array([85, 90, 78])      # 各科成绩
weights = np.array([0.4, 0.3, 0.3])  # 各科权重
total_score = np.dot(scores, weights)  # 85*0.4 + 90*0.3 + 78*0.3
print(f"加权总分: {total_score}")

# 4️⃣ 向量长度(模)
# 生活类比:从家到公司的直线距离
displacement = np.array([3, 4])  # 向东3km,向北4km
distance = np.linalg.norm(displacement)  # √(3² + 4²) = 5km
print(f"直线距离: {distance}km")

1.3 向量的相似度

import numpy as np

def cosine_similarity(a, b):
    """计算余弦相似度(-1到1,越接近1越相似)"""
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

# 例子:判断两个词是否相似
# 假设我们用4个特征表示词:[水果性, 科技性, 红色, 甜度]
apple = np.array([0.9, 0.1, 0.8, 0.9])    # 苹果
banana = np.array([0.9, 0.1, 0.2, 0.8])   # 香蕉
iphone = np.array([0.1, 0.9, 0.3, 0.0])   # iPhone

print(f"苹果 vs 香蕉: {cosine_similarity(apple, banana):.2f}")  # 0.92 很相似
print(f"苹果 vs iPhone: {cosine_similarity(apple, iphone):.2f}")  # 0.29 不太相似

1.4 余弦相似度详解

公式

cos(θ) = (a · b) / (||a|| × ||b||)

其中:
- a · b = 点积(内积)= Σ(aᵢ × bᵢ)
- ||a|| = 向量a的模长 = √(Σaᵢ²)
- ||b|| = 向量b的模长 = √(Σbᵢ²)

计算步骤

1️⃣ 计算点积(分子):对应元素相乘再求和
   苹果·香蕉 = 0.9×0.9 + 0.1×0.1 + 0.8×0.2 + 0.9×0.8 = 1.70

2️⃣ 计算模长(分母):各元素平方和再开方
   ||苹果|| = √(0.9² + 0.1² + 0.8² + 0.9²) = 1.51
   ||香蕉|| = √(0.9² + 0.1² + 0.2² + 0.8²) = 1.22

3️⃣ 相除得到相似度:
   相似度 = 1.70 / (1.51 × 1.22) = 0.92 ✓ 很相似!

同理计算"苹果 vs iPhone":
   点积 = 0.9×0.1 + 0.1×0.9 + 0.8×0.3 + 0.9×0.0 = 0.33
   相似度 = 0.33 / (1.51 × 0.95) = 0.23 ✗ 不相似

几何意义:向量夹角的余弦值

  1.0  → 完全相同(夹角0°)
  0.5  → 比较相似(夹角60°)
  0.0  → 完全无关(夹角90°,垂直)
 -0.5  → 相反趋势(夹角120°)
 -1.0  → 完全相反(夹角180°)

为什么"苹果"和"香蕉"相似?

  • 都是水果(0.9 vs 0.9)✓
  • 都不是科技产品(0.1 vs 0.1)✓
  • 都比较甜(0.9 vs 0.8)✓
  • 只有颜色不同(0.8 vs 0.2)

为什么"苹果"和"iPhone"不相似?

  • 水果性相反(0.9 vs 0.1)✗
  • 科技性相反(0.1 vs 0.9)✗
  • 甜度不同(0.9 vs 0.0)✗

为什么叫"余弦"相似度?

余弦相似度的名字来源于它计算的是两个向量夹角的余弦值。在二维空间中可以直观看到:

情况1:相似的向量(苹果 vs 香蕉)

情况2:不相似的向量(苹果 vs iPhone)

关键理解

  • 两个向量方向越接近 → 夹角越小 → 余弦值越大 → 越相似
  • 两个向量方向越不同 → 夹角越大 → 余弦值越小 → 越不相似
  • 当夹角为0°时,cos(0°) = 1,完全相同
  • 当夹角为90°时,cos(90°) = 0,完全无关
  • 当夹角为180°时,cos(180°) = -1,完全相反

AI应用场景

  • 推荐系统:计算用户和商品的相似度
  • 搜索引擎:计算查询和文档的相似度
  • 人脸识别:计算两张脸的相似度
  • 文本分析:判断文章主题是否相似

可视化代码(可选)

如果你想自己绘制余弦相似度的可视化图,可以运行以下代码:

import numpy as np
import matplotlib.pyplot as plt

# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS', 'SimHei', 'Microsoft YaHei', 'STHeiti']
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 创建图形
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# 左图:相似的向量
apple = np.array([0.9, 0.9])
banana = np.array([0.9, 0.8])

ax1.quiver(0, 0, apple[0], apple[1], angles='xy', scale_units='xy', scale=1, 
           color='red', width=0.01, label='苹果 Apple')
ax1.quiver(0, 0, banana[0], banana[1], angles='xy', scale_units='xy', scale=1, 
           color='orange', width=0.01, label='香蕉 Banana')
ax1.set_xlim(0, 1.2)
ax1.set_ylim(0, 1.2)
ax1.set_aspect('equal')
ax1.grid(True, alpha=0.3)
ax1.legend()
ax1.set_title('相似向量(夹角小)')
ax1.set_xlabel('特征1')
ax1.set_ylabel('特征2')

# 右图:不相似的向量
apple2 = np.array([0.9, 0.1])
iphone = np.array([0.1, 0.9])

ax2.quiver(0, 0, apple2[0], apple2[1], angles='xy', scale_units='xy', scale=1, 
           color='red', width=0.01, label='苹果 Apple')
ax2.quiver(0, 0, iphone[0], iphone[1], angles='xy', scale_units='xy', scale=1, 
           color='blue', width=0.01, label='iPhone')
ax2.set_xlim(0, 1.2)
ax2.set_ylim(0, 1.2)
ax2.set_aspect('equal')
ax2.grid(True, alpha=0.3)
ax2.legend()
ax2.set_title('不相似向量(夹角大)')
ax2.set_xlabel('特征1')
ax2.set_ylabel('特征2')

plt.tight_layout()
plt.show()

📊 2. 矩阵:向量的集合

2.1 什么是矩阵?

生活类比:矩阵就像是"Excel表格"

import numpy as np

# 例子1:学生成绩表
#                   数学  英语  物理
scores = np.array([
                    [85, 90, 78],  # 学生A
                    [92, 88, 95],  # 学生B
                    [78, 85, 82],  # 学生C
])
print("成绩表:\n", scores)

# 例子2:图片就是矩阵!
# 一张灰度图片 = 像素值矩阵
image = np.array([
    [0, 50, 100],
    [150, 200, 255],
])
# 0=黑色, 255=白色

# 例子3:社交网络
# 朋友关系矩阵(1=是朋友,0=不是)
#                    A  B  C
friends = np.array([
                    [0, 1, 1],  # A和B、C是朋友
                    [1, 0, 0],  # B和A是朋友
                    [1, 0, 0],  # C和A是朋友
])

2.2 矩阵的基本运算

import numpy as np

# 创建矩阵
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

# 1️⃣ 矩阵加法
C = A + B
print("A + B:\n", C)
# 输出:
# A + B:
#  [[ 6  8]
#   [10 12]]

# 2️⃣ 矩阵转置(行列互换)
# 生活类比:把表格横着看变成竖着看
scores = np.array([
    [85, 90, 78],  # 学生A
    [92, 88, 95],  # 学生B
])
print("原始(按学生):\n", scores)
# 输出:
# 原始(按学生):
#  [[85 90 78]
#   [92 88 95]]

print("转置(按科目):\n", scores.T)
# 输出:
# 转置(按科目):
#  [[85 92]  ← 数学成绩
#   [90 88]  ← 英语成绩
#   [78 95]] ← 物理成绩

# 3️⃣ 矩阵乘法 - 最重要!
# 生活类比:神经网络的核心运算
# 输入 × 权重 = 输出
inputs = np.array([[1, 2, 3]])      # 1个样本,3个特征
weights = np.array([
    [0.1, 0.2],  # 特征1的权重
    [0.3, 0.4],  # 特征2的权重
    [0.5, 0.6],  # 特征3的权重
])
output = np.dot(inputs, weights)
print("神经网络输出:\n", output)
# 输出:
# 神经网络输出:
#  [[2.2 2.8]]
# 
# 计算过程:
# 第1个输出 = 1×0.1 + 2×0.3 + 3×0.5 = 0.1 + 0.6 + 1.5 = 2.2
# 第2个输出 = 1×0.2 + 2×0.4 + 3×0.6 = 0.2 + 0.8 + 1.8 = 2.8

2.3 矩阵乘法的直观理解

import numpy as np

# 例子:计算多个学生的加权总分
# 成绩矩阵(3个学生 × 3门课)
scores = np.array([
    [85, 90, 78],  # 学生A
    [92, 88, 95],  # 学生B
    [78, 85, 82],  # 学生C
])

# 权重向量(3门课的权重)
weights = np.array([
    [0.4],  # 数学40%
    [0.3],  # 英语30%
    [0.3],  # 物理30%
])

# 矩阵乘法:一次性计算所有学生的总分
total_scores = np.dot(scores, weights)
print("所有学生的加权总分:\n", total_scores)

# 等价于:
# 学生A: 85*0.4 + 90*0.3 + 78*0.3 = 84.4
# 学生B: 92*0.4 + 88*0.3 + 95*0.3 = 91.7
# 学生C: 78*0.4 + 85*0.3 + 82*0.3 = 81.3

🔍 3. 特征值和特征向量

3.1 什么是特征值?

生活类比1:拍照的最佳角度

想象你在一个广场上拍照:

  • 特征向量:最佳拍摄角度(方向)
  • 特征值:这个角度能拍到多少内容(重要程度)

比如:

  • 从正面拍(特征值=10):能拍到整个广场,信息量最大 ⭐⭐⭐
  • 从侧面拍(特征值=3):只能拍到一部分,信息量较小 ⭐
  • 从背面拍(特征值=0.1):几乎拍不到什么,信息量很小

特征值越大 = 这个方向越重要 = 包含的信息越多

特征值告诉我们:哪些因素对整体影响最大

import numpy as np

# 例子:社交网络中的影响力
# 朋友关系矩阵(谁和谁是朋友)
network = np.array([#A  B  C  D
                    [0, 1, 1, 0],  # A有2个朋友:B和C
                    [1, 0, 1, 1],  # B有3个朋友:A、C、D
                    [1, 1, 0, 1],  # C有3个朋友:A、B、D
                    [0, 1, 1, 0],  # D有2个朋友:B和C
])

# 计算特征值和特征向量
# 原理:求解方程 A·v = λ·v
# 其中:A是矩阵,v是特征向量,λ是特征值
# 意思是:矩阵A作用在向量v上,只改变v的长度(λ倍),不改变方向
eigenvalues, eigenvectors = np.linalg.eig(network)

print("特征值(影响力大小):", eigenvalues)
# 实际输出:[ 2.56155281e+00 -8.96100801e-17 -1.56155281e+00 -1.00000000e+00]
# 解读:
# - 最大特征值:2.56(最重要的方向)
# - 第二个值:-8.96e-17 ≈ 0(几乎为0,可以忽略)
# - 其他值:负数(次要方向)

print("最大特征值:", eigenvalues[0])
# 实际输出:2.5615528128088294

print("对应的特征向量(每个人的影响力):", eigenvectors[:, 0])
# 实际输出:[-0.43516215 -0.55734541 -0.55734541 -0.43516215]
# 解读:
# - A的影响力:|-0.435| = 0.435
# - B的影响力:|-0.557| = 0.557 ⭐ 最大
# - C的影响力:|-0.557| = 0.557 ⭐ 最大
# - D的影响力:|-0.435| = 0.435
# 
# 结论:B和C是网络中心,影响力最大(朋友最多)
#      A和D在网络边缘,影响力较小(朋友较少)

# 📖 计算原理简单说明:
# 1. 特征方程:det(A - λI) = 0
#    找到所有让这个方程成立的λ值(特征值)
# 
# 2. 对每个特征值λ,求解:(A - λI)·v = 0
#    找到对应的向量v(特征向量)
# 
# 3. 物理意义:
#    - 特征向量:矩阵变换的"不变方向"
#    - 特征值:这个方向上的"缩放倍数"

# 💡 直观理解:
# 想象这是一个微信群:
# - 特征向量 = 每个人在群里的"话语权"
# - 特征值 = 整个群的"活跃度"
# 
# 结果分析:
# B和C的影响力最大(|0.557| > |0.435|)
# 为什么?因为他们朋友最多(3个),处于网络的中心位置
# A和D的影响力较小,因为他们只有2个朋友,在网络边缘
# 就像群里的"意见领袖",中心位置的人说的话传播最广


# 🎯 特征值方程的直观理解:
# A·v = λ·v
# 
# 用社交网络解释:
# - A(矩阵)= 朋友关系网络
# - v(特征向量)= 每个人的初始影响力
# - λ(特征值)= 影响力的放大倍数
# - A·v = 通过朋友关系传播后的影响力
# 
# 方程的意思:
# "通过网络传播后的影响力" = "放大倍数" × "初始影响力"
# 
# 例如:如果λ=3,意思是通过朋友圈传播,影响力会扩大3倍!

3.2 特征值的直观理解

import numpy as np
import matplotlib.pyplot as plt

# 例子:数据的主要方向
# 假设我们有学生的身高和体重数据
np.random.seed(42)
height = np.random.normal(170, 10, 100)  # 身高
weight = height * 0.8 + np.random.normal(0, 5, 100)  # 体重(与身高相关)

# 构建数据矩阵
data = np.vstack([height, weight])

print("数据矩阵:\n", data.T)

# 计算协方差矩阵
cov_matrix = np.cov(data)

# 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)

print("特征值:", eigenvalues)
print("第一主方向(最重要):", eigenvectors[:, 0])
print("第二主方向(次要):", eigenvectors[:, 1])
# 输出结果
# 特征值: [134.90493238  13.64210718]
# 第一主方向(最重要): [0.75342573 0.65753302]
# 第二主方向(次要): [-0.65753302  0.75342573]

# 解释:
# 最大特征值对应的方向 = 数据变化最大的方向
# 在这个例子中,就是"身高-体重"的主要关系方向

AI应用

  • PCA降维:保留最重要的特征
  • 推荐系统:找到用户的主要兴趣方向
  • 图像压缩:保留图像的主要信息

🧩 4. 矩阵分解

4.1 什么是矩阵分解?

生活类比:把复杂的东西拆解成简单的部分

import numpy as np

# 例子:电影评分矩阵分解(推荐系统的核心)
# 用户对电影的评分(5个用户 × 4部电影)
ratings = np.array([
    [5, 3, 0, 1],  # 用户1
    [4, 0, 0, 1],  # 用户2
    [1, 1, 0, 5],  # 用户3
    [1, 0, 0, 4],  # 用户4
    [0, 1, 5, 4],  # 用户5
])

# SVD分解:ratings ≈ U × Σ × V^T
# 
# 💡 SVD是什么?
# SVD = Singular Value Decomposition(奇异值分解)
# 把一个复杂的矩阵分解成三个简单矩阵的乘积
# 
# 生活类比:
# 想象你要描述一张照片(矩阵)
# SVD把它分解成:
# - U:照片中有哪些"主题"(用户偏好)
# - Σ:每个主题有多重要(重要程度)
# - V^T:每个主题包含哪些"元素"(电影特征)
#
# 在推荐系统中:
# - U:每个用户对不同类型电影的喜好程度
# - Σ:每种类型的重要性(动作片、爱情片等)
# - V^T:每部电影属于哪种类型

U, sigma, VT = np.linalg.svd(ratings, full_matrices=False)

print("U矩阵(用户特征)形状:", U.shape)
# 输出:(5, 4) → 5个用户,4个隐藏特征

print("Σ矩阵(重要程度):", sigma)
# 输出:[7.35  3.52  2.11  0.89] → 第一个特征最重要

print("V^T矩阵(电影特征)形状:", VT.shape)
# 输出:(4, 4) → 4个隐藏特征,4部电影

# 重构矩阵(预测缺失的评分)
reconstructed = U @ np.diag(sigma) @ VT
print("\n预测的评分矩阵:\n", reconstructed.round(1))

SVD分解的直观理解

原始评分矩阵(5×4):

        电影1  电影2  电影3  电影4
用户1    5     3     0     1
用户2    4     0     0     1
用户3    1     1     0     5
用户4    1     0     0     4
用户5    0     1     5     4

SVD分解后:ratings = U × Σ × V^T

U矩阵(5×4):用户对"隐藏类型"的喜好

        类型1   类型2   类型3   类型4
用户1   [喜欢   一般    不喜欢  一般 ]
用户2   [喜欢   不喜欢  一般    喜欢 ]
用户3   [不喜欢 一般    喜欢    喜欢 ]
...

Σ矩阵(对角矩阵):每种类型的重要性

[7.35, 3.52, 2.11, 0.89]
 ↑     ↑     ↑     ↑
类型1  类型2  类型3  类型4
最重要 重要   一般   不重要

V^T矩阵(4×4):电影属于哪种类型

       电影1  电影2  电影3  电影4
类型1  [强    弱    中    强  ]
类型2  [弱    强    弱    中  ]
类型3  [中    中    强    弱  ]
类型4  [弱    强    中    中  ]

关键发现

通过SVD分解,我们发现了"隐藏的类型"(潜在特征):

  • 类型1可能代表"动作片"
  • 类型2可能代表"爱情片"
  • 类型3可能代表"科幻片"
  • 类型4可能代表"喜剧片"

预测原理

如果用户1喜欢"动作片"(类型1),而电影1是"动作片",那么用户1很可能会给电影1高分!

这样就能预测用户对没看过的电影的评分,实现个性化推荐!

4.2 SVD的实际应用

import numpy as np

# 例子:图像压缩
# 假设我们有一张灰度图片(矩阵)
image = np.random.rand(100, 100) * 255  # 100×100的图片

# SVD分解
U, sigma, VT = np.linalg.svd(image, full_matrices=False)

# 只保留前k个最重要的成分
k = 20  # 只保留20个(原来有100个)
compressed = U[:, :k] @ np.diag(sigma[:k]) @ VT[:k, :]

print(f"原始大小: {image.size} 个数字")
print(f"压缩后: {U[:, :k].size + k + VT[:k, :].size} 个数字")
print(f"压缩率: {(1 - (U[:, :k].size + k + VT[:k, :].size) / image.size) * 100:.1f}%")

# 这就是JPEG压缩的原理!

4.3 常见的矩阵分解类型

📌 初学者提示:这部分是进阶内容,可以先跳过,等学到机器学习时再回来看。
现在只需要知道"有这些工具"就够了,不需要深入理解算法原理。

AI中最常用的矩阵分解

分解类型 用途 何时需要了解
SVD 推荐系统、降维 ⭐⭐⭐ 必须掌握
特征值分解 PCA、图算法 ⭐⭐ 重要
LU分解 求解方程组 ⭐ 了解即可
QR分解 最小二乘法 ⭐ 了解即可

初学者建议

  • ✅ 重点掌握:SVD分解(上面已经讲过)
  • ✅ 理解概念:特征值和特征向量(上面已经讲过)
  • ⏭️ 暂时跳过:LU、QR等其他分解(用到时再学)

快速参考代码(可选):

import numpy as np

# SVD分解(最重要!)
A = np.array([[1, 2], [3, 4], [5, 6]])
U, sigma, VT = np.linalg.svd(A, full_matrices=False)
print("SVD分解 - 推荐系统、降维必备")

# 特征值分解(重要!)
A = np.array([[4, 2], [2, 3]])
eigenvalues, eigenvectors = np.linalg.eig(A)
print("\n特征值分解 - PCA降维必备")

# 其他分解(了解即可,用到时查文档)
# LU分解 - 求解线性方程组
# QR分解 - 最小二乘法
# Cholesky分解 - 优化算法

学习路径建议

现在(基础阶段):
  ✅ 理解SVD的概念和应用
  ✅ 理解特征值的含义
  
学机器学习时:
  📚 深入学习PCA(用到特征值分解)
  📚 深入学习推荐系统(用到SVD)
  
学深度学习时:
  📚 了解其他分解方法(按需学习)

🤖 5. 线性代数在AI中的应用

5.1 神经网络的前向传播

import numpy as np

# 简单的神经网络:输入层 → 隐藏层 → 输出层
def neural_network(X, W1, W2):
    """
    X: 输入矩阵 (样本数 × 特征数)
    W1: 第一层权重 (特征数 × 隐藏层神经元数)
    W2: 第二层权重 (隐藏层神经元数 × 输出数)
    """
    # 第一层:输入 × 权重
    hidden = np.dot(X, W1)
    hidden = np.maximum(0, hidden)  # ReLU激活函数
    
    # 第二层:隐藏层 × 权重
    output = np.dot(hidden, W2)
    
    return output

# 示例:预测房价
# 输入:[面积, 房间数, 楼层]
X = np.array([
    [100, 3, 5],   # 房子1
    [80, 2, 3],    # 房子2
    [120, 4, 10],  # 房子3
])

# 权重(随机初始化)
W1 = np.random.randn(3, 5)  # 3个特征 → 5个隐藏神经元
W2 = np.random.randn(5, 1)  # 5个隐藏神经元 → 1个输出(价格)

# 预测
predictions = neural_network(X, W1, W2)
print("预测的房价:\n", predictions)

5.2 图像处理

import numpy as np

# 例子:图像卷积(边缘检测)
image = np.array([
    [0, 0, 0, 0, 0],
    [0, 255, 255, 255, 0],
    [0, 255, 255, 255, 0],
    [0, 255, 255, 255, 0],
    [0, 0, 0, 0, 0],
])

# 边缘检测卷积核
kernel = np.array([
    [-1, -1, -1],
    [-1,  8, -1],
    [-1, -1, -1],
])

# 卷积运算(矩阵乘法的变体)
def convolve(image, kernel):
    result = np.zeros((3, 3))
    for i in range(3):
        for j in range(3):
            patch = image[i:i+3, j:j+3]
            result[i, j] = np.sum(patch * kernel)
    return result

edges = convolve(image, kernel)
print("边缘检测结果:\n", edges)

5.3 推荐系统

import numpy as np

# 例子:协同过滤推荐
# 用户-物品评分矩阵
ratings = np.array([
    [5, 3, 0, 1],  # 用户1对4个商品的评分
    [4, 0, 0, 1],
    [1, 1, 0, 5],
    [1, 0, 0, 4],
    [0, 1, 5, 4],
])

# 计算用户之间的相似度
def user_similarity(ratings):
    # 使用余弦相似度
    norm = np.linalg.norm(ratings, axis=1, keepdims=True)
    normalized = ratings / (norm + 1e-8)
    similarity = np.dot(normalized, normalized.T)
    return similarity

sim_matrix = user_similarity(ratings)
print("用户相似度矩阵:\n", sim_matrix.round(2))

# 为用户1推荐:找到相似用户喜欢但用户1没评分的商品
user_id = 0
similar_users = np.argsort(sim_matrix[user_id])[::-1][1:3]  # 最相似的2个用户
print(f"\n与用户{user_id}最相似的用户: {similar_users}")

🎯 总结

核心概念

  • ✅ 向量是AI的基本数据结构
  • ✅ 矩阵乘法是神经网络的核心运算
  • ✅ 特征值揭示数据的主要方向
  • ✅ 矩阵分解用于降维和推荐

线性代数是AI的语言,掌握它就像学会了编程的基本语法! 🚀✨

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐