【机器学习】多元线性回归模型(公式推导以及代码实现)

目录

一、理论部分(公式推导)

1.1、线性回归

1.2、非线性回归

二、代码实现

2.1、手写代码。(可直接运行)

2.2、代码解释。

2.3、完整代码。

三、感想

一、理论部分(公式推导)

1.1、线性回归

矩阵最小二乘法(参考高等代数)

这部分知识可以参考:

高等代数9 7 向量到子空间的距离 最小二乘法 - 道客巴巴icon-default.png?t=N7T8https://www.doc88.com/p-873117402915.html

Y = \alpha_{1}x_{1}+\alpha_{2}x_{2}+...+\alpha_{n}x_{n}+b

求C = y-Y 最小值--> C = y-XA       (b = b\begin{pmatrix}1 \\ 1 \\ ... \\ 1 \end{pmatrix})

x_{1},x_{2},...,x_{n},y 通过已知数据获得。

在向量空间L(x_{1},x_{2},...,x_{n})C垂直于 L(x_{1},x_{2},...,x_{n}

只需且必须(C,x_{1}) =  (C,x_{2})=......=(C,x_{n})= (C,x_{b}) = 0

 

 联立方程求解就行了。详情请参考链接,里面有例题。(公式在博客里太难编辑了😭)

这里需要注意的是 A*A必须满秩。如果不满秩,方程组的解是一个基础解系,无穷多个解。

什么时候会出现这种情况:如 训练集只有3组,而给的特征就有4个,这样上述求的解是无穷个的。(把矩阵化成上三角矩阵就可以看出)

1.2、非线性回归

 

二、代码实现

2.1、手写代码。(可直接运行)

2.2、代码解释。

    def fit(self, numpy_data, numpy_result):
        np_ones = np.ones((len(numpy_data), 1))
        numpy_data = np.c_[numpy_data, np_ones]
        data_transpose = numpy_data.transpose()
        A = np.matmul(data_transpose, numpy_data)
        b = np.matmul(data_transpose, numpy_result)
        self.result = np.linalg.solve(A, b)

了解公式原理,代码就简单了。

        1、创建全为1 numpy类型,添加到数据里。把y = kx+b 中的b看作b乘以全为1的向量

        2、求矩阵的转置,transpose()

        3、np.linalg.solve()联立方程组求解。

    def predict(self, data):
        numpy_result = np.zeros(len(data))
        for index, datas in enumerate(data):
            numpy_result[index] = np.sum(
                [data * self.result[index] for index, data in enumerate(datas)]) 
                 + self.result[-1]
        return numpy_result

这部分是预测,输入一个新的样本数据,我们通过建立的模型进行预测。

data1 = np.array([[3.6, 3.7, 3.8, 3.9]])
data2 = np.array([[i for i in range(1, 5)]])
result_tranpose = np.array([[1.0, 0.9, 0.85, 0.81]])
original_transpose = np.concatenate((data1, data2))
data_original = original_transpose.transpose()
data_result = result_tranpose.transpose()
print(data_original)
print(data_result)


[[3.6 1. ]
 [3.7 2. ]
 [3.8 3. ]
 [3.9 4. ]]

[[1.  ]
 [0.9 ]
 [0.85]
 [0.81]]

我们构造一些数据来进行验证。

    # 建模
    linear = LinearModel()
    linear.fit(data_original, data_result)
    print(linear.result) # 计算的系数值

    # 预测
    predict = linear.predict([[3.6, 1], [3.7, 2]])
    print(predict)

[[ 0.24109375]
 [-0.08610938]
 [ 0.20117188]]

[0.983 0.921]

2.3、完整代码。

import numpy as np


class LinearModel():
    def __init__(self):
        super(LinearModel, self).__init__()

    def fit(self, numpy_data, numpy_result):
        np_ones = np.ones((len(numpy_data), 1))
        numpy_data = np.c_[numpy_data, np_ones]
        data_transpose = numpy_data.transpose()
        A = np.matmul(data_transpose, numpy_data)
        b = np.matmul(data_transpose, numpy_result)
        self.result = np.linalg.solve(A, b)

    def predict(self, data):
        numpy_result = np.zeros(len(data))
        for index, datas in enumerate(data):
            numpy_result[index] = np.sum(
                [data * self.result[index] for index, data in enumerate(datas)]) +                 
                 self.result[-1]
        return numpy_result


if __name__ == '__main__':
    # 数据集准备
    data1 = np.array([[3.6, 3.7, 3.8, 3.9]])
    data2 = np.array([[i for i in range(1, 5)]])
    result_tranpose = np.array([[1.0, 0.9, 0.85, 0.81]])
    original_transpose = np.concatenate((data1, data2))
    data_original = original_transpose.transpose()
    data_result = result_tranpose.transpose()
    # print(data_original)
    # print(data_result)

    # 建模
    linear = LinearModel()
    linear.fit(data_original, data_result)
    print(linear.result) # 计算的系数值

    # 预测
    predict = linear.predict([[3.6, 1], [3.7, 2]])
    print(predict)

实现非线性也比较简单,只需对代码中numpy_result做相应的处理即可。

三、感想

第一次真正意义上写技术博客,说下感想:感谢csdn,基本解决了我所遇到99%的技术难题。也感谢各位大佬们的技术博客,我从中受益匪浅。为了初学者更好的学习,我也贡献一份力量。加油。

(吐槽下,这自带的公式编辑器真难用。小声bb)

  • 20
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

读书猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值