正交投影与内积空间:机器学习的几何基础

前言

本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和参考文献请见《机器学习数学通关指南》


正文

在这里插入图片描述

🔍 1. 内积空间的数学定义

1.1 代数定义 ✏️

两个维度相同的向量 a = [ a 1 , … , a n ] \mathbf{a} = [a_1, \dots, a_n] a=[a1,,an] b = [ b 1 , … , b n ] \mathbf{b} = [b_1, \dots, b_n] b=[b1,,bn],其内积为:

a ⋅ b = ∑ i = 1 n a i b i \mathbf{a} \cdot \mathbf{b} = \sum_{i=1}^n a_i b_i ab=i=1naibi

内积结果为标量,是后续投影和正交性的计算基础。在Python中可以这样实现:

import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
dot_product = np.dot(a, b)  # 或简写为 a.dot(b) 或 a @ b
print(f"内积结果: {dot_product}")  # 输出: 内积结果: 32

1.2 几何定义 📐

从几何角度,向量 a \mathbf{a} a 与向量 b \mathbf{b} b 的内积为:

a ⋅ b = ∥ a ∥ ∥ b ∥ cos ⁡ θ \mathbf{a} \cdot \mathbf{b} = \|\mathbf{a}\| \|\mathbf{b}\| \cos\theta ab=a∥∥bcosθ

其中 θ \theta θ 是两个向量的夹角。这一性质直接关联到正交投影的计算,并表明:

  • θ = 90 ° \theta = 90° θ=90° 时,内积为0(正交向量)
  • θ = 0 ° \theta = 0° θ= 时,内积最大(同向向量)
  • θ = 180 ° \theta = 180° θ=180° 时,内积为负(反向向量)

🚀 2. 正交投影的核心思想

2.1 投影的物理意义 💡

向量 a \mathbf{a} a 在向量 b \mathbf{b} b 上的正交投影反映了前者在后者方向上的"影子长度"(即分解到该方向的分量):

投影长度 = ∥ a ∥ cos ⁡ θ = a ⋅ b ∥ b ∥ \text{投影长度} = \|\mathbf{a}\| \cos\theta = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{b}\|} 投影长度=acosθ=bab

投影向量则为:

投影向量 = a ⋅ b ∥ b ∥ 2 b \text{投影向量} = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{b}\|^2} \mathbf{b} 投影向量=b2abb

2.2 正交基与坐标表示 📊

在标准正交基下(如二维空间的基向量 e 1 , e 2 \mathbf{e}_1, \mathbf{e}_2 e1,e2),向量 v = [ v 1 , v 2 ] T \mathbf{v} = [v_1, v_2]^T v=[v1,v2]T 的坐标值实际上是其在基向量上的投影:

v 1 = v ⋅ e 1 , v 2 = v ⋅ e 2 v_1 = \mathbf{v} \cdot \mathbf{e}_1, \quad v_2 = \mathbf{v} \cdot \mathbf{e}_2 v1=ve1,v2=ve2

这揭示了一个重要概念:内积空间的坐标系本质上建立在投影关系上

🧩 3. 正交基的构造方法(Gram-Schmidt过程)

3.1 算法步骤 🔄

Gram-Schmidt正交化是将一组线性无关向量转换为正交基(甚至标准正交基)的经典方法:

  1. 从第一个向量开始,标准化得到第一个正交基向量
  2. 计算下一个向量在已有正交基上的投影
  3. 从原向量中减去这些投影分量,得到正交分量
  4. 标准化正交分量得到新的正交基向量
  5. 重复步骤2-4直到处理完所有向量

3.2 二维空间实例实现 🔨

