逻辑回归及正则化

"逻辑回归算法”(分类算法)

在这个算法里,我们的假设函数h(x)长这样:h(x)=\frac{1}{1+e^{-\theta^T*X} }

简化一下,把\theta^T*X叫做Z,那么原函数就变成了g(z)=\frac{1}{1+e^{-z} }

图示如下:

是不是感觉长得很像累计分布函数啊……

(第二个图是累计分布函数的)

嗯。反正差不多,所以高数的知识可以直接拿过来用了。

逻辑回归算法,计算目的是为了分类。按照图中所示,当z>0的时候,g(z)大于0.5,那么假如你要分类,1为在某类,0为不在某类,那g(z)四舍五入就是1个1……。同理,z<0时,g(z)<0.5,四舍五入到0……(当然实际不是这么做的,实际做法是用数学方法使z的绝对值超过一个界限,使得g(z)和1或者0很近。)

我们可以把g(z)=0.5,也就是z=0的时候,称为决策边界。假设y为结果,y的值是1或者0。

那么,z=0,也就是\theta^T*X=0的时候为边界。\theta^T*X\geq 0时y=1。\theta^T*X< 0时y=0。分类就靠这个……

然后继续,机器学习嘛,根据前两周的经验,肯定有那个J,代价函数。逻辑回归算法的代价函数如下:

J=1/m*\sum_{i=1}^{m}({h(x_i)-y_i} )^2(m是y总数,嫌麻烦的话,和第二周一样,如果你把那个加和符号去掉,那么这里x和y就变成向量了也就是:J=1/m*({h(x)-y} ).^2。)

然后因为y只有0和1两个取值,这里就可以分两种情况讨论,让y从函数中去掉:

y=0:J=1/m*\sum_{1}^{m}({h(x)-0} )^2

y=1:J=1/m*\sum_{1}^{m}({h(x)-1} )^2

然而我们发现,这样拿出来的函数,因为y一会儿是1,一会儿是0,得到的图像如下(左边的)然而左边的凹凸不平(非凸),不方便梯度下降,我们想要的是右边那种滑溜溜(凸)的图像。:


所以我们假设有个函数cost, cost=(h(x),y)

