用矩阵和统计报告估计polynomial线性回归的系数python

对于二次回归模型

y = beta0 + beta1 * x + beta2* x^2 + epsilon

在Python中,我们可以使用NumPy库来构建设计矩阵,并使用线性代数的方法来估计多项式线性回归的系数。

法⼀:矩阵

以下是一个简单的示例,展示了如何使用NumPy来估计一个二次多项式回归模型的系数:

python 复制代码
import numpy as np
# 假设我们有一些数据点
X = np.array([1, 2, 3, 4, 5])  # 自变量
Y = np.array([2, 4, 5, 4, 5])  # 因变量
# 构建设计矩阵
# 对于二次多项式,我们需要添加X的平方项
X_poly = np.vstack([X**2, X, np.ones(len(X))]).T

# 使用NumPy的线性代数工具来计算系数
# np.linalg.inv() 计算逆矩阵,np.dot() 计算矩阵乘法
coefficients = np.linalg.inv(X_poly.T.dot(X_poly)).dot(X_poly.T).dot(Y)

# 打印系数
print("Coefficients:", coefficients)

在这个例子中,X_poly 是一个设计矩阵,它包含了 X 的平方项、X 的一次项和常数项。X_poly.T 是 X_poly 的转置。np.linalg.inv(X_poly.T.dot(X_poly)) 计算了 (X^T X)^(-1),然后我们使用 .dot(X_poly.T).dot(Y) 来计算系数向量。

法二:LinearRegression

如果你想要使用更高级的库,比如 scikit-learn,你可以使用 PolynomialFeatures 来生成多项式特征,然后使用 LinearRegression 来拟合模型:

python 复制代码
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

def my_use_linear_regres(X, Y): 
    # 转换数据的形状
    X = X.reshape(-1, 1)

    # 创建一个PolynomialFeatures实例,degree指定多项式的度数
    poly = PolynomialFeatures(degree=2)   # change this!!!!!!!!!!!!!!!

    # 转换X
    X_poly = poly.fit_transform(X)

    # 创建线性回归模型实例
    model = LinearRegression()

    # 拟合模型
    model.fit(X_poly, Y)
    return model
model_mine = my_use_linear_regres(X, Y)
# 打印系数和截距
print("Coefficients:", model_mine.coef_)  # notice the first one is not meaningful!!! 
print("Intercept:", model_mine.intercept_)  # see intercept here!!!

在这个例子中,PolynomialFeatures 用于生成多项式特征,然后我们使用 LinearRegression 来拟合模型并提取系数。这种方法更加简洁,而且可以轻松地处理更复杂的多项式回归模型。

法三:report

在Python中,我们可以使用statsmodels库来执行线性回归分析,并获取一个详细的统计报告。

python 复制代码
import numpy as np
import statsmodels.api as sm

# 假设我们有一些数据点
X = np.array([1, 2, 3, 4, 5])  # 自变量
Y = np.array([2, 4, 5, 4, 5])  # 因变量

def my_stat_report(X, Y):
        
    # 添加常数项以便拟合截距
    X = sm.add_constant(X)

    # 创建一个二次多项式模型的设计矩阵
    # 注意:这里我们直接使用X[:, 1]来表示x,X[:, 2]来表示x的平方
    X_poly_now = X[:, 1] ** 2
    # X_poly_now = np.column_stack((X[:, 1] ** 2, X[:, 1] ** 3))   # if there are more, use
    print(X_poly_now)
    # 将二次项和一次项添加到设计矩阵中
    X_design = np.column_stack((X, X_poly_now))
    print(X_design)
    # 拟合线性回归模型
    model = sm.OLS(Y, X_design).fit()
    return model

my_model = my_stat_report(X, Y)
print(my_model.summary())

说明

• Dep. Variable: 因变量的名称。

• R-squared: 决定系数,表示模型解释的变异性的比例。

• Adj. R-squared: 调整后的决定系数。

• F-statistic: F统计量,用于检验模型的整体显著性。

• Prob (F-statistic): F统计量的p值。

• Df Residuals: 残差的自由度。

• Df Model: 模型的自由度。

• Covariance Type: 协方差类型。

• coef: 回归系数。

• std err: 回归系数的标准误差。

• t: t统计量。

• P>|t|: t统计量的p值。

• [0.025 0.975]: 回归系数的95%置信区间。

这个统计报告提供了关于模型的详细统计信息,包括系数、标准误差、t统计量、p值和置信区间等。这些信息有助于评估模型的拟合质量和各个预测变量的显著性。


计算预测值 Y_pred 和残差平方和 (RSS)

python 复制代码
# 计算预测值
Y_pred = model.predict(X_poly)

# 计算残差
residuals = Y - Y_pred

# 计算残差平方和 (RSS)
RSS = np.sum(residuals**2)

# 打印预测值和RSS
print("Predicted Y:", Y_pred)
print("Residual Sum of Squares (RSS):", RSS)

在这个代码中,model.predict(X_poly) 用于计算预测值。然后我们计算实际值 Y 和预测值 Y_pred 之间的残差,并将残差平方后求和得到 RSS。

RSS 越小,表示模型的拟合效果越好。RSS 是评估回归模型性能的一个常用指标。

RSE, MSE, TSS, R Square

python 复制代码
# 计算总平方和 (TSS)
Y_mean = np.mean(Y)
TSS = np.sum((Y - Y_mean)**2)

# 计算均方误差 (MSE)
n = len(Y)  # 观测值数量
MSE = RSS / n 

# 计算剩余标准误差 (RSE)
N = len(Y)
p = 1
RSE = np.sqrt(RSS/(N-p-1))

# 计算 R-square
R_square = 1 - RSS / TSS

# 打印统计量
print("Residual Standard Error (RSE):", RSE)
print("Mean Squared Error (MSE):", MSE)
print("Total Sum of Squares (TSS):", TSS)
print("R-square:", R_square)
相关推荐
云泽野3 小时前
【Java|集合类】list遍历的6种方式
java·python·list
IMPYLH4 小时前
Python 的内置函数 reversed
笔记·python
小赖同学啊6 小时前
物联网数据安全区块链服务
开发语言·python·区块链
码荼7 小时前
学习开发之hashmap
java·python·学习·哈希算法·个人开发·小白学开发·不花钱不花时间crud
小陈phd8 小时前
李宏毅机器学习笔记——梯度下降法
人工智能·python·机器学习
kk爱闹8 小时前
【挑战14天学完python和pytorch】- day01
android·pytorch·python
ysa0510308 小时前
数论基础知识和模板
数据结构·c++·笔记·算法
Blossom.1188 小时前
机器学习在智能建筑中的应用:能源管理与环境优化
人工智能·python·深度学习·神经网络·机器学习·机器人·sklearn
亚力山大抵8 小时前
实验六-使用PyMySQL数据存储的Flask登录系统-实验七-集成Flask-SocketIO的实时通信系统
后端·python·flask
showyoui8 小时前
Python 闭包(Closure)实战总结
开发语言·python