如何将非正交基 { a 1 , a 2 } \{\mathbf{a}_1, \mathbf{a}_2\} {a1,a2} 转化为正交基 { q 1 , q 2 } \{\mathbf{q}_1, \mathbf{q}_2\} {q1,q2}

  1. 赋值 q 1 = a 1 ∥ a 1 ∥ \mathbf{q}_1 = \frac{\mathbf{a}_1}{\|\mathbf{a}_1\|} q1=a1a1
  2. 计算 a 2 \mathbf{a}_2 a2 q 1 \mathbf{q}_1 q1 的投影分量:
    投影向量 = ( a 2 ⋅ q 1 ) q 1 \text{投影向量} = (\mathbf{a}_2 \cdot \mathbf{q}_1) \mathbf{q}_1 投影向量=(a2q1)q1
  3. 去除投影分量后的正交向量:
    v 2 = a 2 − ( a 2 ⋅ q 1 ) q 1 \mathbf{v}_2 = \mathbf{a}_2 - (\mathbf{a}_2 \cdot \mathbf{q}_1) \mathbf{q}_1 v2=a2(a2q1)q1
  4. 标准化得:
    q 2 = v 2 ∥ v 2 ∥ \mathbf{q}_2 = \frac{\mathbf{v}_2}{\|\mathbf{v}_2\|} q2=v2v2

生成的 { q 1 , q 2 } \{\mathbf{q}_1, \mathbf{q}_2\} {q1,q2} 是标准正交基。

Python实现 🐍
def gram_schmidt(vectors):
    """将一组线性无关向量正交化"""
    basis = []
    for v in vectors:
        w = v.copy()  # 从原始向量开始
        for b in basis:
            # 减去在已有基向量上的投影
            w = w - np.dot(w, b) / np.dot(b, b) * b
        
        # 如果剩余向量不为零,则标准化并添加到基向量集
        if np.linalg.norm(w) > 1e-10:
            basis.append(w / np.linalg.norm(w))
            
    return np.array(basis)

# 示例
vectors = np.array([[1, 1], [1, 0]])
orthonormal_basis = gram_schmidt(vectors)
print("正交基:\n", orthonormal_basis)

# 验证正交性
dot_product = np.dot(orthonormal_basis[0], orthonormal_basis)
print(f"内积结果(应接近0): {dot_product:.10f}")

🔬 4. 正交投影与矩阵表示

4.1 矩阵向量乘法的几何解释 📈

在标准正交基下,向量 v \mathbf{v} v 的坐标可表示为:

v 投影 = [ v ⋅ e 1 v ⋅ e 2 ] \mathbf{v}_{\text{投影}} = \begin{bmatrix} \mathbf{v} \cdot \mathbf{e}_1 \\ \mathbf{v} \cdot \mathbf{e}_2 \end{bmatrix} v投影=[ve1ve2]

它等价于基向量组成的变换矩阵 Q = [ e 1 e 2 ] \mathbf{Q} = [\mathbf{e}_1 \quad \mathbf{e}_2] Q=[e1e2] 的转置与向量的乘积:

v 投影 = Q T v \mathbf{v}_{\text{投影}} = \mathbf{Q}^T \mathbf{v} v投影=QTv

4.2 投影矩阵 🔄

向量 v \mathbf{v} v 投影到子空间 W W W 上的投影矩阵为:

P W = Q ( Q T Q ) − 1 Q T \mathbf{P}_W = \mathbf{Q}(\mathbf{Q}^T\mathbf{Q})^{-1}\mathbf{Q}^T PW=Q(QTQ)1QT

Q \mathbf{Q} Q 是标准正交基时,简化为:

P W = Q Q T \mathbf{P}_W = \mathbf{Q}\mathbf{Q}^T PW=QQT

🌟 5. 机器学习中的应用实例

5.1 主成分分析 (PCA) 🧠

PCA是最常见的降维技术,其核心就是寻找数据最大方差方向的正交基,并在该基上投影:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

# 生成有相关性的二维数据
np.random.seed(42)
cov = [[2, 1.5], [1.5, 1]]
data = np.random.multivariate_normal([0, 0], cov, 500)

# 应用PCA
pca = PCA(n_components=2)
pca.fit(data)
transformed = pca.transform(data)

