机器学习之线性模型详细手推公式与代码实现(篇一)

微信公众号:王了个博
专注于大数据技术,人工智能和编程语言
个人既可码代码也可以码文字。欢迎转发与关注
关注我,在公众号回复 “机器学习” 可领取电子书

线性回归模型

在统计学中,线性回归(英语:linear regression)是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。

在线性回归中,数据使用线性预测函数来建模,并且未知的模型参数也是通过数据来估计。这些模型被叫做线性模型。最常用的线性回归建模是给定X值的y的条件均值是X的仿射函数。

简单理解就是线性回归是一种线性模型,它假设输入变量X和单个输出变量y之间存在线性关系
在这里插入图片描述
在这里插入图片描述

线性回归模型经常用 最小二乘 逼近来拟合,但他们也可能用别的方法来拟合。最小二乘逼近可以用来拟合那些非线性的模型。因此,尽管“最小二乘法”和“线性模型”是紧密相连的,但他们是不能划等号的,仅仅是逼近来拟合。

最小二乘介绍
最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小

一元线性回归模型

给定多组训练数据进行函数建模,发现目标变量y和输入变量x之间的关系
这一模型最为简单,也即为:f(x) = ωx + b模型,也即一元线性回归模型
f ( x ) = ω x + b f(x) = ωx + b
###方案
给定数据集D = { ( x 1 , y 1 ) , ( x 1 , y 1 ) , . . . , ( x m , y m ) (x_1,y_1),(x_1,y_1), ... ,(x_m,y_m) }我们希望寻找到f(x)=ωx+b这样一条直线,使得数据集D上的点到直线f(x)的距离之和的绝对值最小。
所以用到的方案就是上面介绍的最小二乘法
在这里插入图片描述

手推公式

对于数据集D,我们希望最小拟合直线与数据点之间的距离,构造如下损失函数(根据最小二乘)
L ( w , b ) = m i n i = 1 m f ( x i ) y i ) 2 L_(w,b_) = min \sum_{i=1}^{m}|f(x_i)-y_i)|^2
= m i n i = 1 m ( f ( x i ) y i ) 2 = min \sum_{i=1}^{m}(f(x_i)-y_i)^2
= m i n i = 1 m ( ω x i + b y i ) 2 = min \sum_{i=1}^{m}(ωx_i + b-y_i)^2
求解ω和b 使得 L ( w , b ) = i = 1 m ( ω x i + b y i ) 2 L_(w,b_)= \sum_{i=1}^{m}(ωx_i + b-y_i)^2 最小

  • 分别求其关于ω和b的偏导
    ( ω x i + b y i ) 2 ω = 2 x i ( ω x i + b y i ) \frac{∂(ωx_i + b-y_i)^2}{∂ω}=2x_i(ωx_i + b-y_i)
    ( ω x i + b y i ) 2 b = 2 ( ω x i + b y i ) \frac{∂(ωx_i + b-y_i)^2}{∂b}=2(ωx_i + b-y_i)
  • L ω \frac{∂L}{∂ω}
    L ω = 2 x 1 ( ω x 1 + b y 1 ) + 2 x 2 ( ω x 2 + b y 2 ) + . . . + 2 x m ( ω x m + b y m ) \frac{∂L}{∂ω}=2x_1(ωx_1 + b-y_1)+2x_2(ωx_2 + b-y_2)+ ... +2x_m(ωx_m + b-y_m)
    = 2 ω ( x 1 2 + x 2 2 + . . . + x m 2 ) + 2 b ( x 1 + x 2 + . . . + x m ) ( x 1 y 1 + x 2 y 2 + . . . + x m y m ) =2ω(x_1^2+x_2^2+...+x_m^2)+2b(x_1+x_2+...+x_m)-(x_1y_1+x_2y_2+...+x_my_m)

= 2 ( ω i = 1 m x i 2 + b i = 1 m x i i = 1 m x i y i ) =2(ω\sum_{i=1}^{m}x_i^2+b\sum_{i=1}^{m}x_i-\sum_{i=1}^{m}x_iy_i)

  • 同上求 L b \frac{∂L}{∂b}
    L b = 2 ( ω x 1 + b y 1 ) + 2 ( ω x 2 + b y 2 ) + . . . + 2 ( ω x m + b y m ) \frac{∂L}{∂b}=2(ωx_1 + b-y_1)+2(ωx_2 + b-y_2)+ ... +2(ωx_m + b-y_m)
    = 2 ω ( x 1 + x 2 + . . . + x m ) + 2 b ( 1 + 1 + . . . + 1 ) 2 ( y 1 + y 2 + . . . + y m ) =2ω(x_1+x_2+...+x_m)+2b(1+1+...+1)-2(y_1+y_2+...+y_m)
    = 2 ( ω i = 1 m x i + b i = 1 m 1 i = 1 m y i ) =2(ω\sum_{i=1}^{m}x_i+b\sum_{i=1}^{m}1-\sum_{i=1}^{m}y_i)

  • 分别令 L ω = 0 \frac{∂L}{∂ω}=0 L b = 0 \frac{∂L}{∂b}=0 ,得到
    2 ( ω i = 1 m x i 2 + b i = 1 m x i i = 1 m x i y i ) = 0   ( ) 2(ω\sum_{i=1}^{m}x_i^2+b\sum_{i=1}^{m}x_i-\sum_{i=1}^{m}x_iy_i)=0\ (第一式)
    2 ( ω i = 1 m x i + b i = 1 m 1 i = 1 m y i ) = 0   ( ) 2(ω\sum_{i=1}^{m}x_i+b\sum_{i=1}^{m}1-\sum_{i=1}^{m}y_i)=0 \ (第二式)

