基本概念
线性回归,其实说白了,就是期待用线性函数,来描述输入变量和输出之间的关系。输入变量,是可以通过采集、搜集得到的数据,而输出的变量,则是将要预测或者得出结论的那个参数。
问题描述
比如说,一个单变量的线性回归问题:预测房价与房间大小的关系。现在我们遇到的问题是:我们想知道,当给我们一套房子时,我们能否较为准确的预测出它的价格。
在实际生活中,我们知道,房价并不单纯与房间大小呈线性关系,可是,如果我们不知道其他的参数(这些参数,在人工智能中有一个更准确的概念,叫做特征),这些参数或者无法搜集,或者搜集的不准确,我们只能拿到房间大小这一个数据作为输入,那么如果我们用线性回归,来分析房价与房间大小之间的关系,那么我们就默认为一个前提:房价和房间大小呈线性关系。
如果房价和房间大小确实呈完美的线性关系,那么我们无需使用人工智能来进行房价预测,因为我们可以很容易得出房价与房间大小之间的关系,p=s*10000(1万元一平方米),当新的房间参数到来时,只需要将新的房间大小s代入这个公式,就可以了。
解决方法
然而实际上我们也知道,这几乎时不可能的,因为影响房间的因素太多了,我们无法将所有影响房价的因素都找出来,比如所处的地段、学区房、户型等。所以我们用到的一定时一个简化的模型,就是我们认为房间一定主要由几个参数来确定。假如我们现在认为房价只和房间大小有关,那么因为它和现实相违背,它一定不是完美的线性关系,基本上来说,会是这样的。
因为只有一个参数,所以,我们用线性函数
p=as+b
来表示房价p和房间大小s之间的关系,那么我们的目标,变成了,通过上述数据,来确定a和b。这样我们就能够得到一个完整的公式。但是,实际上,因为房价和房子大小之间不是完美的线性关系,我们肯定无法用一个线性函数来完美描述他们之间的关系,不同的a和b确定的直线,在图上是这样的。
也就是说,我们可以有无数个a和b的取值,每个取值,都代表了一个直线,那么到底哪个直线更能够代表房价和房间大小之间的关系呢?此处,我们需要引入另外一个概念:损失函数。损失函数,描述的就是用直线模拟出来的结果,和真实的结果之间的误差。那么很明显,它是衡量哪条直线更能符合真实关系的一个重要指标:损失函数越小,应该说明这条直线越能够描述输入与输出之间的关系。
于是我们的问题就变成了:如何找到一组参数a和b,让损失函数最小。如何解决这个问题呢?人工智能采取的基本上都是最笨的方法:挨个试。就是a和b随便取。
但是也不能太随便,否则岂不是像没头苍蝇一样到处乱撞?肯定有方法,有规律的去挨个试。
一个很重要的方法,叫做梯度下降。
梯度下降,说白了,其实就是按照一定的步长来减少或者增加参数a和b的值,以期望得到最小的损失函数。例如,初始值,设定a和b都是1,代入公式中,然后把所有的数据都代入公式,用真实的值减去公式算出的值,将他们的绝对值相加,就是损失函数。然后,根据梯度下降的步长,假如设定为0.1,那么下一组参数就是0.9和0.9,继续代入,算出损失函数,看是否能够得到更小的损失。以此不停的计算,直到两个条件:要么得到了认可(可被接受的)的最小损失函数,此时的a和b的参数,就是我们要的参数,问题解决;要么,算的次数(迭代次数)已经超过了我们的接受范围(比如,就算100次),还没有得到可以接受的损失(损失函数仍然很大),但是你不能永远算下去,时间都浪费了,这种情况就是不收敛,也就是在规定的步数内,没有找到可被接受的最小的损失函数。不收敛的处理方法,要么重新调整参数,重新计算,要么就从这些不收敛的数据中,找到损失函数最小的参数,先用着。所以,在求取最小损失的过程中,步长(每次的变化量)和迭代次数,是很重要的参数。
多变量的线性回归
多变量的线性回归,和单变量类似。单变量的线性回归,是用一个参数来模拟输入与输出之间的关系,多变量,就是用多个参数。那么也就不是用直线来模拟,而是用曲线。表达式的一般规律是:
y=a_0+a_1x_1+a_2x_2+……a_nx_n
其中x_n就是n个参数(特征),a_0-a_n是我们需要通过已有的数据,通过计算最小损失函数来确定的参数。
这些数据,被称为训练数据,通过这些训练数据,确定的a_0-a_n的参数,被称为一个模型。
我们常说的,训练一个模型,其实就是要通过大量的数据学习,得到一个最能够准确描述这些数据的公式的所有参数,这些参数,就可以被认为是一个机器学习模型。而准确与否,则是用损失函数来进行衡量。
数据规范化
事实上,数据规范化问题,是一个共性问题。指的是将不同特征的数据,尽可能规范化到一个统一的度量里面。比如说,房子的价格,除了和房间的大小有关系,还和房子里面的房间个数有关系,比如说同样的80平米的房子,有5个房间的,要比只有4个房间的贵,那么这个模型里面,就有两个特征(变量),这两个特征,数据的维度差了一个数量级,房间的大小都是70、80这样的量级,可是房间的个数,基本都是5、6这样的。这种量级差别的特征数据给模型的训练带来了问题,所以,最好的方法是将他们的量级统一起来。
其中一种常见的规范化方法是:
- 求每个特征量X的平均值mean
- 求每个特征量X的标准差sigma
- 规范化:X = (X-mean) / sigma
将所有的特征都按照这样的方法处理一遍,那么大家的量级就拉平了,这样便于模型的训练,同时也能够提升机器学习和预测的准确性。
有点像我听说过的线性代数。
@xqiushi 还不太一样。