# 可视化
plt.figure(figsize=(12, 5))

# 原始数据
plt.subplot(1, 2, 1)
plt.scatter(data[:, 0], data[:, 1], alpha=0.5)
plt.title('原始数据')
plt.grid(True)

# PCA转换后的数据
plt.subplot(1, 2, 2)
plt.scatter(transformed[:, 0], transformed[:, 1], alpha=0.5)
for i, (comp, var) in enumerate(zip(pca.components_, pca.explained_variance_)):
    plt.quiver(0, 0, comp[0], comp, scale=var*3, color='r',
               label=f'PC{i+1}: {var:.2f}')
plt.title('PCA转换后数据')
plt.grid(True)
plt.legend()

plt.tight_layout()
plt.show()

print(f"主成分方差比例: {pca.explained_variance_ratio_}")
print(f"主成分方向: {pca.components_}")

5.2 QR分解与矩阵求解 🧮

QR分解是Gram-Schmidt正交化的矩阵形式,广泛用于线性方程组求解和最小二乘法问题:

import numpy as np

# 用于求解线性方程组 Ax = b
A = np.array([[2, 1], [1, 3]])
b = np.array([5, 4])

# QR分解
Q, R = np.linalg.qr(A)

# 求解方程 Rx = Q^T b
y = Q.T @ b
x = np.linalg.solve(R, y)

print("QR分解求解的解: ", x)
print("直接求解的解: ", np.linalg.solve(A, b))
print("误差: ", np.linalg.norm(A @ x - b))

5.3 核方法与支持向量机 🔍

在支持向量机(SVM)中,核函数实质上定义了特征空间中的内积,使我们能在高维空间中执行计算而无需显式映射:

from sklearn import svm
from sklearn.datasets import make_circles
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt

# 生成非线性可分数据
X, y = make_circles(n_samples=500, noise=0.1, factor=0.3, random_state=42)

# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42)

# 训练RBF核SVM(本质是在高维空间中寻找正交超平面)
clf = svm.SVC(kernel='rbf', gamma=10)
clf.fit(X_train, y_train)

# 预测与评估
accuracy = clf.score(X_test, y_test)

# 绘制决策边界
h = 0.02
x_min, x_max = X[:, 0].min() - 0.1, X[:, 0].max() + 0.1
y_min, y_max = X[:, 1].min() - 0.1, X[:, 1].max() + 0.1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                     np.arange(y_min, y_max, h))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.figure(figsize=(8, 6))
plt.contourf(xx, yy, Z, alpha=0.3, cmap=plt.cm.Paired)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', cmap=plt.cm.Paired)
plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],
            s=80, facecolors='none', edgecolors='k')
plt.title(f'RBF核SVM (准确率: {accuracy:.2f})')
plt.xlabel('特征1')
plt.ylabel('特征2')
plt.tight_layout()
plt.show()

5.4 正交化在神经网络中的应用 🧠

正交初始化和正交约束可以提高神经网络的训练稳定性和泛化能力:

import torch
import torch.nn as nn
import numpy as np

class OrthogonalRegularization(nn.Module):
    """实现权重正交化的正则项"""
    def __init__(self):
        super(OrthogonalRegularization, self).__init__()
    
    def forward(self, model, strength=1e-4):
        reg_loss = 0.0
        for name, param in model.named_parameters():
            if 'weight' in name:
                if param.ndimension() > 1:
                    # 计算 WW^T - I 的范数,鼓励权重矩阵正交
                    mat = param.view(param.shape[0], -1)
                    sym = torch.mm(mat, mat.t())
                    sym -= torch.eye(sym.shape[0]).to(param.device)
                    reg_loss += torch.sum(sym * sym)
        
        return strength * reg_loss

# 在训练循环中使用:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels) + ortho_reg(model)
loss.backward()
optimizer.step()

🧮 6. 正交投影和内积空间的进阶应用

6.1 最小二乘法与线性回归 📊

最小二乘法是机器学习中最基础的模型之一,其解可以通过正交投影来理解:

