Python机器学习 线性回归(拟合)数学原理与最小二乘法

首先 说明一下什么是线性规划

线性规划(Linear programming,简称LP)是运筹学中研究较早、发展较快、应用广泛、方法较成熟的一个重要分支,它是辅助人们进行科学管理的一种数学方法

举个例子

有这么一些数据:

其目标:预测银行会贷款给用户多少钱?

考虑:工资和年龄都会影响最终银行贷款的结果那么它们各自有多大的影响呢?

我们可以画个图

X1,X2就是我们的两个特征(年龄,工资),Y是银行最终会借给我们多少钱,我们需要找到最合适的一条线(想象一个高维)来最好的拟合我们的数据点,假设上面那个平面是我们拟合的数学模型,所以拟合做的事情就是找出这个数学模型。

这个属性模型很简单:

{\theta _1}是年龄的参数,{\theta _2}是工资的参数,{\theta _0}是偏置因子(常数)

所以整合上面公式如下;

其中为用矩阵表示

误差

真实值和预测值之间肯定是要存在差异的(\varepsilon用来表示该误差)

对每个样本而言,都有

对于误差,我们数学上认为:

误差{\varepsilon ^{(i)}}是独立并且具有相同的分布,并且服从均值为0方差为{\theta ^2}的高斯分布.

这句话我们可以这么理解:

独立:张三和李四一起来贷款,他俩没关系

同分布:他俩都来得是我们假定的这家银行

高斯分布:银行可能会多给,也可能会少给,但是绝大多数情况下这个浮动不会太大,极小情況下浮动会比较大,符合正常情況

(高斯分布如下,位于区间[-1,1]的面积(概率)占绝大部分)

因此,我们可以知道,只要误差越小,那么拟合的效果就会越好

预测值与误差

由于误差服从高斯分布:

将(1)带入(2)式子:

但是,这还不够,因为这里仅仅只是计算了一个样本的误差,要使得拟合效果优秀

我们需要全部样本的误差最小

因此,这里提出一个似然函数

为拟合的总误差,即在对全部样本误差做个累乘

【这里对似然函数做个说明

我们的目的:计算出什么样的参数θ和我们的数据(x,y)组合之后,能满足我们的真实值

形象理解:比如说我们掷硬币,掷了十次,结果是九次正面朝上,一次反面朝上,那么认为下一次正面朝上的概率θ就是90%; 
似然函数就是用结果(或样本)(9正,1负的数据)来推算参数(weight权重、概率),也就是说通过参数θ得到的预测的算法,能够尽可能地拟合样本数据(已知结果),从而最大化的使得预测结果更偏向于真实数据。 
 似然函数说白了就是结果导向,由已知结果来推算出预测参数θ,因为结果已经发生了,那么概率p(y|x;θ)肯定是取最大的!

我们追求的目标是预测值与实际值越接近越好,那么换句话说就是希望误差ε越小越好,甚至接近于零。 

 前面解释了似然函数是用数据来推算参数,通俗的说,我们用结果来计算参数值,而我们想要的结果是预测值=实际值,即

 ε->0,ε的取值处于0的附近;那么也就是说p(ε)的值要越大越好(前面解释过了,概率越大,ε的分布越是集中在0附近) 
        我们也知道,p(ε)的值和p(y|x;θ)的值是相等的,那么(p(y|x;θ)的概率也是越大越好。 
       那么为什么极大似然函数是一个累乘的概率积呢,因为一个单独的似然函数,概率最大时解出的θ是最满足那一个样本的参数θ,而我们的目标是要训练出一个拟合全部样本数据的θ,那么我们就不得不用累乘,来求一个联合概率密度,这个值最大时,表示 θ 使得样本集中预测值与真实值的偏差是最小的!】

 

该函数解释了什么样的参数跟我们的数据组合后恰好是真实值

但是这里我们做个对数似然变换用来优化计算速度

  (3)

为什么做这个变换,我举个例子:

例如我们计算1+2+3+。。。。+100很容易对吧,所以计算机算起来也很容易

但是如果叫你计算1*2*3*。。。。*100,就十分有难度了,因此

我们知道

通过这个方法将上面的累乘变换为累加,进而减少计算量

将(3)变换得到

接着化简得到:

(4)

我们要使得误差最小,因此(4)要取得最大值

可以知道为一个正常数

同样为一个正数

所以这里我们做个线性规划,令

(5)

通过取得该式最小值,即可获得我们要的参数

我们知道,对于单一特征x的函数求最下值,只需要求导后令导数为0,接着通过判断区间求得结果即可

但是对于多参数函数,并且多样本,我们可用矩阵进行求解偏导数

因此 (5)我们转化为矩阵可得

求其偏导数

令偏导为0,带入数据求解出来的值即为我们拟合的参数

对于拟合,我们可以用进行评估,其公式为

的取值越接近于1我们认为模型拟合的越好

猜你喜欢

转载自blog.csdn.net/qq_41686130/article/details/86618335