线性回归以及代码实现 [华为AI Gallery]

一元线性回归

构造一个简单的一元线性回归数据集

      x_train = [4, 8, 5, 10, 12]
      y_train = [20, 50, 30, 70, 60]

我们需要利用下面这个公式拟合
y t r a i n = w × x t r a i n + b y_{train}=w \times x_{train}+b ytrain=w×xtrain+b
其中
w = ∑ ( x i − x ‾ ) ( y i − y ‾ ) ∑ ( x i − x ‾ ) 2 ,   b = y ‾ − w × x ‾ w =\frac{\sum{(x_i-\overline{x}) (y_i-\overline{y}) }}{\sum({x_i-\overline{x}})^2}, \ b= \overline{y}-w\times\overline{x} w=(xix)2(xix)(yiy), b=yw×x

多元线性回归

多元线性回归即为多变量问题,对应的多元数据集举例如下

      x_train = [[3, 2, 9],
                 [4, 10, 2],
                 [3, 4, 9],
                 [12, 3, 4]]
      y_train = [20, 72, 21, 20]

则我们需要利用最小二乘解求其最佳解:
首先在x_train前加入常数项1使得

   x_train = np.mat(np.c_[np.ones(x_train.shape[0]), x_train])
   
    Results=> x_train =  [[1, 3, 2, 9],
                         [1, 4, 10, 2],
                         [1, 3, 4, 9],
                         [1, 12, 3, 4]]
 

利用下面公式进行最小二乘解拟合:
arg ⁡ min ⁡ B ∣ ∣ y t r a i n − B × x t r a i n ∣ ∣ \arg \min_B||y_{train} - B\times x_{train}|| argBminytrainB×xtrain
其中, x_train为列满秩矩阵时,B可以用加号广义逆得到:
B = ( x t r a i n H x t r a i n ) − 1 ∗ x t r a i n H B = (x_{train}^H x_{train})^{-1}*x_{train}^H B=(xtrainHxtrain)1xtrainH
这里华为AI Gallery中机器学习给出的例子为

# 根据最小二乘法的目标函数求导为0得到最优参数向量B的解析解公式如下,可以直接求取最优参数向量
  B = np.linalg.inv(X.T * X) * (X.T) * (Y.T)

源代码入口:华为AI Gallery进入后
AI

在此粘贴其源代码方便观看

# 多元线性回归的实现
# 导入模块
import numpy as np
import pandas as pd

# 构造数据,前三列表示自变量X,最后一列表示因变量Y
data = np.array([[3, 2, 9, 20],
                 [4, 10, 2, 72],
                 [3, 4, 9, 21],
                 [12, 3, 4, 20]])
print("data:", data, "\n")

X = data[:, :-1]
Y = data[:, -1]

X = np.mat(np.c_[np.ones(X.shape[0]), X])  # 为系数矩阵增加常数项系数
Y = np.mat(Y)  # 数组转化为矩阵

print("X:", X, "\n")
print("Y:", Y, "\n")

# 根据最小二乘法的目标函数求导为0得到最优参数向量B的解析解公式如下,可以直接求取最优参数向量
B = np.linalg.inv(X.T * X) * (X.T) * (Y.T)
print("B:", B, "\n")  # 输出系数,第一项为常数项,其他为回归系数
print("1,60,60,60预测结果:", np.mat([1, 60, 60, 60]) * B, "\n")  # 预测结果

# 相关系数
Q_e = 0
Q_E = 0
Y_mean = np.mean(Y)
for i in range(Y.size):
    Q_e += pow(np.array((Y.T)[i] - X[i] * B), 2)
    Q_E += pow(np.array(X[i] * B) - Y_mean, 2)
R2 = Q_E / (Q_e + Q_E)
print("R2", R2)

但是上述公式成立的条件为 x_train为列满秩矩阵,因此上述代码具有一定的局限性。
最好使用公式:
B = x t r a i n + B = x_{train}^+ B=xtrain+
进行求最小二乘解,其中加号广义逆可以通过 奇异值分解 或者 满秩分解 得到。

  • 利用加号广义逆(Moore-Penrose)代码更新如下:
# 利用加号广义逆(Moore-Penrose)
B = np.linalg.pinv(x_train)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JasonDean

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值