β ^ = ( X T X ) − 1 X T y \hat{\beta} = (X^TX)^{-1}X^Ty β^=(XTX)1XTy

这个公式本质上是将目标向量 y y y 投影到 X X X 的列空间上:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# 生成带噪声的线性数据
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 3 * X.squeeze() + 2 + np.random.randn(100) * 0.5

# 正交投影方法(手动实现最小二乘)
X_b = np.c_[np.ones((100, 1)), X]  # 添加偏置项
theta_best = np.linalg.inv(X_b.T @ X_b) @ X_b.T @ y
print(f"手动计算的系数: {theta_best}")

# 使用sklearn实现
reg = LinearRegression()
reg.fit(X, y)
print(f"sklearn系数: [{reg.intercept_}, {reg.coef_[0]}]")

# 绘制结果
plt.figure(figsize=(10, 6))
plt.scatter(X, y, alpha=0.7)
X_test = np.array([[0], ])
X_test_b = np.c_[np.ones((2, 1)), X_test]
y_pred = X_test_b @ theta_best
plt.plot(X_test, y_pred, 'r-', linewidth=2, label='预测线')
plt.xlabel('X')
plt.ylabel('y')
plt.title('通过正交投影实现的最小二乘法')
plt.grid(True)
plt.legend()
plt.show()

6.2 特征值分解与谱理论 🔮

正交性在特征值分解中表现为正交特征向量,这是许多算法的理论基础:

import numpy as np
import matplotlib.pyplot as plt

# 创建一个对称矩阵
A = np.array([[4, 2], [2, 3]])

# 特征值分解
eigenvalues, eigenvectors = np.linalg.eig(A)
print("特征值:", eigenvalues)
print("特征向量:\n", eigenvectors)

# 验证正交性
dot_product = np.dot(eigenvectors[:, 0], eigenvectors[:, 1])
print(f"特征向量内积(应接近0): {dot_product:.10f}")

# 验证 Av = λv
for i in range(len(eigenvalues)):
    v = eigenvectors[:, i]
    lhs = A @ v
    rhs = eigenvalues[i] * v
    print(f"特征向量{i+1}的验证误差: {np.linalg.norm(lhs - rhs):.10f}")

# 可视化
plt.figure(figsize=(7, 7))
plt.axhline(y=0, color='k', linestyle='-', alpha=0.3)
plt.axvline(x=0, color='k', linestyle='-', alpha=0.3)
plt.grid(alpha=0.3)

# 绘制原始矩阵的作用
for i in range(-2, 3):
    for j in range(-2, 3):
        v = np.array([i, j]) * 0.5
        Av = A @ v
        plt.arrow(v[0], v, Av[0]-v[0], Av-v, 
                 head_width=0.1, head_length=0.2, fc='b', ec='b', alpha=0.3)

# 绘制特征向量
colors = ['red', 'green']
for i in range(len(eigenvalues)):
    v = eigenvectors[:, i] * eigenvalues[i]
    plt.arrow(0, 0, v[0], v, head_width=0.2, head_length=0.3, 
              fc=colors[i], ec=colors[i], label=f'特征向量{i+1} (λ={eigenvalues[i]:.2f})')

plt.xlim(-4, 4)
plt.ylim(-4, 4)
plt.title('特征向量与矩阵变换')
plt.legend()
plt.axis('equal')
plt.show()

📝 7. 总结与思考

7.1 核心概念回顾 💭

  • 内积空间提供了计算向量长度、角度和投影的统一框架
  • 正交性是向量空间中最重要的几何关系之一,表示两个方向完全独立
  • 正交投影允许我们将向量分解为互相独立的分量
  • Gram-Schmidt过程构造了线性无关向量集的正交基
  • 投影矩阵以矩阵形式表达投影操作,为线性代数提供几何解释

7.2 机器学习中的价值 🌱

