deep learning (六)logistic(逻辑斯蒂)回归中L2范数的应用
zaish上一节讲了线性回归中L2范数的应用,这里继续logistic回归L2范数的应用。
先说一下问题:有一堆二维数据点,这些点的标记有的是1,有的是0.我们的任务就是制作一个分界面区分出来这些点。如图(标记是1的样本用+表示,0的用红点表示):
这其实是一个二分类问题,然后我们就想到了logistic回归模型。这是一个概率模型,
即预测在x已知时,标记为1的概率:那么标记为0的概率为:。
那么分别根据每个样本的标记y是1还是0分别带入到每个概率模型(每个样本只带入一个模型,而不是两个都带入),然后就得出了对数似然估计,也就是
cost function,这也就是之前我们做的。
现在我要说点不同的东西,先说一下之前理解的线性回归中的,我之前以为就是样本的所有维度变量的线性叠加。其实这里的线性回归不光是这样,我理解的太狭隘了。这里的x,包括前面的x指的是样本特征的向量!不是很明白么,继续解释一下,一个样本是[x1,x2],那么这个样本的特征可以是x= [x1,x2],但是这个样本的特征也可以不光是这些,比如这个样本的特征还可以是x=[x1,x1平方,x2,x2平方,x1x2].懂了吧?特征是你自己从观察值中提取出来的,你想是什么就是什么,而不只是观察值本身。再比如,有一幅图像,那么这幅图像的特征不光可以是像素值,还可以用很多方法来得到你想要的图像的特征。而这里说的线性回归应该指的是特征的线性回归模型。所以上一节确实是线性回归模型。所以从观察值中如何找特征,找哪些特征也是一个很重要的问题。
现在我们的样本观察值有两维,即,并且我们根据观察值,取的特征为:
这是一个29维的特征向量,我们先根据每一个样本的观察值得到每一个样本29维的特征向量。这个程序,程序下载入口这个网站已经给出了:
1: function xFeature= map_feature(u, v)
2: %u,v 向量每个元素分别是每个样本的第一维,第二维的观察值
3: degree= 6;
4: xFeature= ones(size(u(:,1)));
5: for i = 1:degree
6: for j = 0:i
7: xFeature(:, end+1) = (u.^(i-j)).*(v.^j);
8: %xFeature 矩阵的每一行是每一个样本的特征向量
9: end
10: end
加入L2正则项的cost function是:
这里θ是从θ0开始的,一直到θ28.θ0就是θX中常数项的那个参数。所以这个公式表明θ0是不用加上去的。即常数项的那个参数不参与cost function的规则相。
公式中的x(i)就是前面得到的每一个样本的28维特征向量
现在我们要对这个cost function 最小化来得到模型的参数。我们使用牛顿法进行迭代:
我们知道(之前的一节中)没有正则项时候的cost function的一次导为:
二次导数为:
带了L2正则项的cost function 的一次导为:
也就是:,θ’是θ这个模型参数向量(这里第一个元素师θ0,也就是θX常数项的参数)的第一个元素θ0=0的向量。
二次导为:
matlab代码即:
2: %之后就不用再增加一列了。后面的theta参数也不用n+1了。
3: [m, n] = size(x);
4: % Initialize fitting parameters
5: theta = zeros(n, 1);%参数θ向量是一个列向量。
6: % Define the sigmoid function
7: g = inline('1.0 ./ (1.0 + exp(-z))');
8: % setup for Newton's method
9: MAX_ITR = 15;%牛顿迭代法的次数
10: J = zeros(MAX_ITR, 1);%初始化15次迭代的cost function 值,J是为了之后画图
11: % Lambda 是L2正则项的参数
12: lambda = 1;%lambda=0,1,10,修改这个地方,运行3次可以得到3种结果。
13: % Newton's Method
14: for i = 1:MAX_ITR
15: z = x * theta;
16: h = g(z);%z,h都是m*1的列向量,m是样本的个数
17: % Calculate J (for testing convergence)
1: x = map_feature(x(:,1), x(:,2));%得到的x第一列都是1,经过这个函数后已经增加了,
18: J(i) =(1/m)*sum(-y.*log(h) - (1-y).*log(1-h))+ ...
19: (lambda/(2*m))*norm(theta([2:end]))^2;
20: %norm(theta([2:end]))就是欧氏距离,所以还要平方。要知道是2:end,不是1:end
21: %前面说了
22:
23: % Calculate gradient and hessian.
24: G = (lambda/m).*theta; G(1) = 0;
25: % extra term for gradient
26: L = (lambda/m).*eye(n); L(1) = 0;
27: % extra term for Hessian eye(n)是n维单位矩阵。
28: grad = ((1/m).*x' * (h-y)) + G;
29: H = ((1/m).*x' * diag(h) * diag(1-h) * x) + L;%除了G,L其他的公式matlab
30: %的表达形式都和以前一样。
31:
32: % Here is the actual update
33: theta = theta - H\grad;
34:
35: end
当我们得到logistic回归模型的参数后,我们知道这个模型得到的是概率,我们如果想用这个模型进行分类,我们需要有一个分类假设,这里我们假设如果
h(x(i))>0.5,那么这个样本X(i)就属于label=1那一类,如果<0.5,那么这个样本x(i)就属于label=0那一类。于是我们推算出来:
这个就是分界面。注意这里的x是那个29维的向量。因为我们要在那个输入的观察向量[u,v]那个面上画出分界面,所以我们要把这里的x里面的元素各代表多少的u和v还原回去,那么这个分界面就是一个曲面了(因为有u,v都有高次方)。那么具体怎么画哪,我们在u,v轴上画出一个区域的数据格,把这个区域里面所有的[u,v]通过map_function 得到每一个29维的x向量, 然后通过,得到这个区域所有对应的z,然后通过在这些z中画出z=0的等高线,就得到了的这个分界面。具体的matlab程序为:
1: u = linspace(-1, 1.5, 200);
2: v = linspace(-1, 1.5, 200);
3: z = zeros(length(u), length(v));
4:
5: % Evaluate z = theta*x over the grid
6: for i = 1:length(u)
7: for j = 1:length(v)
8: z(i,j) = map_feature(u(i), v(j))*theta;
9: end
10: end
11: z = z'; % important to transpose z before calling contour
12:
13: % Plot z = 0
14: contour(u, v, z, [0, 0], 'LineWidth', 2)
这里有个疑惑的地方就是第11行为什么要对z转置,这里说一下:假设区域如图所示:
看上面程序的第6-8行,我们知道i=1,v=2的时候,那么z(1,2)就是图中的红点对应的z值,那么循环完之后就是有一个z矩阵,
那么接下来我们用contour这个画等高线,后面的输入是(u,v,z,[0,0]),这里的意思是根据u,v向量给出的坐标,然后和对应的z得到z的
曲面,然后后面的[0,0]意思是画出z=0和z=0之间的等高线,也就是画出z=0的等高线。这里有一个地方要注意的是u,v向量给出的坐标,然后和z
对应的方式是:比如u的第一个元素和v的第二个元素,对应的是z矩阵的第二行第一列z(2,1),也就是u对应的是矩阵z第几列,v对应的是矩阵z的第几行。然而,我们根据之前循环得到的矩阵知道,那里的z(2,1)是当i=2,v=1得到的,也就是u=2(u的第二个元素),v=1(v的第一个元素),所以我们草药把循环得到的z转置才可以使用contour函数。
实验结果:
当L2正则项参数为0时,cost function的 收敛情况如图:
此时分界面对样本分界的情况如图:
可以看出,分界面比较复杂,虽然对样本分界的效果做到很精细,但我们做出的分界面是为了对未标注的样本分类,过于复杂的分界面容易产生过拟合现象。
当L2正则项参数为1时,cost function的 收敛情况如图:
可以看出,λ=1时收敛更快,说明正则项的系数增大会使模型变得简单,从分界面对样本分界的情况更可以看出来,如图:
分界面更圆滑,虽然分界面不是很精细了,也有些误分类,但是模型的简单化可以防止过拟合现象,可能对未训练样本分类更好。
再看下λ=10时的情况:
这时候你可能会想我这时候取的特征中最高是观察值的6次方,我们知道6次方最后得到的分界面肯定是很复杂的,如果我们把特征变的简单一点,比如观察值最高是3次方,这时候最后得到的分界面肯定比之前简单(更极端的是特征就是观察值,也就是说特征是观察值的一次方,前面已经画过了,是一条直线),我们验证一下:
当特征最高是观察值的3次方(λ=0):
收敛情况和分界面对样本分界的情况分别是:
我们看到模型确实更简单了,收敛更快了(相比上面的六次方λ=0的情况)我个人感觉这个相比六次方那个特征假设模型更好,可以比较这个分界曲面的方向,并且比较圆滑,比较美,也比较符合样本的走向。我认为更具有普适性。对未知样本分类效果更好。
deep learning (六)logistic(逻辑斯蒂)回归中L2范数的应用的更多相关文章
- 机器学习之LinearRegression与Logistic Regression逻辑斯蒂回归(三)
一 评价尺度 sklearn包含四种评价尺度 1 均方差(mean-squared-error) 2 平均绝对值误差(mean_absolute_error) 3 可释方差得分(explained_v ...
- 【转】机器学习笔记之(3)——Logistic回归(逻辑斯蒂回归)
原文链接:https://blog.csdn.net/gwplovekimi/article/details/80288964 本博文为逻辑斯特回归的学习笔记.由于仅仅是学习笔记,水平有限,还望广大读 ...
- 【分类器】感知机+线性回归+逻辑斯蒂回归+softmax回归
一.感知机 详细参考:https://blog.csdn.net/wodeai1235/article/details/54755735 1.模型和图像: 2.数学定义推导和优化: 3.流程 ...
- spark机器学习从0到1逻辑斯蒂回归之(四)
逻辑斯蒂回归 一.概念 逻辑斯蒂回归(logistic regression)是统计学习中的经典分类方法,属于对数线性模型.logistic回归的因变量可以是二分类的,也可以是多分类的.logis ...
- python机器学习实现逻辑斯蒂回归
逻辑斯蒂回归 关注公众号"轻松学编程"了解更多. [关键词]Logistics函数,最大似然估计,梯度下降法 1.Logistics回归的原理 利用Logistics回归进行分类的 ...
- [置顶] 局部加权回归、最小二乘的概率解释、逻辑斯蒂回归、感知器算法——斯坦福ML公开课笔记3
转载请注明:http://blog.csdn.net/xinzhangyanxiang/article/details/9113681 最近在看Ng的机器学习公开课,Ng的讲法循循善诱,感觉提高了不少 ...
- 【项目实战】pytorch实现逻辑斯蒂回归
视频指导:https://www.bilibili.com/video/BV1Y7411d7Ys?p=6 一些数据集 在pytorch框架下,里面面有配套的数据集,pytorch里面有一个torchv ...
- 逻辑斯蒂回归VS决策树VS随机森林
LR 与SVM 不同 1.logistic regression适合需要得到一个分类概率的场景,SVM则没有分类概率 2.LR其实同样可以使用kernel,但是LR没有support vector在计 ...
- 逻辑斯蒂回归(Logistic Regression)
逻辑回归名字比较古怪,看上去是回归,却是一个简单的二分类模型. 逻辑回归的模型是如下形式: 其中x是features,θ是feature的权重,σ是sigmoid函数.将θ0视为θ0*x0(x0取值为 ...
随机推荐
- Linux中的系统挂载文件/etc/fstab
[root@localhost ~]# cat /etc/fstab ## /etc/fstab# Created by anaconda on Wed Oct 5 15:21:46 2016## A ...
- nodejs获取服务器数据到页面
const Koa = require('koa'); const Router = require('koa-router'); const app = new Koa(); const route ...
- ABAP rfc 发布webservice 错误
一.SICF 测试服务报错: 哎呀,找不到网页! 网站在检索此网址时出现错误.托管此网站的服务器可能关闭进行维护或配置不正确. HTTP ERROR 500
- orange安装文档
一.Orange简介 Orange是一个基于 OpenResty/Nginx 的 API Gateway,提供 API 及 “自定义规则” 的监控和管理,如访问统计.流量切分.AB 测试.API ...
- C#如何使用结构化异常处理
Knowledge Base: Chinese (Simplified) 如何使用 Visual C# .NET 和 Visual C# 2005 中的结构化异常处理文章ID: 816157 最近更新 ...
- 常见Web源码泄露总结
来自:http://www.hacksec.cn/Penetration-test/474.html 摘要 背景 本文主要是记录一下常见的源码泄漏问题,这些经常在web渗透测试以及CTF中出现. .h ...
- Loadrunder之脚本篇——关联
关联的原理 关联也属于一钟特殊的参数化.一般参数化的参数来源于一个文件.一个定义的table.通过sql写的一个结果集等,但关联所获得的参数是服务器响应请求所返回的一个符合条件的.动态的值. 例子:常 ...
- Word内容修改,以及转PDF
Word模板内容修改 1.java代码 package com.sicdt.sicsign.web.utils; import java.io.ByteArrayInputStream; import ...
- 建议50:Python中的高级数据结构
# -*- coding:utf-8 -*- ''' Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint collections模块包含了内建类型之外 ...
- Js 类型方面的神坑
你有没有遇见过本来好好的一个数组结果 typeof 出来是个 object 的情况,你有没有遇到过非要写个 typeof x === "undefined" 判断未赋值的情况... ...