beta = np.linalg.inv(B_inv + H_train.T.dot(K_inv).dot(H_train)).dot( H_train.T.dot(K_inv).dot(Y_train) + B_inv.dot(b) )
时间: 2024-05-31 13:10:02 浏览: 85
这是一个线性回归模型的公式,用于计算模型的参数。其中,B_inv表示先验的协方差矩阵的逆矩阵,H_train表示训练集的设计矩阵,K_inv为正则化项的逆矩阵,Y_train为训练集的标签,b为先验均值向量。通过这个公式可以求得线性回归模型的参数beta。具体的求解过程可以参考贝叶斯线性回归的推导过程。
相关问题
import numpy as np from sklearn.datasets import make_regression from sklearn.model_selection import train_test_split np.random.seed(1) def lr(x_train, x_test, y_train, y_test): """ :param x_train: 训练集 :param x_test: 训练集标签 :param y_train: 测试集 :param y_test: 测试集标签 :return: 预测值与测试集标签的均方误差 """ # 请根据提示在下面补全代码 # ********** Begin ********* # # 使用正规方程公式求得theta # 使用theta预测结果 # 求出预测值与目标值的均方误差 # ********** End ********* # return mse if __name__ == '__main__': X, Y = make_regression(n_samples=500, n_features=1, n_targets=1, noise=1.5) x_train, x_test, y_train, y_test = train_test_split(X, Y) mse = lr(x_train, x_test, y_train, y_test) print(mse)编写一个利用正规方程进行线性回归预测的程序。
### 正规方程实现线性回归预测
以下是基于正规方程实现线性回归预测的完整代码示例,其中包括模型训练、预测以及均方误差的计算。
```python
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
# 数据生成 (假设我们有一个简单的二维数据集)
np.random.seed(42)
X = 2 * np.random.rand(100, 1) # 特征矩阵 X
y = 4 + 3 * X + np.random.randn(100, 1) # 目标变量 y 添加噪声
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 数据标准化
scaler_X = StandardScaler()
scaler_y = StandardScaler()
X_train_scaled = scaler_X.fit_transform(X_train)
X_test_scaled = scaler_X.transform(X_test)
y_train_scaled = scaler_y.fit_transform(y_train).ravel() # 将形状调整为一维数组
y_test_scaled = scaler_y.transform(y_test).ravel()
# 增加偏置项 (添加一列全为1的向量)
X_b_train = np.c_[np.ones((X_train_scaled.shape[0], 1)), X_train_scaled]
X_b_test = np.c_[np.ones((X_test_scaled.shape[0], 1)), X_test_scaled]
# 计算正规方程求解最优参数 θ
theta_best = np.linalg.inv(X_b_train.T.dot(X_b_train)).dot(X_b_train.T).dot(y_train_scaled) # 正规方程公式[^2]
print(f"最佳回归系数: {theta_best}")
# 预测
y_lin_predict_scaled = X_b_test.dot(theta_best)
# 反标准化预测值
y_lin_predict = scaler_y.inverse_transform(y_lin_predict_scaled.reshape(-1, 1))
# 计算均方误差
mse = mean_squared_error(y_test, y_lin_predict)
print(f"正规方程的均方误差:{mse}")
```
### 解析说明
上述代码实现了以下几个功能:
1. **数据准备**
创建了一个简单的一元线性回归数据集 `X` 和目标变量 `y`,其中加入了随机噪声以模拟真实世界中的不确定性[^4]。
2. **数据预处理**
对特征 `X` 和目标变量 `y` 进行了标准化操作,以便提高数值稳定性。这一步对于正规方程尤其重要,因为其涉及矩阵运算[^1]。
3. **增加偏置项**
使用 `np.c_` 方法在特征矩阵前加入一列常数 `1`,用于表示截距项 \( \beta_0 \)[^3]。
4. **正规方程求解**
应用了正规方程的核心公式:
\[
\theta = (X^\top X)^{-1} X^\top y
\]
来直接计算出最优的回归系数 \( \theta \),无需迭代过程[^2]。
5. **反标准化与评估**
将预测结果从标准化空间映射回原始空间,并利用均方误差(MSE)来衡量模型性能[^1]。
---
###
#encoding=utf8 import numpy as np #mse def mse_score(y_predict,y_test): mse = np.mean((y_predict-y_test)**2) return mse #r2 def r2_score(y_predict,y_test): ''' input:y_predict(ndarray):预测值 y_test(ndarray):真实值 output:r2(float):r2值 ''' #********* Begin *********# #********* End *********# return r2 class LinearRegression : def __init__(self): '''初始化线性回归模型''' self.theta = None def fit_normal(self,train_data,train_label): ''' input:train_data(ndarray):训练样本 train_label(ndarray):训练标签 ''' #********* Begin *********# #********* End *********# return self def predict(self,test_data): ''' input:test_data(ndarray):测试样本 ''' #********* Begin *********# #********* End *********# 帮我补全代码
### 补全线性回归模型的代码
以下是完整的线性回归模型实现,包括普通最小二乘法拟合、预测方法以及 R² 分数计算:
#### 1. 数据准备
为了便于理解,这里使用简单的模拟数据作为输入。
```python
import numpy as np
from sklearn.metrics import r2_score
# 模拟数据集 (X: 自变量, Y: 因变量)
np.random.seed(0) # 设置随机种子以便结果可重复
X = np.array([i for i in range(1, 11)]).reshape(-1, 1) # 单独一个自变量
Y = np.array([2*i + np.random.normal(0, 1) for i in range(1, 11)]) # 添加噪声的目标值
```
---
#### 2. 实现普通最小二乘法拟合
通过矩阵运算求解参数 \( \beta_0 \) 和 \( \beta_1 \),并完成模型拟合。
```python
class LinearRegressionOLS:
def __init__(self):
self.coefficients = None
def fit(self, X, Y):
"""
使用普通最小二乘法拟合线性回归模型。
参数:
X: 输入特征数组 (n_samples, n_features)
Y: 输出目标数组 (n_samples,)
返回:
计算得到的系数 beta
"""
# 增加偏置项列(即常量项)
ones_column = np.ones((X.shape[0], 1))
X_b = np.hstack((ones_column, X)) # 将截距项加入到设计矩阵
# 解方程 β = (X^T * X)^(-1) * X^T * Y
Xt_X_inv = np.linalg.inv(np.dot(X_b.T, X_b))
Xt_Y = np.dot(X_b.T, Y)
self.coefficients = np.dot(Xt_X_inv, Xt_Y)
def predict(self, X_new):
"""
预测新样本的输出值。
参数:
X_new: 新样本的特征数组 (n_samples, n_features)
返回:
预测的结果数组
"""
if self.coefficients is None:
raise ValueError("Model has not been trained yet.")
ones_column = np.ones((X_new.shape[0], 1))
X_new_b = np.hstack((ones_column, X_new))
predictions = np.dot(X_new_b, self.coefficients)
return predictions
```
---
#### 3. 计算 R² 分数
定义函数 `r_squared` 来评估模型性能。
```python
def calculate_r_squared(Y_true, Y_pred):
"""
计算决定系数 R²。
参数:
Y_true: 真实的目标值数组
Y_pred: 预测的目标值数组
返回:
决定系数 R² 的值
"""
mean_y = np.mean(Y_true)
ss_total = np.sum((Y_true - mean_y)**2)
ss_residuals = np.sum((Y_true - Y_pred)**2)
r2 = 1 - (ss_residuals / ss_total)
return r2
```
---
#### 4. 完整流程示例
将以上部分组合起来形成完整的工作流。
```python
if __name__ == "__main__":
# 初始化模型
model = LinearRegressionOLS()
# 拟合模型
model.fit(X, Y)
print(f"拟合后的系数 Beta: {model.coefficients}") # 打印拟合后的斜率和截距[^1]
# 进行预测
Y_pred = model.predict(X)
print(f"预测值: {Y_pred}")
# 计算 R² 分数
r2_manual = calculate_r_squared(Y, Y_pred)
print(f"手动计算的 R² 分数: {r2_manual}")
# 对比 Sklearn 中的 R² 函数
r2_sklearn = r2_score(Y, Y_pred)
print(f"Sklearn 库中的 R² 分数: {r2_sklearn}[^2]")
```
---
### 结果解释
- **拟合后的系数 Beta**: 包括截距项 (\(\beta_0\)) 和斜率项 (\(\beta_1\))。
- **预测值**: 利用已学习的模型对给定输入进行预测。
- **R² 分数**: 反映模型对数据的拟合优度。越接近于 1 越好[^2]。
---
阅读全文
相关推荐

