内积空间和正交投影在机器学习中至关重要,因为它们:

  1. 简化计算:正交基使得矩阵运算和问题分解更加高效
  2. 增强解释性:正交特征往往具有更好的解释性和独立含义
  3. 避免过拟合:特征正交化减少了冗余信息,有助于泛化
  4. 启发算法设计:从PCA到深度学习中的正交初始化,正交性启发了众多算法改进

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/979654.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Cherry Studio + 火山引擎 构建个人AI智能知识库

🍉在信息化时代,个人知识库的构建对于提高工作效率、知识管理和信息提取尤为重要。尤其是当这些知识库能结合人工智能来智能化地整理、分类和管理数据时,效果更为显著。我最近尝试通过 Cherry Studio 和 火山引擎 来搭建个人智能知识库&#…

深入浅出数据结构(图)

图 图的逻辑结构定义逻辑结构基本术语(提起来脑海有印象就行)对比 存储结构(邻接矩阵和邻接表)铺垫 邻接矩阵透过问题看本质无向图相关有向图相关网图相关 伪代码实现类(无向图)构造函数(伪代码…

Android Activity启动流程详解

目录 Activity 启动流程详细解析 1. 应用层发起启动请求 1.1 调用 startActivity() 1.2 通过 Instrumentation 转发请求 2. 系统服务处理(AMS 阶段) 2.1 Binder IPC 通信 2.2 AMS 处理流程 2.3 跨进程回调 ApplicationThread 3. 目标进程初始化…

338.比特位计数<动态规划>

338. 比特位计数 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> countBits(int n) {//将所有数初始化为0vector<int>dp(n1,0);for(int i 0; i<n;i){if(i % 2 0){dp[i] dp[i/2];}else{dp[i] dp[i/2]1;}}return dp;} };

word转换为pdf后图片失真解决办法、高质量PDF转换方法

1、安装Adobe Acrobat Pro DC 自行安装 2、配置Acrobat PDFMaker &#xff08;1&#xff09;点击word选项卡上的Acrobat插件&#xff0c;&#xff08;2&#xff09;点击“首选项”按钮&#xff0c;&#xff08;3&#xff09;点击“高级配置”按钮&#xff08;4&#xff09;点…

C++ primer plus 第四节 复合类型

本章内容包括: • 创建和使用数组 • 创建和使用 c-风格字符串 • 创建和使用 string 类字符串 • 使用方法getline( )和 get( )读取字符串 • 混合输入字符串和数字 • 创建和使用结构 • 创建和使用共用休 • 创建和使用枚举 • 创建和使用指针 • 使用 new和delete 管理动态…

热点创意大师智能体

热点创意大师&#xff1a;自媒体创作者的灵感引擎 文心智能体平台AgentBuilder | 想象即现实 文心智能体平台AgentBuilder&#xff0c;是百度推出的基于文心大模型的智能体平台&#xff0c;支持广大开发者根据自身行业领域、应用场景&#xff0c;选取不同类型的开发方式&#…

数据集笔记:新加坡 一些交通的时间序列统计量

1 机动车年度保有量 data.gov.sg 各类机动车年度保有量 数据范围&#xff1a;2005年1月 - 2020年12月 1.1 数据说明 非高峰时段车辆 包括周末车&#xff08;Weekend Cars&#xff09;和 修订版非高峰时段车辆&#xff08;Revised Off Peak Cars&#xff09;&#xff0c;该…

Nginx 代理配置导致浏览器应用网页页面加载失败的分析与解决

Nginx 代理配置导致应用页面加载失败的分析与解决 前期部署信息&#xff1a; 部署DM数据库DEM时&#xff0c;配置了nginx代理&#xff0c;conf配置内容如下&#xff1a; charset utf-8;client_max_body_size 128M;listen 4567;server_name 192.168.1.156;root /opt/h5/;index…

交通安全知识竞赛主持稿串词

各位领导、在场的所有职工同志们&#xff0c;大家下午好! 行政房管部为了配合我厂开展的一系列安全生产宣传教育活动&#xff0c;普及安全知识&#xff0c;弘扬安全文化&#xff0c;结合本部门工作实际&#xff0c;今天在这里开展一项交通安全法律法规直至竞赛活动。 特意前来…

发展中的脑机接口:SSVEP特征提取技术

一、简介 脑机接口&#xff08;BCI&#xff09;是先进的系统&#xff0c;能够通过分析大脑信号与外部设备之间建立通信&#xff0c;帮助有障碍的人与环境互动。BCI通过分析大脑信号&#xff0c;提供了一种非侵入式、高效的方式&#xff0c;让人们与外部设备进行交流。BCI技术越…

Qt常用控件之旋钮QDial

旋钮QDial QDial 表示一个旋钮控件。 1. QDial属性 属性说明value当前数值。minimum最小值。maximum最大值。singleStep按下方向键时改变的步长。pageStep按下 pageUp/pageDown 的时候改变的步长。sliderPosition界面上旋钮显示的初始位置。tracking外观是否会跟踪数值变化&…

开源向量数据库Milvus简介

开源向量数据库Milvus简介 Milvus 是一个开源的、高性能、高扩展性的向量数据库&#xff0c;专门用于处理和检索高维向量数据。它适用于相似性搜索&#xff08;Approximate Nearest Neighbor Search&#xff0c;ANN&#xff09;&#xff0c;特别适合**AI、推荐系统、计算机视觉…

html+js 轮播图

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>轮播图示例</title><style>/* 基本样式…

ISP 常见流程

1.sensor输出&#xff1a;一般为raw-OBpedestal。加pedestal避免减OB出现负值&#xff0c;同时保证信号超过ADC最小电压阈值&#xff0c;使信号落在ADC正常工作范围。 2. pedestal correction&#xff1a;移除sensor加的基底&#xff0c;确保后续处理信号起点正确。 3. Linea…

BDF报告翻译简介后:关于A φ方法criterion引理1如何由范数导出内积

关于A φ方法criterion 引理1 如何由范数导出内积 在数学中&#xff0c;特别是在泛函分析中&#xff0c;给定一个范数&#xff0c;可以定义一个与之相关的内积。这个过程不是总是可能的&#xff0c;但当一个赋范向量空间是完备的且满足平行四边形恒等式时&#xff0c;可以导出…

FakeApp 技术浅析(二):生成对抗网络

生成对抗网络&#xff08;Generative Adversarial Networks&#xff0c;简称 GANs&#xff09;是 FakeApp 等深度伪造&#xff08;deepfake&#xff09;应用的核心技术。GANs 由 生成器&#xff08;Generator&#xff09; 和 判别器&#xff08;Discriminator&#xff09; 两个…

基于fast-whisper模型的语音识别工具的设计与实现

目录 摘 要 第1章 绪 论 1.1 论文研究主要内容 1.1.1模型类型选择 1.1.2开发语言的选择 1.2 国内外现状 第2章 关键技术介绍 2.1 关键性开发技术的介绍 2.1.1 Faster-Whisper数据模型 2.1.2 Django 第3章 系统分析 3.1 构架概述 3.1.1 功能构架 3.1.2 模块需求描述 3.2 系统开…

华为在不同发展时期的战略选择(节选)

华为在不同发展时期的战略选择&#xff08;节选&#xff09; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 来源&#xff1a;谢宁专著《华为战略管理法&#xff1a;DSTE实战体系》。本文有节选修改。 导言 从目前所取得的成就往回看&#xff0c;华为…

STM32定时器超声波测距实验手册

1. 实验目标 使用STM32 HAL库和定时器实现超声波测距功能。 当超声波模块前方障碍物距离 < 10cm 时&#xff0c;点亮板载LED。 2. 硬件准备 硬件模块说明STM32开发板STM32F103C8T6HC-SR04模块超声波测距模块杜邦线若干连接模块与开发板 3. 硬件连接 HC-SR04引脚STM32引脚…