在机器学习领域,回归分析是一种常见的预测模型,用于估计一个或多个自变量对因变量的影响。普通最小二乘法(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")