多次回归分析及推导

多次回归分析

在线性回归分析的时候,我用了一条直线去拟合年龄和工资的数据,结果不是太贴合的。我们尝试先用多次方程组来拟合数据。


我们先把数据读出出来。

import tensorflow as tf
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
unrate = pd.read_csv('SD.csv')
unrate = unrate.sort_values('Year')
print(unrate)
    Year  Salary
0    1.0   39451
30   1.1   40343
1    1.2   46313
31   1.3   47605
2    1.4   37839
..   ...     ...
85  12.0  106247
86  12.5  117634
87  12.6  113300
88  13.3  123056
89  13.5  122537

[90 rows x 2 columns]

这次我们用一个二次方程来拟合一下这些数据。

方程我们定义为如下:
\[ \hat(y_i)=W_1*x_i^2 + W_2*x_i+b\]
那么这样的话,我们就有三个参数 W_1, W_2, b。我们先给这三个参数一个初始数值。

w_1 = 1000
w_2 =1000
b = 1000
print(w_1)
print(w_2)
print(b)

y_pred = w_1* np.power(unrate['Year'],2) + w_2* unrate['Year'] + b
plt.scatter(unrate['Year'],unrate['Salary'])
plt.plot(unrate['Year'],y_pred)
plt.show()
1000
1000
1000

476198-20190909180400528-2029785784.png

我们如果按照上述的模型,求出预测值\(\hat{y}\),我们需要一个函数来评估这个值的好坏。
\[loss=\sum_{i=0}^{n} (y_i -\hat{y}_i)^2\]
这个函数和一次的一样,没有任何变化。接下来,我们需要求出这个函数的导函数。

\[\frac{dl}{dw_1} = \frac{dl}{d\hat{y}}*\frac{d\hat{y}}{dw_1} =-2\sum_{i=0}^{n}(y_i-\hat{y}_i)*x_i^2 \]

\[ \frac{dl}{dw_2} = \frac{dl}{d\hat{y}}*\frac{d\hat{y}}{dw_2}=-2\sum_{i=0}^{n}(y_i-\hat{y}_i)*x_i \]

\[ \frac{dl}{db}=\frac{dl}{d\hat{y}}*\frac{d\hat{y}}{db}=-2\sum_{i=0}^{n}(y_i-\hat{y}_i) \]

我们来把上述的函数代码化

def train(w_1,w_2, b):
    
    learning_rate = 0.000001
    
    y_pred = w_1* np.power(unrate['Year'],2) + w_2* unrate['Year'] + b
    
    dw_1 =  -2*np.sum( np.transpose(unrate['Salary'] - y_pred)*np.power(unrate['Year'],2))
    dw_2 = -2*np.sum( np.transpose(unrate['Salary'] - y_pred)*unrate['Year'])
    db =  -2*np.sum((unrate['Salary'] - y_pred))

    temp_w_1 = w_1 - learning_rate * dw_1
    temp_w_2 = w_2 - learning_rate * dw_2
    temp_b = b - learning_rate * db
    
    w_1 = temp_w_1
    w_2= temp_w_2
    b = temp_b
    return w_1,w_2,b
 

    

我们来运行下测试下效果:

for i in range(10000):
    w_1, w_2, b = train(w_1,w_2,b)

    
    
print(w_1)
print(w_2)
print(b)
y_pred = w_1 * np.power(unrate['Year'],2) + w_2 * unrate['Year'] + b
loss = np.power((y_pred-unrate['Salary']),2).sum()


plt.scatter(unrate['Year'],unrate['Salary'])
plt.plot(unrate['Year'],y_pred)



-695.3117280326662
17380.592541992835
8744.131370136933
8487947406.30475

476198-20190909180414276-1614425405.png

上面就是我们拟合出来的效果。

我们可以看出来,比我们之前一次的拟合的数据要好很多。

转载于:https://www.cnblogs.com/bbird/p/11493266.html

### 一元多项式线性回归公式的详细推导 #### 定义模型 在一元多项式回归中,假设有一个输入变量 \( x \),目标是预测输出变量 \( y \)。对于一个 \( n \)-次多项式回归模型,其形式如下: \[ y = w_0 + w_1x + w_2x^2 + ... + w_nx^n + \epsilon \] 其中,\( w_i (i=0,1,...,n) \) 是待估计的参数,而 \( \epsilon \) 表示误差项。 #### 构建损失函数 为了找到最佳拟合数据集的系数 \( w_i \),通常采用最小化均方误差(MSE)的方法来构建损失函数: \[ J(w)=\frac{1}{m}\sum_{i=1}^{m}(y_i-\hat{y}_i)^2=\frac{1}{m}\sum_{i=1}^{m}[y_i-(w_0+w_1x_i+\dotsb+w_n{x_i}^n)]^2 \][^1] 这里 \( m \) 表示样本数量;\( y_i \) 和 \( \hat{y}_i \) 分别表示第 i 个观测的真实值和预测值。 #### 参数优化方法 通过调整权重向量 \( W=[w_0,w_1,\dotsc ,w_n]^T \),使得上述定义的成本函数达到极小值点。常用的技术有解析解法(正规方程)、数值求解技术如梯度下降等。 当使用梯度下降算法时,更新规则为: \[ w_j := w_j - \alpha \cdot \partial/\partial w_j(J(W)) \quad j=0...n \] 具体来说就是按照下面的方式迭代计算直到收敛: \[ w_j:=w_j-α⋅(-2/m)\sum _{{i}=1}^m(y_i-w_0-w_1x_i-\cdots -w_nx_i^n)x_i^j \] 这里的 \( α \) 称作学习率,决定了每次迭代步长大小的选择[^2]。 #### 正规方程解 另一种方式则是利用矩阵运算直接得到最优解,即所谓的“正规方程”。设设计矩阵 X 如下所示: | 1 | x₁ | ${x}_{1}^{2}$ | … | ${x}_{1}^{n}$ | |---|----|---------------|---|----------------| | 1 | x₂ | ${x}_{2}^{2}$ | … | ${x}_{2}^{n}$ | | ⋮ | ⋱ | | | | | 1 | xm | ${x}_{m}^{2}$ | … | ${x}_{m}^{n}$ | 则可以通过以下公式一次性获得所有未知数的最佳估值: \[ W=(X^TX)^{-1}X^TY \] 这便是基于最小二乘原理得出的一元多项式回归模型的精确解表达式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值