正在阅读:

机器学习简单线性回归模型

导语

在前面机器学习基础介绍中我们说过,机器学习里面一共有两种问题模型,一种是分类问题,一种是线性分析。前面的几篇文章我们讲的全部都是分类问题,下面我们将开始探讨机器学习中的线性预测的问题。

先打个线性分析问题的比方,还是前面所说过的房价预测问题,影响房价的问题有很多,比如房子的大小,房子距市中心的位置等等都是影响房价的因素。从这几个方面可以看出来,我们的影响因素在数学上都是可以用明确的数字表示出来的,也就是我们所说的连续型变量,我们最终预测的房价也是一个有大小的数字。线性问题和分类问题的关键在于其预测结果是否属于某一类还是一个连续型数值。在这个问题中,我们可以将房子的大小,房子距市中心的问题看做变量X,将房间看做Y,我们通过大量的数据计算可以得到一个线性的数学模型f(x),通过这个线性模型我么可以给定自变量x,计算输出预测结果y。

简单线性回归问题

既然是线性问题,我们就可以用公式 y = ax + b 来进行表示,这个方程的图像是一条直线,我们称之为回归线。而我们要做的就是来找到合适的参数a和b来构造该线性方程。也就是说我们的目标就是通过给定的大量的数据集来找到最合适的参数。那怎么来寻找这两个参数呢?下面看一个商家打广告的数量和卖出产品数量之间的关系示例,数据如下图:

QQ截图20170816145359.jpg

我们将广告数量作为变量X,将卖出的产片数量当做变量Y,在坐标轴上几个点的图形如下:

c1.jpg

从图中我们可以看到,这几个点上下交错,相互连接是构不成一条直线的。既然如此那我们该怎么构建这个线性的模型 y = ax + b 呢?这里我们采用了数学上的一个方法叫做最小二乘法,我们要在这些点之间找到一条直线,使这条直线和各个点之间满足下面的数学关系:

QQ截图20170816152649.jpg

其中yi是点i的真实y值,y尖是我们预测得到的模型中的对应x预测得到的y值,这个公式代表每个真实值和预测值得平方和最小。这时候的模型就是我们的最优线性回回归模型。那如该如何确定参数a和b呢?最小二乘法想必大家在中学数学中都有接触过,我是记得在每次数学考试的时候在试卷的开头都有最小二乘法的计算公式。这里我先给出,在最后我会给出最小二乘法的推导过程。公式如下:

y.jpg

a.jpg

b.jpg

上面公式中的x横线和y横线分别代表X的平均值和Y的平均值,通过上面的公式我们就可以计算得到参数a和b从而得到线性方程 y = ax + b 。之后我们就可以对输入的x值进行预测。下面我们使用Python来实现一下该算法。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#coding:utf8

import numpy as np
import matplotlib.pyplot as plt

class linear:
    def __init__(self):
        self.a = 0
        self.b = 0

    def fit(self, X, Y):
        molecule = 0 #分子
        dnominator = 0 #分母
        x_mean = np.mean(X) #X的平均值
        y_mean = np.mean(Y) #Y的平均值
        for i in range(len(X)):
            molecule += (X[i] - x_mean) * (Y[i] - y_mean)
            dnominator += (X[i] - x_mean) ** 2
        self.a = molecule / float(dnominator)
        self.b = y_mean - self.a * x_mean

    def predict(self, x):
        return self.a * x + self.b

if __name__ == '__main__':
    x = np.array([1, 3, 2, 1, 3])
    y = np.array([14, 24, 18, 17, 27])
    #画点
    plt.scatter(x, y, c = 'r', marker = 'o')
    lin = linear()
    lin.fit(x, y)

    # 划线
    x = np.arange(0, 5, 1)
    y = lin.predict(x)
    plt.plot(x, y ,'b')
    plt.show()

其运行结果如下:

QQ截图20170816165316.jpg

可以看出我们的参数a的值为5.0,参数b的值为10.0,同学们可以手动计算一下是否和我们程序计算的相同。

最小二乘法的理论推导

现在我们假设我们的拟合直线是:y = ax + b

我们的任意观察点是:(Xi, yi

我们的误差为:d = yi - (aXi + b)

所以如果让我们整体的误差值整体最小时,误差最小,有如下计算:

blob.png

这个算式是一个凸函数,我们可以通过求其导数来得到其最小值。下面我们分别对a和b求一阶偏导:

blob.png

blob.png

求导之后我们分别让其等于0,然后联立方程组解得参数a和参数b:

blob.png

结束语

在本篇文章中我们知识简单的对单输入x进行了简单的模型构建造,但是细心的同学可能会发现,我们在开头举的例子中我们使用的输入x不止一个,这个问题就牵扯到多元的线性回归问题了,在下一篇文章中我们在讨论多元线性回归的问题。

 

留下脚印,证明你来过。

*

*

流汗坏笑撇嘴大兵流泪发呆抠鼻吓到偷笑得意呲牙亲亲疑问调皮可爱白眼难过愤怒惊讶鼓掌