https://www.toutiao.com/a6673670287524889091/
01 引言
人工智能和机器学习已经是时下火热的技术。各行各业的人都想着如何利用人工智能和机器学习使他们的工作变的更加简单高效。
机器学习
机器学习知识需要由浅入深,一步一步的学习。
这篇文章,我们一起学习一下线性回归吧!
02 线性回归是什么?
函数的定义讲究的是 独立参数 x 和 非独立参数 y之间的对应关系。
y = f(x)
学好了函数,也就无意中为我们奠定了学习 回归(Regression)的基础。
怎么理解线性回归?
线性回归 = 线性 + 回归
第一:先理解什么是回归?
机器学习的目的主要是找到目标值 T 和 一堆数据之间的关系,而确定机器学习中的关系的方法有:分类和回归。
怎么去区分分类和回归呢?
看目标值 T 是定性的值还是定理的值:
定量输出称为回归;
定性输出称为分类;
比方说:
- A: 预测明天是多少度?数据有今天的度数x,天气情况y(晴天,雨天,阴天);
- B: 预测明天是什么天气?数据有今天的度数x,天气情况y(晴天,雨天,阴天);
一起来看看A和B两个例子;今天的度数x是一个连续的值;而天气情况确实一个类别,三种情况选其一;
也就是说A和B的输入数据类型是一样的!
A中预测明天有多少度?A会给出一个具体的值,且这个值是在一个连续的范围内。我们管这种叫做回归。也就是定量输出称为回归;
B中预测明天是什么天气?B给出的结果是一个定性的结果,这种叫分类。定性输出称为分类;
雷区1: 很多人会通过输入数据的类型来判断分类还是回归,其实这和输入数据真没啥关系!
第二:再理解什么是线性?
函数中,目标值T 和参数x,y,z之间的关系有很多种。比方说,
y = x,这就是线性关系;x和y的关系可以由一条直线表示;
体重和糖摄入量的关系
y = x^2,这可不是线性关系了;因为x和y的关系是抛物线了;
一步一步学 线性回归
StatQuest上已经很好的介绍了线性回归的方法,我就借用一下啦!(因为感觉说的不会比他的好!)。
图片来源:StatQuest
在StatQuest例子中,需要找到老鼠体重和老鼠尺寸大小之间的关系,数据点如上图。看着线性关系挺明显的。
第一步:假设关系
老鼠大小 = a * 老鼠体重 + b
怎么确定a和b的值就是线性回归的目标。
顺便提一下,这个就是假设函数 h(x),h代表的是假设英文的头字母(Hypothesis);
图片来源:StatQuest
第二步:确定一个标准
图片来源:StatQuest
图片来源:StatQuest
如上图,根据数据,我们可以画出无数条线来表示这个线性关系。到底怎么去选择最优的呢?
不管画的线如何变,数学表达式不会变。
老鼠大小 = a * 老鼠体重 + b
那么,通过这个式子,输出任意一个老鼠体重,就会给出一个老鼠大小值。我们定义为 预测值_i;
在已知的数据中,老鼠体重是对应的一个实际值的,定义为 实际值_i;
| 预测值_i - 实际值_i | 不就是预测误差嘛!
这样,科学家们又造出了一个 损失函数(Cost Function),也就是说所决定的关系要使得 损失函数最小。
线性回归的损失函数如下:所有误差平方的平均值
J = sum((预测值_i - 实际值_i)^2) / n
n是数据点的个数;sum是求和的意思。
图片来源:StatQuest
图片来源:StatQuest
我们有了这个目标,就旋转直线(改变斜率a)和上下移动改变截距(改变b)。上图是只改变斜率a的图,最后在一个角度的时候,我们使得 损失函数 J最小了。而这个过程,可以通过梯度下降来求得,具体的以后的文章会重点解释。
对了,线性回归的损失函数 J还有一个名字,叫做Mean Squared Error(MSE)。
03 稍微提一下Gradient Descent(梯度下降)
我希望我的朋友们,都是看过我之前文章的。因为讲这个需要点微积分,具体是偏微分的知识。
讨厌的公式来了。还是这张图。
图片来源:StatQuest
我们知道,损失函数 J = sum((预测值_i - 实际值_i)^2) / n。上图就是一个 J - a(斜率)的关系图。
知道微积分的朋友应该知道怎么去找最小值,不就是找到 极小值的方法吗?导数为0,切线水平。
公式
具体过程是假定一个a或者b,算出偏微分,然后对a或者b进行调整。具体调整的方法这里不展开讨论了。
同时考虑a和b的话,其实是找三维图像的最低点,如下图:
三维图像
04 勤学要好问:为什么损失函数里要用距离的平方而不是距离的绝对值?
大家有想过这个问题吗?误差是| 预测值_i - 实际值_i | ,那我取误差绝对值的和的最小值不也可以称为一个损失函数嘛。
千万不要以为这个平方是随随便便来的。背后的道理真的我不愿意讲,因为公式太多。
误差 = 预测值_i - 实际值_i
这个误差是符合一定概率分布的。看过我之前的文章介绍海量数据的中心极限定理的朋友,应该知道这个误差 可以被假定为:
平均值 u = 0,方差为σ 的正态分布。
正态分布
那么在已知正太分布的情况下,每一个数据点都会对应一个误差,而误差出现的概率,准确的说是Likelihood是可以通过 正态分布的函数求得的。
likelihood(概率)
所有数据点 误差概率相加
当我们对上述函数取对数可得:
取对数
最大似然分析,不懂得看我之前的文章。我们要保证 L 最大,只要保证上式 右边值最大。
式子右边 第一项和第二项是定值,只要保证第三项最小就可以使 L最大。
由于 u = 0,只要 sum((误差值_i)^2) 最小就可以啦!
这就是为什么 损失函数 J要采用平方的数学解释啦!
05 Python实现线性回归
Python真的是搭上了 人工智能和机器学习的大船,发展是真的好。
Python中的 sklearn 包是可以用来解决 线性回归的问题的。
- from sklearn.linear_model import LinearRegression
首先我们要从sklearn.linear_model中引入 LinearRegression 这个函数;
- 逃学博士 = LinearRegression(normalize=True)
将 LinearRegression 赋给变量名 逃学博士;
- 逃学博士.fit(x, y)
这样就可以做出线性回归啦!
简单吧!
06 总结
对了,千万不要认为线性回归简单、好用,就可以乱用。
随意使用会出笑话的。
比方说:中国人口肥胖比例 = 10% * 十年的次数