原函数J变成了J=1/m*\sum_{1}^{m}(cost(h(x),y)

反正我们要的是cost=(h(x),y)符合决策边界的条件就可以了,反正都把结果四舍五入成1或者0了,也没必要非得是某个函数对吧?

所以它是什么函数无所谓。只要(它的函数处理了x以后,得到的y)符合决策边界的条件即可。而现在我们希望得到一个滑溜溜的凸函数。那么我们就假设(注意,这是假设出来的,符合条件的函数之一,没说非得这样。然而这是已有的函数中最好的。):

y=1的时候,cost=(h(x),y)=-log(h(x))

y=0的时候,cost=(h(x),y)=-log(1-h(x))

它们的图像如下:

符合条件。那么这时候还有一个问题,大家都很懒对吧,懒得分情况讨论,那么如何做呢?

你看,由于y只有1和0两个值,所以我们就直接把两种情况的cost函数相加,然后分别乘以y和y-1即可:

cost=(h(x),y)=-y*log(h(x))+(y-1)log(1-h(x))

看,是不是很方便呢?

于是原来的那个代价函数J就变成了:

J=1/m*\sum_{1}^{m}(-y*log(h(x))+(y-1)log(1-h(x)))

然后照旧,我们目的是拿x和y训练样本得到\theta嘛!所以对这玩意求导,然后取个α,然后不断重复梯度下降……以得到\theta,就是下面这个玩意:

(repeat:)\theta_j=\theta_j-\alpha *\frac{d}{d\theta_j}J(\theta)

这坨玩意里,我们需要计算\frac{d}{d\theta_j}J(\theta) ,直接照搬之前笔记里的,\frac{d}{d\theta_j}J(\theta) =1/m*\sum_{i=1}^{m}{(h(x_i)-y_i)} *x_{i,j}即可。只不过这里的h(x)=\frac{1}{1+e^{-\theta^T*X} }

于是我们最终得到的

(repeat:)\theta_j=\theta_j-\alpha /m*\sum_{i=1}^{m}{(h(x_i)-y_i)} *x_{i,j}

逻辑回归函数就是这样了。

然后是拟合问题,下面是3种情况:

第一种是欠拟合,通常是因为特征量选少了。第二种是我们想要的,第三个是过拟合,通常是因为特征量选多了。

欠拟合的解决方法是增加特征量。

过拟合的解决方法是减少特征量或者正则化。

比如我们的逻辑回归函数,不选个自定义的函数,就用我们那个类似泰勒展开式的函数来做的画,这货长得凹凸不平的

,一点都不光滑。那么,按照这货拟合回来的函数,十有八九也是过拟合了。于是我们就会得到一个类似这样的决策边界(蓝色线)显然,这条决策边界很……不实用。

我们想要的,是一根滑溜溜的凸函数,但是我们又不能确定哪些特征量该去掉,所以我们就选择正则化的方式解决过拟合。

正则化的方法,就是给代价函数后面加个“惩罚项”……来降低它对数据的拟合能力。

于是我们的J=1/2m*\sum_{1}^{m}(-y*log(h(x))+(y-1)log(1-h(x)))

就变成了:J=1/2m*(\sum_{1}^{m}(-y*log(h(x))+(y-1)log(1-h(x)))+\lambda \sum_{j=1}^{n}{\theta_j^2} )(这里n表示特征量的总数,意思就是让所有的n个正义的\theta为了解决过拟合问题,大喊一声“合体!”然后一起来惩罚那个过度拟合了的函数……\lambda 是正规化参数,决定了你惩罚得有多狠。你要惩罚狠点,你就把\lambda 提高一点,\lambda 过高会变得欠拟合,\lambda 过小无法解决过拟合。)

那么我们的\theta_j=\theta_j-\alpha /m*\sum_{i=1}^{m}{(h(x_i)-y_i)} *x_{i,j}就顺利变成了:

\theta_j=\theta_j(1-\alpha *\lambda /m)-\alpha /m*\sum_{i=1}^{m}({(h(x_i)-y_i)} *x_{i,j}) ~→

\theta_j=\theta_j-\alpha /m*(\sum_{i=1}^{m}{(h(x_i)-y_i)} *x_{i,j}+\lambda /m*\theta_j)

注意,当\theta_0的时候,由于x_0=1,所以这一项不会欠拟合也不会过拟合,所以不惩罚它。

然后,如果你用的不是线性回归,而是正规方程的话,同理,给

\theta=(X^T*X)^{-1} *X^T*y 加个惩罚项就好了。这里加的惩罚项为 \varsigma , \varsigma 是一个n+1阶的单位矩阵把第一项变成0(因为第一项不惩罚),我们把 \varsigma 写作varsigma,代码差不多就是下面这个:
varsigma =ones(n+1,n+1); #没有ones方法的自己写个循环给列表赋值,非常简单。
varsigma [0,0]=0 #python,c,php等编程的话,等这里是0,0
varsigma [1,1]=0 #matlab等这里是1,1,因为一个从0开始计数,一个从1开始计数。真是……就不能统一一下么,老因为这个引起一群嘴强王者的唇战。
写出来差不多就是这样一个矩阵:
[
0,0,0,0,0,0,0,0,...,0,0
0,1,0,0,0,0,0,0,...,0,0
0,0,1,0,0,0,0,0,...,0,0
0,0,0,1,0,0,0,0,...,0,0
0,0,0,0,1,0,0,0,...,0,0
0,0,0,0,0,1,0,0,...,0,0
0,0,0,0,0,0,1,0,...,0,0
0,0,0,0,0,0,0,1,...,0,0
.                     .
.                     .
.                     .
0,0,0,0,0,0,0,0,...,0,1
]

得到的正规化后的公式为\theta=(X^T*X+\lambda *\varsigma )^{-1} *X^T*y

转载:https://zhuanlan.zhihu.com/p/21378251

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值