【线性回归(1)】一元线性回归

1 原理说明

回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。

1.1 目标:

给 定 一 系 列 数 据 x ( i ) 和 y ( i ) , x 是 自 变 量 , y 是 因 变 量 , 用 公 式 y = a x + b 去 拟 合 , 求 出 参 数 a 和 b 。 给定一系列数据x^{(i)}和y^{(i)},x是自变量,y是因变量,用公式y = ax + b去拟合,求出参数a和b。 x(i)y(i)xyy=ax+bab

1.2 解法:

假 设 有 m 组 数 据 { x ( 1 ) , x ( 2 ) , . . . , x ( m ) } , { y ( 1 ) , y ( 2 ) , . . . , y ( m ) } , 则 : 假设有m组数据\{x^{(1)},x^{(2)},...,x^{(m)}\},\{y^{(1)},y^{(2)},...,y^{(m)}\},则: m{x(1),x(2),...,x(m)},{y(1),y(2),...,y(m)}
x ˉ = 1 m ∑ i = 1 m x ( i )   y ˉ = 1 m ∑ i = 1 m y ( i ) \bar{x}=\frac{1}{m}\sum^{m}_{i=1}x^{(i)}\\ ~\\ \bar{y}=\frac{1}{m}\sum^{m}_{i=1}y^{(i)} xˉ=m1i=1mx(i) yˉ=m1i=1my(i)
使 用 最 小 二 乘 法 公 式 计 算 系 数 a 、 b : 使用最小二乘法公式计算系数a、b: 使ab
a = ∑ i = 1 m ( x ( i ) − x ˉ ) ( y ( i ) − y ˉ ) ∑ i = 1 m ( x ( i ) − x ˉ ) 2 a=\frac{\sum_{i=1}^{m}{(x^{(i)}-\bar{x})(y^{(i)}-\bar{y})}}{\sum_{i=1}^{m}{(x^{(i)}-\bar{x})^2}} a=i=1m(x(i)xˉ)2i=1m(x(i)xˉ)(y(i)yˉ)
b = y ˉ − a x ˉ b=\bar{y}-a\bar{x} b=yˉaxˉ
得 到 预 测 值 : 得到预测值:
y ˉ ( i ) = a x ( i ) + b \bar{y}^{(i)}=ax^{(i)}+b yˉ(i)=ax(i)+b

1.3 附推导过程:

均方损失函数:用来刻画真实的 y y y值和预测的 y ˉ \bar{y} yˉ之间的差距,我们的目标是让这个差距尽可能的小。
J = ∑ i = 1 m ( y ( i ) − y ˉ ( i ) ) 2 J=\sum^{m}_{i=1}(y^{(i)}-\bar{y}^{(i)})^2 J=i=1m(y(i)yˉ(i))2
在这里插入图片描述



2 代码实现

2.1 利用公式手动计算参数a、b

'''
1. 导入库,定义X,Y,并绘图展示
'''
import numpy as np
from matplotlib import pyplot as plt

x = np.array([1., 2., 3., 4., 5.])
y = np.array([1., 3., 2., 4., 5.])

plt.scatter(x, y)
plt.show()

在这里插入图片描述

'''
2. 最小二乘法
'''
# 计算均值
x_mean = np.mean(x)
y_mean = np.mean(y)

fenzi = 0.0
fenmu = 0.0

# 遍历训练集,计算a表达式的分子和分母
for x_i, y_i in zip(x, y):
    fenzi += (x_i - x_mean) * (y_i - y_mean)
    fenmu += (x_i - x_mean) ** 2

# 计算a,b
a = fenzi / fenmu
b = y_mean - a * x_mean
print(a, b)
# 0.9 0.2999999999999998
# 预测值
y_hat = a*x + b

plt.scatter(x, y)
plt.plot(x, y_hat)
plt.axis([0, 6, 0, 6])
plt.show()

在这里插入图片描述
封装一下:

import numpy as np

class SimpleLinerRegression():
    def __init__(self):
        self.a_ = None
        self.b_ = None
        self.X_train = None
        self.Y_train = None
    
    def fit(self, X_train, Y_train):
        x_mean = np.mean(X_train)
        y_mean = np.mean(Y_train)
        (num, d) = (0.0, 0.0)
        for x_i, y_i in zip(X_train, Y_train):
            num += (x_i - x_mean) * (y_i - y_mean)
            d += (x_i - x_mean) ** 2
        self.a_ = num / d
        self.b_ = y_mean - self.a_ * x_mean
        return self

    def predict(self, X_test):
        return np.array([self._predict(x) for x in X_test])

    def _predict(self, x):
        return self.a_ * x + self.b_
    def score(self, y_test, y_pre):
        return 0.5 * ((y_pre -y_test) ** 2)

2.2 调用现成的LinearRegression模块

from sklearn.linear_model import LinearRegression # 线性回归

X_train = np.array([1., 2., 3., 4., 5.])
y_train = np.array([1., 3., 2., 4., 5.])
X_test = np.array([7., 8., 9.])

linearRegression = LinearRegression() # 实例化类
linearRegression = linearRegression.fit(X_train, y_train) # 填充训练集
y_predict = linearRegression.predict(X_test) # 预测测试集

    ~\\~   
参考博客:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值