0x00 前言
大家好我是小蕉。上一次我们说完了线性回归。不知道小伙伴有没有什么意见建议,是不是发现每个字都看得懂,但是全篇都不知道在说啥?哈哈哈哈哈哈,那就对了。
这次我们来聊聊,有小伙伴说,那我如果我么想把结果分为两拨,就这样的,咋办?
大蕉大笔一挥。啊这不是分好了吗?
我敢说,现在百分之很多十(目测七八十)说自己在做人工智能的,都只是用Logistic回归在做分析。
“就你事多。我不会分。”
“想学啊你?我教你啊。”
0x01 Logistic是啥玩意
想法大概是这样。把数据映射到Logistic函数上边,大于0.5我们就认为是类别y1 = 0,小于0.5我们认为是类别y2 = 1。
- y ∈ {0 , 1}
这个函数长啥样?就长下面这样。
- π (x) = 1 / ( 1 + exp (-x))
所以我们在这种情况下,观察到各个样本的概率长下面这样。
- P( Y = 1 | x ) = 1 / ( 1 + exp (-x))
- P( Y = 0 | x ) = 1 / ( 1 + exp (x))
所以比值比ODD 长这样
- odd = P( Y = 1 | x ) / P( Y = 0 | x ) = exp (x)
对数比值比刚刚好
- ln odd = x
你说神不神奇!!当然我们不仅仅只有一个参数是吧?所以对原始数据变成
- g(x) = θ.T * x + b
其中θ是一个N维的向量,跟每一个样本X的维度保持一致这样。
所以LR的映射函数做一下线性变换就变成这样了。
- π (x) = 1 / ( 1 + exp (-g(x)))
到这里,我们已经知道Logistic回归是什么鸟了,其实就是把数据映射到Logistic函数上,根据概率来进行分类。
0x02 极大似然估计
那我们要怎么得到损失函数loss呢?不要急跟大蕉一步一步来。
上面我们已经看到了每个样本的概率。现在说一下极大似然估计是什么东西。极大似然估计,就是我们装作这些个参数啊,我们老早就知道了,然后借此来估计现在这些样本被观察到的概率。你脑子wata啦?既然这些样本都已经发现了,所以实际概率肯定是***啊!!概率要越大越好越大越好,而又只是一个估计值,所以我们就叫它极大似然估计啦。
所以我们观察到样本的概率是
- P = (p ^ Y) * (( 1 - p) ^ ( 1 - Y ))
怎么容易一点去理解这行蜈蚣一样的公式呢?把Y的值0跟1代进去就行了,你就懂了,Y等于0的时候就是(1 - p ),y等于1时就是 p。就是这么简单。
下面是重点。敲黑板,划重点!!!我就是卡在这里想了很多天,完全不知道损失函数怎么来的!
因为所有样本都是相互独立的,所以他们的联合概率分布是他们的概率乘积。
- L(θ) = ∏ (p ^ yi) * ( (1 - p) ^ (1 - yi))
yi是每个样本的实际Y值。我们这里要求***值嘛,那要变成损失函数咋变?我们知道这个值永远是 ( 0 , 1)的,所以直接加个负号,本来求***就变成求最小了。
- ∴ loss = - L(θ)
当然我们习惯这样加,看起来比较高端,m是样本的个数
- ∴ loss = - 1/m * L(θ)
无所谓,原理一样的。
乘法是很消耗资源的,我们可以把它转换成对数,这样所有的乘法都变成加法啦!!而且而且函数的性质不变。所以最终的损失函数长这样。
- loss(θ) = - log L(θ)
下面开始我们用Andrew NG大大的方式变换一下好了,仅仅是为了后面比较好算而已。
- P = p ^ (y + 1) / 2 * (1 - p) ^ - (y - 1) / 2
- Y ∈ {-1,1}
跟上面没什么本质的差别,只是把Y的值域变成-1跟1了。下面就是普通的公式变换。
0x03 损失函数咋来的
- l(θ) = - ∑ ln(p ^ (yi + 1) / 2 * (1 - p) ^ - (yi - 1) / 2)
进行log变换,幂乘变成乘法。
- = - ∑ (yi + 1) / 2 * lnp - (yi - 1) / 2 * ln(1 - p) )
把p代进去,也就是把把负号放到P里边了。变成直接取倒数。就得到下面这个
- = ∑ (yi + 1) / 2 * ln(1 + exp (-g(xi)) - (yi - 1) / 2 * ln( 1 + exp (g(xi)))
观察一下,就可以看出来。自己代进去就知道啦。
- ∴ 当yi = 1 时,l(θ) = ∑ ln(1 + exp ( - g(xi))
当yi = -1 时,l(θ) = ∑ ln(1 + exp ( g(xi))
所以最终的损失函数长这样。
- l(θ) = ∑ ln(1 + exp ( - yi * g(xi))
好了,到这里我们的推导就结束了,接下来就按照梯度下降算法去求最小值就好啦。
0x04 怎么用呢
然后我们就可以用最终得到的参数进行预测,大于0就当成类别Y1 ,即Y = 1,小于0当成类别Y1,即Y = -1。当然,这只能用于二分类。
那这玩意有什么用呢?应用场景比比皆是。
用户点击还是不点击?客户是欺诈还是没欺诈?客户逾期还是不逾期?这个产品是推荐还是不推荐?
传说中的人工智能预测高端引擎就出来了,小伙伴自己试试看把。
0x05 结束语
今天就酱,掰~跪在地上求不掉粉。
【本文为51CTO专栏作者“大蕉”的原创稿件,转载请通过作者微信公众号“一名叫大蕉的程序员”获取授权】