1、实现线性回归的算法

有了上面计算a和b的公式,我们就能够来写线性回归的代码了。其实我们也可以不用自己重复造轮子,网上已经有很多实现线性回归的代码库了。看一下api,直接使用,基本就可以了。

1、为什么要自己写实现代码

但是我们还是要自己实现一遍,因为使用别人的代码库,始终觉得不踏实,心理老是怀疑别人做得对吗?哈哈,相信和我一样的人大有人在。毫无疑问,在有时间的情况下,自己实现一些基本的功能,这确实有利于理解算法是如何工作的。

大学的时候,我曾经想自己写一个x86的操作系统,着迷了一年左右,终于用汇编语言和c语言实现了一个简单的内核。可以多任务执行自己写的c、c++语言代码。当时很多同学都觉得没有必要,操作系统已经有人实现了,学这个没什么用,当是我还是乐此不疲,直到现在,我都觉得那段时间的学习对我是有帮助的。

所以,以我的经历可以勉励大家,自己实现一些经典的机器学习、人工智能算法,对应用它解决实际问题,是有很大的帮助的。

2、机器学习的第一语言:python

我们仍然使用python来写代码,因为python在业界使用特别多,特别是在人工智能、机器学习以及深度学习领域。 也许你现在还不会python,不过没关系,毫不恐惧地、勇敢地前往未知的世界吧。

哈哈,第一次永远是最幸福的,例如恋爱、接吻、拥抱、滚床单,我是不是说多了。让我们勇敢的迈出第一步,开始写python代码吧。

3、线性回归的python实现

在源码包中找到代码line.py,这段代码的功能是计算线性回归的参数a和b,代码如下,看到代码不要惊慌,我们会详细的给大家做个解释:

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
38
39
40
41
42
43
44
45
46
47
48
# -*- coding: utf8 -*-
 
import numpy as np
 
# 训练线性回归模型的函数。其中参数x和y都是一维数组
def trainSLR(x, y):
    # n表示x的长度,这里指的是x中数据的个数。len表示求数据的长度
    n = len(x)
    # 分子的第一部分
    d1 = 0
    # 分母的第一部分
    n1 = 0
    for i in range(0, n):
        d1 += x[i]*y[i]
        n1 += x[i]**2
    # 分子的第二部分
    d2 = (np.sum(x)*np.sum(y))/float(n)
    # 分母的第二部分
    n2 = (np.sum(x)**2)/float(n)
    # 分子
    numerator = d1 - d2
    # 分母
    dinominator = n1 - n2
 
    # 求a和b的值
    a = numerator/float(dinominator)
    b = np.mean(y) - a * np.mean(x)
    return a, b
 
# 已知道x的值,预测y的值
def predict(x, a, b):
    return b + x*a
 
# 训练集,通过这几组值,训练a和b的值
x = [1, 3, 5, 7, 9]
y = [14, 24, 18, 17, 27]
 
# 训练出a和b的值
a, b = trainSLR(x, y)
 
# 打印a和b的值
print "a:", a, " b:", b
 
# 当x等于6的时候,预测y的值
x_test = 6
y_test = predict(6, a, b)
 
print "y_test:", y_test

首先上面的代码主要有两个函数trainSLR和predict。 trainSLR函数主要是通过训练集,训练出线性回归模型,也就是计算出y=ax+b中的a和b。其函数原型如下:

1
def trainSLR(x, y):

写过几行python代码的同学,一定知道def是定义函数的意思,有点像javascript中的function关键词。trainSLR有两个参数x和y,都是数组,他们表示训练集。在本案例中训练集为:

1
2
x = [1, 3, 5, 7, 9]
y = [14, 24, 18, 17, 27]

有5组数据,用于训练,实际应用中,这点数据确实是很少了,不过,这里为了讲解原理,所以,我们少写了一些。

4、线性回归模型训练函数 trainSLR

强调一下,代码第6行的trainSLR函数,是通过样本数据,计算a和b的值,从而求出线性回归模型。

其中我们定义了几个变量d1,d2,n1,n2 ,分别表示公式中如下的几部分,如下图所示,图中已经标记得很明白,希望能够理解。

好了,仔细对照代码,看一下公式中各部分是怎么分别计算的。这2个公式是理解上面代码的关键,上面的代码基本就是将这两个公式实现了一遍。

6、用图展示线性回归模型,使用matplotlib库绘制图形。

一图值千言,为了让大家更深刻的理解,我们将训练集用图给绘制出来,如下图所示:

我们来看看line1.py的代码如下:

1
2
3
4
5
6
7
8
9
10
11
# -*- coding: utf8 -*-
 
import numpy as np
import matplotlib.pyplot as plt
 
x = [1, 3, 5, 7, 9]
y = [14, 24, 18, 17, 27]
 
# 绘制散点图
plt.scatter(x, y,  color='black')
plt.show()

我们这里使用的python中使用最广泛的matplotlib库绘制散点图。

1、matplotlib简介

matplotlib库主要用来绘制一些图形,它的使用非常简单,所以在科学研究中才表现出了它的价值。本来科学研究就已经很痛苦了,如果再加上一些需要很痛苦才能学会的图形库,那么恐怕没有多少人会用matplotlib。

matplotlib能够绘制如下的很多图:

相对于我们的课程来说,matplotlib库可以说简单到不能再简单。我们不打算在这里详细讲解matplotlib库,大家可以在matplotlib的官网学到很多该库的使用方法。

好了,说了一些题外话,我们这里使用了matplotlib库的scatter来绘制散点图,散点图就是由一个一个的点组成的图,叫做点集图可能更合适。散点图大致如下的样子:

上面由一个个点组成的图就是散点图。

2、scatter函数介绍

散点图有一个scatter函数,如下。

1
2
plt.scatter(x, y,  color='black')
plt.show()

scatter的用法接受3个参数,x是x坐标中的值,y是y坐标中的值,他们都是数组。 color表示使用什么颜色绘制点。

show函数表示显示绘制的图像。

7 、作业时间

作业1:只有实践才能出真知,为了表达一下你学习的诚意,请将你自己实现线性回归的代码贴到评论区把。