非负最小二乘法与普通最小二乘法比较

机器学习领域,回归分析是一种常见的预测模型,用于估计一个或多个自变量对因变量的影响。普通最小二乘法(Ordinary Least Squares, OLS)是一种广泛使用的线性回归方法,它通过最小化误差的平方和来估计模型参数。然而,在某些情况下,可能希望模型的系数非负,这时非负最小二乘法(Non-Negative Least Squares, NNLS)就显得尤为重要。本文将通过Python代码示例,展示如何使用非负最小二乘法和普通最小二乘法,并比较两者的回归系数。

生成随机数据

首先,需要生成一些随机数据来模拟实际情况。在这个例子中,生成了200个样本,每个样本有50个特征。然后,计算了真实的系数,并将它们与特征矩阵相乘以得到目标变量。为了模拟现实世界中的噪声,还在目标变量中添加了一些随机噪声。

import numpy as np np.random.seed(42) n_samples, n_features = 200, 50 X = np.random.randn(n_samples, n_features) true_coef = 3 * np.random.randn(n_features) true_coef[true_coef < 0] = 0 y = np.dot(X, true_coef) y += 5 * np.random.normal(size=(n_samples,))

数据集分割

接下来,将数据集分为训练集和测试集。这样做的目的是为了评估模型在未见过的数据上的表现。在这个例子中,使用了50%的数据作为测试集。

from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5)

非负最小二乘法

非负最小二乘法要求模型的系数必须非负。这在某些情况下非常有用,比如在处理物理或化学问题时,系数通常代表某种物理量,它们不能为负。使用sklearn库中的LinearRegression类,并设置positive=True参数来实现非负最小二乘法。

from sklearn.linear_model import LinearRegression reg_nnls = LinearRegression(positive=True) y_pred_nnls = reg_nnls.fit(X_train, y_train).predict(X_test) r2_score_nnls = r2_score(y_test, y_pred_nnls) print("NNLS R2 score", r2_score_nnls)

普通最小二乘法

普通最小二乘法没有对系数的非负性进行限制。它通过最小化误差的平方和来估计模型参数。同样使用sklearn库中的LinearRegression类来实现普通最小二乘法。

reg_ols = LinearRegression() y_pred_ols = reg_ols.fit(X_train, y_train).predict(X_test) r2_score_ols = r2_score(y_test, y_pred_ols) print("OLS R2 score", r2_score_ols)

回归系数比较

通过比较非负最小二乘法和普通最小二乘法的回归系数,可以发现它们之间存在高度相关性。然而,由于非负最小二乘法的非负性约束,一些系数被压缩到了0。这导致了非负最小二乘法的结果通常更加稀疏。

import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.plot(reg_ols.coef_, reg_nnls.coef_, linewidth=0, marker=".") low_x, high_x = ax.get_xlim() low_y, high_y = ax.get_ylim() low = max(low_x, low_y) high = min(high_x, high_y) ax.plot([low, high], [low, high], ls="--", c=".3", alpha=0.5) ax.set_xlabel("OLS regression coefficients", fontweight="bold") ax.set_ylabel("NNLS regression coefficients", fontweight="bold")
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485