回归算法是机器学习的一个基础算法,简单的就是线性回归,还有非线性回归。本节我们讲解简单的线性回归。
线性回归就是用直线来描述两个变量之间的线性关系。我们在中学时可以根据平面上的两个点来计算出通过这两个点的直线。而线性回归呢跟这个类似,只不过这里有无穷多个点,我们知道一条直线一般是不能同时通过这无穷多个点的,所以呢,线性回归要求这条直线像下面的图所显示的那样能大致通过这些点就可以。而回归的目标就是使得直线尽量不要偏离这些点太远。因为直线要照顾所有的点,所以要有一个整体性的表达式来衡量直线偏离所有点的程度。然后我们调整直线的系数,使得这个偏离程度表达式最小化。
其中的数学化公式小编不做详细讲解,虽然线性回归是机器学习算法中最简单的一个,但是其数学表达也超出了很多菜鸟的理解范围。不过我可以做一下简单的说明
上文提到的直线偏离所有点的程度,这个偏离程度在机器学习里有一个专门的词汇叫着损失,而表达这种损失的表达式叫着损失函数。我们的目标是最小化损失函数。
当我们定义线性回归的损失函数是每个点到直线的距离的平方和时,这种线性回归算法称之为最小二乘法。
下面我们使用sklearn提供的LinearRegression[最小二乘法]模块来练练手,先使用virtualenv安装一下sklearn,如果网络不好,下面的过程可能会比较长,请耐心等待。
mkdir -p ~/source/skl
cd ~/source/skl
virtualenv .py --python=python2.7
source .py/bin/activate
pip install sklearn
pip install scipy # 科学计算
pip install matplotlib # 画图
pip install ipython # 命令行工具
我们先用y=5x+2直线生成100个点,还要加上浮动,避免所有的点能连成一条直线。
# -*- coding: utf-8 -*-
import random
import matplotlib.pyplot as plt
xs = range(100)
ys = []for x in xs:
y.append(5*x+2+random.random()*50) # random加上浮动
plt.scatter(xs, ys, marker='.') # 画点
plt.show() # 显示图形窗口
于是画图窗口打开了,我们看到
接下来我们开始使用sklearn的线性回归模块
# -*- coding: utf-8 -*-
import random
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
xs = range(100)
ys = []for x in xs:
ys.append(5*x+2+random.random()*50) # 生成随机散点
model = LinearRegression()
model.fit([[x] for x in xs], ys) # 拟合直线,*转换输入为多维*
ys_ = model.predict([[x] for x in xs]) # 预测所有的样本
plt.scatter(xs, ys, marker='.') # 画样本点,随机散点
plt.scatter(xs, ys_, marker='+') # 画预测点,直线点
plt.show()
于是我们看到一条完美的黄色直线生成了
机器学习的目的是从输入数据中习得一个模型,然后用这个模型去预测世界。在本例中,模型是一条直线以及直线的系数,LinearRegressionModel是该模型的一个封装。模型有fit方法灌入输入数据,进行复杂的数学计算后,模型就训练出来了。然后我们就可以使用predict方法去预测世界。例子中我们通过输入数据本身和模型对输入数据的预测进行了图形比对,直观上就可以看出这是一个正确的直线拟合。
线性回归的每条输入是一个数据对(x,y),x在本例中是一个数值,在实际应用中x则是一个数组,它代表中输入对象的多维属性。比如颜色对象的RGB就有三个值。例子中拟合的是一条直线,实际应用中拟合的则是一个多维平面。所以代码中我们对输入xs做了转换[[x] for x in xs]将输入x转换成多维形式,否则模型不接受输入。