sklearn线性回归_一元线性回归(附代码实现)

夜星辰:为什么线性回归也是神经网络​zhuanlan.zhihu.com

之前写过一篇关于线性回归的文章,是和神经网络一起讲解的。

这次就来仔细探究一下一元线性回归的细节(多元线性回归下回讲)

上面公式不难,初中生都知道,代表的是一条在平面上的线。

而我们的目标是找出最佳的参数a,b使损失函数尽可能小

上篇文章说了什么是损失函数,这里先将它贴出来

解释一下公式,

是标签,也就是真实值,后面的
其实就是我们预测出来的
。(

公式其实还可以写成这样

如何找出最佳参数

数学家使用的是最小二乘法,直接解出最优参数。(其实还可以用梯度下降法解,梯度下降会专门有一章来讲解,这次重点就是最小二乘法)

最优参数a,b的求解

为了防止你们看推导看睡过去,我就先把结论放上来。

最优的参数a,b计算方法是:

(注释:

是样本的均值)

推导过程

说真的,我懒得打LaTeX,附上手写的丑字。(不想看的直接记住结论就行了,这个可以跳过)

769cb03a707a71ee86f2cdf4b2194949.png

882399f37331e08280ed086f07c05fc6.png

6dd9f50e24f440ab094cd51148154bf5.png

用代码实现一元线性回归

这次使用波士顿房价预测这个数据集。

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split

查看数据

boston = load_boston()
x = boston.data[:,5] #RM  average number of rooms per dwelling选取房间数目的多少做为一元线性回归的特征
y = boston.target

6f471081119821c5723ae65e4c25b8d4.png

划分训练集测试集

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2,random_state=666666)

记住公式

计算均值

x_mean = np.mean(x_train)
y_mean = np.mean(y_train)

计算参数a,b

a_up = 0.0 #看公式除号上面的部分
a_down = 0.0 #看公式除号下面的部分
for x_data, y_data in zip(x_train,y_train):
    a_up += (x_data - x_mean) * (y_data - y_mean)
    a_down += (x_data - x_mean)**2
a = a_up / a_down
a

863d395506b2ea4300a42744a70743a8.png
b = y_mean - a * x_mean
b

816a9dda613d7aa918d9287a0ec7e8fc.png

预测

a * x_test[0] + b

0dc32ae8ef8df9caf3e64eabe24c9bb8.png

使用sklearn验证一下我们的结果

我们的结果和sklearn一模一样

from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(x_train.reshape(-1,1),y_train)
lr.predict(x_test.reshape(-1,1))[0]

0d59d227706da130828061fa7460e0be.png

以上就是一元线性回归的一般过程,下面给出封装好了的代码,你可以跟使用sklearn一样调用它。

import numpy as np
class LinearRegression_1:
    def __init__(self):
        self._x_train = None
        self._y_train = None
        self.a_ = None
        self.b_ = None
    
    def fit(self,x_train,y_train):
        self._x_train = x_train
        self._y_train = y_train
        x_mean = np.mean(self._x_train)
        y_mean = np.mean(self._y_train)
        
        a_up = 0.0
        a_down = 0.0
        for x, y  in zip(self._x_train,self._y_train):
            a_up += (x - x_mean) * (y - y_mean)
            a_down += (x - x_mean)**2
        self.a_ = a_up / a_down
        self.b_ = y_mean - self.a_ * x_mean
        return self
    
    def predict(self,x_data):
        return np.array([self._predict(x) for x in x_data])
    
    def _predict(self,x):
        return self.a_ * x + self.b_
    
    def __repr__(self):
        return "LinearRegression_1()"
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值