通过第二式得到

b = i = 1 m y i ω i = 1 m x i i = 1 m 1 b=\frac{\sum_{i=1}^{m}y_i-ω\sum_{i=1}^{m}x_i}{\sum_{i=1}^{m}1}
= i = 1 m y i ω i = 1 m x i m   ( ) =\frac{\sum_{i=1}^{m}y_i-ω\sum_{i=1}^{m}x_i}{m} \ (第三式)

通过将第三式带入到第一式得到

ω i = 1 m x i 2 + i = 1 m ( y i ω x i ) m i = 1 m x i i = 1 m x i y i = 0 ω\sum_{i=1}^{m}x_i^2+\frac{\sum_{i=1}^{m}(y_i-ωx_i)}{m}\sum_{i=1}^{m}x_i-\sum_{i=1}^{m}x_iy_i=0

化简

ω ( i = 1 m x i 2 1 m i = 1 m x i i = 1 m x i ) = i = 1 m x i y i 1 m i = 1 m y i i = 1 m x i ω(\sum_{i=1}^{m}x_i^2-\frac{1}{m}\sum_{i=1}^{m}x_i\sum_{i=1}^{m}x_i)=\sum_{i=1}^{m}x_iy_i-\frac{1}{m}\sum_{i=1}^{m}y_i\sum_{i=1}^{m}x_i

ω = i = 1 m x i y i 1 m i = 1 m y i i = 1 m x i i = 1 m x i 2 1 m i = 1 m x i i = 1 m x i ω=\frac{\sum_{i=1}^{m}x_iy_i-\frac{1}{m}\sum_{i=1}^{m}y_i\sum_{i=1}^{m}x_i}{\sum_{i=1}^{m}x_i^2-\frac{1}{m}\sum_{i=1}^{m}x_i\sum_{i=1}^{m}x_i}

  • 1 m i = 1 m x i = x ˉ \frac{1}{m}\sum_{i=1}^{m}x_i=\bar{x} 得到
    ω = i = 1 m y i ( x i x ˉ ) i = 1 m x i 2 i = 1 m x i x ˉ ω=\frac{\sum_{i=1}^{m}y_i(x_i-\bar{x})}{\sum_{i=1}^{m}x_i^2-\sum_{i=1}^{m}x_i\bar{x}}
    b = 1 m i = 1 m ( y i ω x i ) b=\frac{1}{m}\sum_{i=1}^{m}(y_i-ωx_i)
至此ω 与 b都推算了出来

代码实现

  1. 引入依赖
import numpy as np
import matplotlib.pyplot as plt
  1. 导入数据散点图
points = np.genfromtxt('linear.csv', delimiter=',')

points[0,0]

# 提取points中的两列数据,分别作为x,y
x = points[:, 0]
y = points[:, 1]

# 用plt画出散点图
plt.scatter(x, y)
plt.show()
效果如下图

在这里插入图片描述
3. 定义损失函数
也即我们上面分析的: L ( w , b ) = i = 1 m ( ω x i + b y i ) 2 L_(w,b_)= \sum_{i=1}^{m}(ωx_i + b-y_i)^2

# 损失函数是系数的函数,另外还要传入数据的x,y
def compute_cost(w, b, points):
    total_cost = 0
    M = len(points)
    
    # 逐点计算平方损失误差,然后求平均数
    for i in range(M):
        x = points[i, 0]
        y = points[i, 1]
        total_cost += ( y - w * x - b ) ** 2
    
    return total_cost/M
  1. 定义算法拟合函数
    主要的就是我们手推的 ωb
    ω = i = 1 m y i ( x i x ˉ ) i = 1 m x i 2 i = 1 m x i x ˉ ω=\frac{\sum_{i=1}^{m}y_i(x_i-\bar{x})}{\sum_{i=1}^{m}x_i^2-\sum_{i=1}^{m}x_i\bar{x}}
    b = 1 m i = 1 m ( y i ω x i ) b=\frac{1}{m}\sum_{i=1}^{m}(y_i-ωx_i)
# 先定义一个求均值的函数
def average(data):
    sum = 0
    num = len(data)
    for i in range(num):
        sum += data[i]
    return sum/num

# 定义核心拟合函数
def fit(points):
    M = len(points)
    x_bar = average(points[:, 0])
    
    sum_yx = 0
    sum_x2 = 0
    sum_delta = 0
    
    for i in range(M):
        x = points[i, 0]
        y = points[i, 1]
        sum_yx += y * ( x - x_bar )
        sum_x2 += x ** 2
    # 根据公式计算w
    w = sum_yx / ( sum_x2 - M * (x_bar**2) )
    
    for i in range(M):
        x = points[i, 0]
        y = points[i, 1]
        sum_delta += ( y - w * x )
    b = sum_delta / M
    
    return w, b
  1. 测试结果
w, b = fit(points)

print("w is: ", w)
print("b is: ", b)

cost = compute_cost(w, b, points)

print("cost is: ", cost)
结果
  • w is: xxxxxxxx
  • b is: xxxxxxxx
  • cost is: xxxxxxxx
  1. 画出拟合曲线
plt.scatter(x, y)
# 针对每一个x,计算出预测的y值
pred_y = w * x + b

plt.plot(x, pred_y, c='r')
plt.show()
效果

在这里插入图片描述

至此简单的一元线性回归模型总结完毕

未完待续,下篇继续学习多元线性回归模型,欢迎关注

微信公众号:王了个博
人要去的地方,除了远方,还有未来
关注我,在公众号回复 “机器学习” 可领取电子书
欢迎关注我,一起学习,一起进步!

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Hello_Java2018/article/details/106141133