机器学习数学基础:线性代数、概率论与微积分实战指南

📅 2026/7/12 9:49:05
机器学习数学基础:线性代数、概率论与微积分实战指南
很多机器学习初学者在入门时都会遇到一个共同的困惑明明跟着教程调通了代码但遇到新问题就束手无策或者看不懂论文中的数学公式。这背后的根本原因往往是数学基础不够扎实。本文基于最新的2026版机器学习数学课程体系系统梳理从线性代数、概率论到微积分的核心知识结合Python实战代码帮助开发者真正理解机器学习背后的数学原理。1. 机器学习数学基础概述1.1 为什么机器学习需要数学基础机器学习算法本质上都是数学模型的实现。比如线性回归基于最小二乘法支持向量机依赖凸优化理论神经网络使用梯度下降进行参数更新。如果没有扎实的数学基础就会出现以下问题调参盲目不理解正则化系数的数学意义只能盲目尝试模型选择困难无法从数学原理层面比较不同算法的适用场景问题排查效率低遇到梯度消失、过拟合等问题时难以快速定位根源论文阅读障碍最新研究论文中大量数学公式成为理解壁垒1.2 三大数学支柱及其关系机器学习的数学基础主要建立在三个核心领域上线性代数处理向量、矩阵运算是数据表示的基础。神经网络中的前向传播、反向传播都是矩阵运算。概率论描述不确定性为统计学习提供理论框架。贝叶斯分类、隐马尔科夫模型等都依赖概率论。微积分研究变化规律是优化算法的数学基础。梯度下降法就是微积分中导数概念的直接应用。这三者之间存在紧密联系概率论中的期望计算依赖微积分多元概率分布用线性代数工具处理而微积分中的梯度本身就是向量概念。1.3 学习路径规划对于不同基础的开发者建议采用分层学习策略初学者路径0-3个月线性代数向量、矩阵基础运算概率论基本概念、条件概率、贝叶斯定理微积分导数、偏导数基础实战用Python实现线性回归进阶者路径3-6个月线性代数特征值分解、奇异值分解概率论随机变量、概率分布、最大似然估计微积分多元函数梯度、链式法则实战逻辑回归、PCA降维实现高级专题6个月以上优化理论凸优化、拉格朗日乘子法信息论熵、交叉熵、KL散度随机过程马尔科夫链、蒙特卡洛方法2. 线性代数核心概念与实战2.1 向量与矩阵运算向量是机器学习中最基本的数据结构。每个数据样本都可以看作一个向量整个数据集就是矩阵。import numpy as np import matplotlib.pyplot as plt # 向量创建与基本运算 v1 np.array([1, 2, 3]) v2 np.array([4, 5, 6]) print(向量加法:, v1 v2) print(向量点积:, np.dot(v1, v2)) print(向量范数:, np.linalg.norm(v1)) # 矩阵运算示例 A np.array([[1, 2], [3, 4]]) B np.array([[5, 6], [7, 8]]) print(矩阵乘法:) print(np.dot(A, B)) print(矩阵转置:) print(A.T) # 单位矩阵 I np.eye(3) print(3x3单位矩阵:) print(I)关键理解在神经网络中每一层的计算都是输入向量与权重矩阵的乘法加上偏置向量然后通过激活函数。理解矩阵乘法是理解深度学习的基础。2.2 线性变换与特征分解线性变换是矩阵的核心应用特征分解帮助我们理解变换的本质特性。# 线性变换可视化 points np.array([[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]).T # 定义变换矩阵旋转45度 缩放 theta np.pi / 4 transform_matrix np.array([ [np.cos(theta), -np.sin(theta)], [np.sin(theta), np.cos(theta)] ]) * 1.5 # 缩放因子 transformed_points np.dot(transform_matrix, points) plt.figure(figsize(10, 5)) plt.subplot(1, 2, 1) plt.plot(points[0], points[1], bo-) plt.title(原始图形) plt.axis(equal) plt.subplot(1, 2, 2) plt.plot(transformed_points[0], transformed_points[1], ro-) plt.title(线性变换后) plt.axis(equal) plt.show() # 特征值与特征向量计算 A np.array([[4, 1], [2, 3]]) eigenvalues, eigenvectors np.linalg.eig(A) print(特征值:, eigenvalues) print(特征向量:) print(eigenvectors)应用场景主成分分析PCA就是基于特征分解的降维算法找到数据方差最大的方向特征向量实现数据压缩和可视化。2.3 奇异值分解SVD与应用SVD是更通用的矩阵分解方法适用于非方阵在推荐系统、自然语言处理中广泛应用。# SVD分解示例 # 模拟用户-物品评分矩阵 ratings np.array([ [5, 3, 0, 1], [4, 0, 0, 1], [1, 1, 0, 5], [1, 0, 0, 4], [0, 1, 5, 4] ]) U, S, Vt np.linalg.svd(ratings, full_matricesFalse) print(U矩阵形状:, U.shape) print(奇异值:, S) print(V转置矩阵形状:, Vt.shape) # 用SVD实现矩阵近似降维 k 2 # 保留2个主要成分 ratings_approx U[:, :k] np.diag(S[:k]) Vt[:k, :] print(原始矩阵:) print(ratings) print(SVD近似矩阵:) print(ratings_approx)实战意义SVD可以帮助我们发现数据中的潜在因素比如在电影推荐中SVD可能自动发现科幻程度、喜剧程度等隐含特征。3. 概率论核心概念与机器学习应用3.1 基本概率概念与贝叶斯定理概率论为机器学习提供不确定性建模框架贝叶斯定理是很多算法的理论基础。# 条件概率与贝叶斯定理实现 class BayesianClassifier: def __init__(self): self.prior {} # 先验概率 P(类别) self.likelihood {} # 似然概率 P(特征|类别) def fit(self, X, y): 训练贝叶斯分类器 n_samples len(y) classes np.unique(y) # 计算先验概率 for c in classes: self.prior[c] np.sum(y c) / n_samples # 计算似然概率简化版假设特征独立 self.likelihood {} for c in classes: X_c X[y c] self.likelihood[c] { mean: np.mean(X_c, axis0), std: np.std(X_c, axis0) } def predict_proba(self, x): 预测概率 probabilities {} for c in self.prior.keys(): # 使用高斯分布计算似然 likelihood 1.0 for i in range(len(x)): mean self.likelihood[c][mean][i] std self.likelihood[c][std][i] # 高斯概率密度函数 exponent -0.5 * ((x[i] - mean) / std) ** 2 likelihood * (1 / (std * np.sqrt(2 * np.pi))) * np.exp(exponent) probabilities[c] self.prior[c] * likelihood # 归一化 total sum(probabilities.values()) for c in probabilities: probabilities[c] / total return probabilities # 测试贝叶斯分类器 from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split X, y make_classification(n_samples1000, n_features4, n_classes2, random_state42) X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2) classifier BayesianClassifier() classifier.fit(X_train, y_train) # 预测示例 sample X_test[0] probabilities classifier.predict_proba(sample) print(类别概率:, probabilities)3.2 概率分布与随机变量理解常见概率分布对于模型选择和数据生成至关重要。import scipy.stats as stats # 常见概率分布可视化 x np.linspace(-4, 4, 1000) plt.figure(figsize(15, 10)) # 正态分布 plt.subplot(2, 3, 1) plt.plot(x, stats.norm.pdf(x, 0, 1), b-, labelN(0,1)) plt.plot(x, stats.norm.pdf(x, 1, 0.5), r-, labelN(1,0.5)) plt.title(正态分布) plt.legend() # 均匀分布 plt.subplot(2, 3, 2) x_uniform np.linspace(0, 1, 100) plt.plot(x_uniform, stats.uniform.pdf(x_uniform), g-) plt.title(均匀分布 U(0,1)) # 泊松分布 plt.subplot(2, 3, 3) x_poisson np.arange(0, 15) for lam in [1, 4, 10]: plt.plot(x_poisson, stats.poisson.pmf(x_poisson, lam), o-, labelfλ{lam}) plt.title(泊松分布) plt.legend() # 二项分布 plt.subplot(2, 3, 4) x_binomial np.arange(0, 20) plt.plot(x_binomial, stats.binom.pmf(x_binomial, 20, 0.3), ro-, labeln20,p0.3) plt.plot(x_binomial, stats.binom.pmf(x_binomial, 20, 0.7), bo-, labeln20,p0.7) plt.title(二项分布) plt.legend() # 指数分布 plt.subplot(2, 3, 5) x_exp np.linspace(0, 5, 100) plt.plot(x_exp, stats.expon.pdf(x_exp, scale1), purple, labelλ1) plt.plot(x_exp, stats.expon.pdf(x_exp, scale0.5), orange, labelλ2) plt.title(指数分布) plt.legend() # Beta分布 plt.subplot(2, 3, 6) x_beta np.linspace(0, 1, 100) plt.plot(x_beta, stats.beta.pdf(x_beta, 2, 5), b-, labelα2,β5) plt.plot(x_beta, stats.beta.pdf(x_beta, 5, 2), r-, labelα5,β2) plt.title(Beta分布) plt.legend() plt.tight_layout() plt.show()3.3 最大似然估计与期望最大算法最大似然估计是参数估计的核心方法EM算法是处理隐变量的重要工具。# 最大似然估计实战估计正态分布参数 def mle_normal(data): 正态分布的最大似然估计 n len(data) mu_mle np.mean(data) sigma2_mle np.sum((data - mu_mle) ** 2) / n return mu_mle, sigma2_mle # 生成模拟数据 true_mu, true_sigma 5, 2 np.random.seed(42) data np.random.normal(true_mu, true_sigma, 1000) # MLE估计 mu_est, sigma2_est mle_normal(data) sigma_est np.sqrt(sigma2_est) print(f真实参数: μ{true_mu}, σ{true_sigma}) print(fMLE估计: μ{mu_est:.3f}, σ{sigma_est:.3f}) # 可视化比较 x np.linspace(true_mu - 3*true_sigma, true_mu 3*true_sigma, 100) true_pdf stats.norm.pdf(x, true_mu, true_sigma) est_pdf stats.norm.pdf(x, mu_est, sigma_est) plt.figure(figsize(10, 6)) plt.hist(data, bins30, densityTrue, alpha0.7, label数据分布) plt.plot(x, true_pdf, r-, linewidth2, label真实分布) plt.plot(x, est_pdf, b--, linewidth2, labelMLE估计) plt.legend() plt.title(最大似然估计效果对比) plt.show()4. 微积分在机器学习中的应用4.1 导数与梯度下降梯度下降是机器学习中最核心的优化算法基于微积分的导数概念。# 梯度下降法实现 def gradient_descent(f, df, x0, learning_rate0.01, max_iter1000, tol1e-6): 梯度下降算法 参数: f: 目标函数 df: 梯度函数 x0: 初始点 learning_rate: 学习率 max_iter: 最大迭代次数 tol: 收敛容忍度 x x0 trajectory [x] for i in range(max_iter): grad df(x) x_new x - learning_rate * grad # 检查收敛 if np.linalg.norm(x_new - x) tol: break x x_new trajectory.append(x) return x, trajectory # 示例最小化二次函数 f(x) x^2 5x 6 def quadratic(x): return x**2 5*x 6 def quadratic_grad(x): return 2*x 5 # 运行梯度下降 x0 10 # 初始点 x_opt, trajectory gradient_descent(quadratic, quadratic_grad, x0, learning_rate0.1) print(f理论最小值点: x {-2.5}) print(f梯度下降结果: x {x_opt:.6f}) print(f函数最小值: f(x) {quadratic(x_opt):.6f}) # 可视化梯度下降过程 x_vals np.linspace(-6, 11, 100) y_vals quadratic(x_vals) traj_vals [quadratic(x) for x in trajectory] plt.figure(figsize(12, 5)) plt.subplot(1, 2, 1) plt.plot(x_vals, y_vals, b-, labelf(x) x² 5x 6) plt.plot(trajectory, traj_vals, ro-, label梯度下降路径) plt.xlabel(x) plt.ylabel(f(x)) plt.legend() plt.grid(True) plt.subplot(1, 2, 2) plt.semilogy([abs(quadratic(x) - quadratic(-2.5)) for x in trajectory]) plt.xlabel(迭代次数) plt.ylabel(与最优值的差距对数尺度) plt.title(收敛速度) plt.grid(True) plt.tight_layout() plt.show()4.2 偏导数与多元函数优化机器学习中的损失函数通常是多元函数需要偏导数来计算梯度。# 多元函数梯度下降示例 def multivariate_function(x): 二元函数: f(x,y) x^2 y^2 2x 4y 5 return x[0]**2 x[1]**2 2*x[0] 4*x[1] 5 def multivariate_gradient(x): 计算梯度: [∂f/∂x, ∂f/∂y] [2x2, 2y4] return np.array([2*x[0] 2, 2*x[1] 4]) # 运行多元梯度下降 x0_multivariate np.array([10, 10]) x_opt_multi, trajectory_multi gradient_descent( multivariate_function, multivariate_gradient, x0_multivariate, learning_rate0.1 ) print(f理论最小值点: (-1, -2)) print(f梯度下降结果: ({x_opt_multi[0]:.6f}, {x_opt_multi[1]:.6f})) # 3D可视化 from mpl_toolkits.mplot3d import Axes3D x np.linspace(-5, 5, 30) y np.linspace(-5, 5, 30) X, Y np.meshgrid(x, y) Z multivariate_function([X, Y]) fig plt.figure(figsize(12, 5)) ax1 fig.add_subplot(121, projection3d) ax1.plot_surface(X, Y, Z, cmapviridis, alpha0.8) ax1.set_xlabel(X) ax1.set_ylabel(Y) ax1.set_zlabel(f(X,Y)) ax1.set_title(函数曲面) # 等高线图 ax2 fig.add_subplot(122) contour ax2.contour(X, Y, Z, levels20) ax2.clabel(contour, inlineTrue, fontsize8) traj_array np.array(trajectory_multi) ax2.plot(traj_array[:, 0], traj_array[:, 1], ro-, markersize4) ax2.set_xlabel(X) ax2.set_ylabel(Y) ax2.set_title(梯度下降路径等高线图) ax2.grid(True) plt.tight_layout() plt.show()4.3 链式法则与反向传播链式法则是神经网络反向传播的数学基础理解它对于掌握深度学习至关重要。# 手动实现简单的神经网络前向传播和反向传播 class SimpleNeuralNetwork: def __init__(self, input_size, hidden_size, output_size): # 初始化权重 self.W1 np.random.randn(input_size, hidden_size) * 0.1 self.b1 np.zeros((1, hidden_size)) self.W2 np.random.randn(hidden_size, output_size) * 0.1 self.b2 np.zeros((1, output_size)) def forward(self, X): # 前向传播 self.z1 np.dot(X, self.W1) self.b1 self.a1 self.sigmoid(self.z1) # 隐藏层激活 self.z2 np.dot(self.a1, self.W2) self.b2 self.a2 self.sigmoid(self.z2) # 输出层激活 return self.a2 def backward(self, X, y, learning_rate0.1): # 反向传播 m X.shape[0] # 样本数量 # 输出层误差 delta2 (self.a2 - y) * self.sigmoid_derivative(self.z2) dW2 np.dot(self.a1.T, delta2) / m db2 np.sum(delta2, axis0, keepdimsTrue) / m # 隐藏层误差 delta1 np.dot(delta2, self.W2.T) * self.sigmoid_derivative(self.z1) dW1 np.dot(X.T, delta1) / m db1 np.sum(delta1, axis0, keepdimsTrue) / m # 更新权重 self.W2 - learning_rate * dW2 self.b2 - learning_rate * db2 self.W1 - learning_rate * dW1 self.b1 - learning_rate * db1 def sigmoid(self, x): return 1 / (1 np.exp(-x)) def sigmoid_derivative(self, x): return self.sigmoid(x) * (1 - self.sigmoid(x)) def train(self, X, y, epochs1000, learning_rate0.1): losses [] for epoch in range(epochs): # 前向传播 output self.forward(X) # 计算损失均方误差 loss np.mean((output - y) ** 2) losses.append(loss) # 反向传播 self.backward(X, y, learning_rate) if epoch % 100 0: print(fEpoch {epoch}, Loss: {loss:.6f}) return losses # 创建简单的非线性数据集 np.random.seed(42) X np.random.randn(100, 2) y (X[:, 0] 0).astype(float).reshape(-1, 1) # 简单分类问题 # 训练神经网络 nn SimpleNeuralNetwork(input_size2, hidden_size4, output_size1) losses nn.train(X, y, epochs1000, learning_rate0.1) # 可视化训练过程 plt.figure(figsize(10, 4)) plt.subplot(1, 2, 1) plt.plot(losses) plt.xlabel(Epoch) plt.ylabel(Loss) plt.title(训练损失曲线) plt.grid(True) # 可视化决策边界 plt.subplot(1, 2, 2) xx, yy np.meshgrid(np.linspace(-3, 3, 50), np.linspace(-3, 3, 50)) X_grid np.c_[xx.ravel(), yy.ravel()] Z nn.forward(X_grid).reshape(xx.shape) plt.contourf(xx, yy, Z, levels50, cmapRdYlBu, alpha0.8) plt.scatter(X[:, 0], X[:, 1], cy.flatten(), cmapRdYlBu, edgecolorsblack) plt.colorbar() plt.title(神经网络决策边界) plt.xlabel(X1) plt.ylabel(X2) plt.tight_layout() plt.show()5. 机器学习数学实战项目5.1 线性回归的数学实现从数学原理出发手动实现线性回归算法。class LinearRegression: def __init__(self): self.weights None self.bias None def fit(self, X, y, learning_rate0.01, epochs1000): 使用梯度下降训练线性回归模型 n_samples, n_features X.shape # 初始化参数 self.weights np.zeros(n_features) self.bias 0 # 梯度下降 for epoch in range(epochs): # 预测 y_pred np.dot(X, self.weights) self.bias # 计算梯度 dw (1 / n_samples) * np.dot(X.T, (y_pred - y)) db (1 / n_samples) * np.sum(y_pred - y) # 更新参数 self.weights - learning_rate * dw self.bias - learning_rate * db if epoch % 100 0: loss np.mean((y_pred - y) ** 2) print(fEpoch {epoch}, Loss: {loss:.6f}) def predict(self, X): return np.dot(X, self.weights) self.bias def score(self, X, y): 计算R²分数 y_pred self.predict(X) ss_res np.sum((y - y_pred) ** 2) ss_tot np.sum((y - np.mean(y)) ** 2) return 1 - (ss_res / ss_tot) # 生成线性回归数据 np.random.seed(42) X_lr 2 * np.random.rand(100, 1) y_lr 4 3 * X_lr np.random.randn(100, 1) # 训练模型 lr LinearRegression() lr.fit(X_lr, y_lr.flatten()) print(f真实参数: w3, b4) print(f学习参数: w{lr.weights[0]:.3f}, b{lr.bias:.3f}) # 可视化结果 plt.figure(figsize(10, 6)) plt.scatter(X_lr, y_lr, alpha0.7, label数据点) x_line np.linspace(0, 2, 100).reshape(-1, 1) y_line lr.predict(x_line) plt.plot(x_line, y_line, r-, linewidth2, label回归直线) plt.xlabel(X) plt.ylabel(y) plt.legend() plt.title(线性回归结果) plt.grid(True) plt.show()5.2 逻辑回归与交叉熵损失逻辑回归是分类问题的基础算法使用交叉熵作为损失函数。class LogisticRegression: def __init__(self, learning_rate0.01, epochs1000): self.learning_rate learning_rate self.epochs epochs self.weights None self.bias None def sigmoid(self, z): return 1 / (1 np.exp(-z)) def fit(self, X, y): n_samples, n_features X.shape self.weights np.zeros(n_features) self.bias 0 # 梯度下降 for epoch in range(self.epochs): # 前向传播 linear_model np.dot(X, self.weights) self.bias y_pred self.sigmoid(linear_model) # 计算梯度交叉熵损失的导数 dw (1 / n_samples) * np.dot(X.T, (y_pred - y)) db (1 / n_samples) * np.sum(y_pred - y) # 更新参数 self.weights - self.learning_rate * dw self.bias - self.learning_rate * db if epoch % 100 0: # 计算损失交叉熵 loss -np.mean(y * np.log(y_pred) (1 - y) * np.log(1 - y_pred)) print(fEpoch {epoch}, Loss: {loss:.6f}) def predict(self, X, threshold0.5): linear_model np.dot(X, self.weights) self.bias y_pred self.sigmoid(linear_model) return (y_pred threshold).astype(int) # 生成分类数据 from sklearn.datasets import make_classification X_clf, y_clf make_classification(n_samples100, n_features2, n_redundant0, n_informative2, random_state1, n_clusters_per_class1) # 训练逻辑回归 log_reg LogisticRegression(learning_rate0.1, epochs1000) log_reg.fit(X_clf, y_clf) # 可视化决策边界 plt.figure(figsize(10, 6)) xx, yy np.meshgrid(np.linspace(-3, 3, 100), np.linspace(-3, 3, 100)) X_grid np.c_[xx.ravel(), yy.ravel()] Z log_reg.predict(X_grid).reshape(xx.shape) plt.contourf(xx, yy, Z, alpha0.8, cmapRdYlBu) plt.scatter(X_clf[:, 0], X_clf[:, 1], cy_clf, edgecolorsblack, cmapRdYlBu) plt.xlabel(Feature 1) plt.ylabel(Feature 2) plt.title(逻辑回归决策边界) plt.colorbar() plt.show()6. 常见数学问题与解决方案6.1 梯度消失与爆炸问题在深度神经网络中梯度消失和爆炸是常见问题理解其数学原理很重要。梯度消失原因当使用sigmoid或tanh激活函数时导数范围在(0,1)或(-1,1)多层连乘后梯度趋近于0。解决方案使用ReLU及其变体作为激活函数使用Batch Normalization合理的权重初始化He初始化、Xavier初始化# 演示梯度消失问题 def demonstrate_vanishing_gradient(): # 模拟深度网络的前向传播 np.random.seed(42) n_layers 10 layer_outputs [] # 使用sigmoid激活 x np.random.randn(100, 50) # 100个样本50个特征 for i in range(n_layers): weights np.random.randn(50, 50) * 0.1 # 小权重初始化 x 1 / (1 np.exp(-np.dot(x, weights))) # sigmoid激活 layer_outputs.append(x) # 检查各层输出的标准差衡量激活值分布 stds [np.std(output) for output in layer_outputs] plt.figure(figsize(10, 4)) plt.subplot(1, 2, 1) plt.plot(range(n_layers), stds, bo-) plt.xlabel(网络层数) plt.ylabel(激活值标准差) plt.title(梯度消失问题演示) plt.grid(True) # 对比使用ReLU的情况 layer_outputs_relu [] x_relu np.random.randn(100, 50) for i in range(n_layers): weights np.random.randn(50, 50) * 0.1 x_relu np.maximum(0, np.dot(x_relu, weights)) # ReLU激活 layer_outputs_relu.append(x_relu) stds_relu [np.std(output) for output in layer_outputs_relu] plt.subplot(1, 2, 2) plt.plot(range(n_layers), stds_relu, ro-) plt.xlabel(网络层数) plt.ylabel(激活值标准差) plt.title(ReLU激活值分布) plt.grid(True) plt.tight_layout() plt.show() demonstrate_vanishing_gradient()6.2 过拟合与正则化数学原理正则化通过修改损失函数来控制模型复杂度防止过拟合。L1正则化Lasso损失函数 λΣ|w|产生稀疏权重L2正则化Ridge损失函数 λΣw²缩小权重幅度# 正则化效果演示 def regularized_linear_regression(X, y, alpha1.0, regularizationl2): 带正则化的线性回归 n_samples, n_features X.shape if regularization l2: # Ridge回归闭式解: w (X^T X αI)^(-1) X^T y identity np.eye(n_features) weights np.linalg.inv(X.T X alpha * identity) X.T y else: # L1正则化需要迭代优化 from sklearn.linear_model import Lasso model Lasso(alphaalpha, max_iter10000) model.fit(X, y) weights model.coef_ return weights # 创建过拟合示例数据 np.random.seed(42) n_samples 30 X_high_dim np.random.randn(n_samples, 20) # 高维特征 true_weights np.array([1, 0.5] [0] * 18) # 只有前2个特征有用 y_high_dim X_high_dim true_weights np.random.randn(n_samples) * 0.1 # 比较不同正则化效果 weights_no_reg regularized_linear_regression(X_high_dim, y_high_dim, alpha0) weights_l2 regularized_linear_regression(X_high_dim, y_high_dim, alpha1, regularizationl2) weights_l1 regularized_linear_regression(X_high_dim, y_high_dim, alpha0.1, regularizationl1) # 可视化权重比较 plt.figure(figsize(12, 4)) plt.subplot(1, 3, 1) plt.stem(range(20), weights_no_reg, basefmt ) plt.title(无正则化) plt.xlabel(特征索引) plt.ylabel(权重值) plt.subplot(1, 3, 2) plt.stem(range(20), weights_l2, basefmt ) plt.title(L2正则化 (Ridge)) plt.xlabel(特征索引) plt.subplot(1, 3, 3) plt.stem(range(20), weights_l1, basefmt ) plt.title(L1正则化 (Lasso)) plt.xlabel(特征索引) plt.tight_layout() plt.show() print(真实权重前2个特征非零:, true_weights[:5]) print(无正则化权重范数:, np.linalg.norm(weights_no_reg)) print(L2正则化权重范数:, np.linalg.norm(weights_l2)) print(L1正则化稀疏性:, np.sum(np.abs(weights_l1) 0.01), 个接近零的权重)7. 数学基础学习建议与资源7.1 分阶段学习计划第一阶段1-2个月基础概念建立线性代数矩阵运算、向量空间、行列式概率论基本概念、条件概率、常见分布微积分导数、偏导数、梯度实战numpy基础实现线性回归第二阶段2-3个月核心算法数学原理线性代数特征值分解、SVD、PCA概率论最大似然估计、贝叶斯推断微积分链式法则、优化理论实战逻辑回归、神经网络实现第三阶段3-6个月高级专题与应用凸优化拉格朗日乘子法、KKT条件信息论熵、互信息、KL散度随机过程马尔科夫链、蒙特卡洛方法实战推荐系统、自然语言处理应用7.2 推荐学习资源在线课程吴恩达《机器学习》数学复习章节3Blue1Brown《线性代数的本质》系列视频MIT《线性代数》Gil