特征缩放 和普通图像梯度特征下降法的区别

梯度下降法和最速下降法的细微差别
本文转载自TimingSpace 发表在CSDN上的文章 原文链接:1. 前言:细微之处,彰显本质;不求甚解,难以理解。一直以来,我都认为,梯度下降法就是最速下降法,反之亦然,老师是这么叫的,上是这么写的,也是这么说的,这么说,必然会导致大家认为,梯度的反方向就是下降最快的方向,然而最近在读 的凸优化的书,才发现事实并非如此,梯度下降和最速下降并不相同,梯度方向也不一定总是下降最快的方向。2.
梯度下降法梯度下降法是一种优化方法,用来求解目标函数的极小值。梯度下降法认为梯度的反方向就是下降最快的方向,所以每次将变量沿着梯度的反方向移动一定距离,目标函数便会逐渐减小,最终达到最小。f(x)=f(x0)+?f(x)(x-x0)+12(x-x0)T?2f(x)(x-x0)+… f(x)≈f(x0)+?f(x)(x-x0) 所以如果x-x_0和?f(x)的方向相反,那么相同距离的移动,f(x)的减小最大。所以梯度下降法的核心步骤就是 xk+1=xk-a?f(x) 其中,a是步长,可以通过精准线性查找或非精准线性查找确定。3. 最速下降法最速下降法在选取x的变化方向时与梯度下降法有细微的差别。 △nsd=argminv(?f(x)Tv∣∥v∥&=1) △nsd表示下降最快的方位方向(normalized sleepest descent direction)。4. 差异看到这里,可能觉得最速下降的方向和梯度下降法的方向并没有差别,都是移动单位步长,下降最多的方向。而差别就在单位步长这里,如果△nsd=argminv(?f(x)Tv∣∥v∥&=1)中∥v∥是欧式范数,那么最速下降法就是梯度下降法,也就是说梯度下降法是最速下降法使用欧式范数的特殊情况。5. 为什么会有不用欧式范数的情况原因其实很简单,因为使用欧式范数的最速下降法(也就是梯度下降法)得到下降方向并非永远都是下降最快的方向。读到这里,你可能有些吃惊,可能会问,难道梯度的反方向是下降最快的方向吗?如果你有这样的疑问和思考,那么恭喜你,你对梯度有着一定的理解。 然而实际情况是这样的:梯度是变化的,而梯度下降在一次迭代的过程中假设梯度是固定不变的,所谓的梯度方向只是起始点(xk)的梯度方向,并不一定是起始点和终点之间其他点的梯度方向(axk+(1-a)xk+1,0&a&=1),所以梯度方向不一定是下降最快的方向,所以为了得到更快的下降方向,我们有时并不适用欧式范数。 图片来自Stephen Boyd的凸优化。6. 什么时候会不用欧式范数?我们知道梯度是函数对每个因子求偏导得到的列向量,表示着函数的变化趋势, ?f(x)=(?f?x1,?f?x2,…,?f?xn)(如果你是一名程序员,你也可选择从0开始编号),向量中元素的相对大小决定了梯度的方向。我们前面提到,梯度下降的方向不是最快的方向的原因正是由于梯度方向的变化,那的梯度的方向变化由什么来决定呢? 提到梯度的变化,很自然的想到了函数的二阶导数,对于多变量函数,也就是函数的Hessian矩阵。 H= ∣∣∣∣∣∣∣∣∣?2f?x1?x1 ?2f?x2?x1 ? ?2f?xn?x1?2f?x1?x2?2f?x2?x2??2f?xn?x2……?…?2f?x1?xn?2f?x2?xn?2f?xn?xn∣∣∣∣∣∣∣∣∣ 这里首先讨论一个简单的情况,就是f(x)的各个变量相互独立,此时Hessian矩阵是一个对角阵, ∣∣∣∣∣∣∣∣∣?2f?x1?x1
?2f?x2?x2??2f?xn?xn∣∣∣∣∣∣∣∣∣ 如果?2f?xi?xii=1,2...n相差不多,也就是f(x)梯度在各个方向的变化基本一致,那么梯度方向基本不会发生变化,此时梯度下降法会得到很好的结果,想法如果?2f?xi?xii=1,2...n相差很大,那么梯度方向变化就会较大,当然梯度下降的方向便不再是最好的方向。 如果,Hessian矩阵不是对角阵,那么我们需要求出矩阵的特征值,最大特征值和最小的特征值之比(这个值叫做condition number)如果不大,则梯度下降法会有很好的效果。6. 不用欧式范数用什么范数?使用Hessian范数,牛顿法正是使用Hessian范数的最速下降法,所以牛顿法会比梯度下降法收敛更快! hessian 范数为 ∥x∥?2f(x)=xT?2f(x)x,此处不再展开。 (求解△nsd=argminv(?f(x)Tv∣∥v∥&=1) 便会得到△nsd=H-1?f(x))
没有更多推荐了,关于 动量梯度下降 与 特征缩放 的疑问? - 知乎有问题,上知乎。知乎作为中文互联网最大的知识分享平台,以「知识连接一切」为愿景,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。1被浏览216分享邀请回答暂时还没有回答,开始写第一个回答Posts - 50,
Articles - 0,
Comments - 312
不为繁华易素心
21:09 by Sinte-Beuve, ... 阅读,
接着上文——往下讲。这次我们主要用matlab来实现更一般化的梯度下降法。由上文中的几个变量到多个变量。改变算法的思路,使用矩阵来进行计算。同时对算法的优化和调参进行总结。即特征缩放(feature scaling)问题和学习速率\(\alpha\)的取值问题。还有在拟合线性模型时,如何选择正确的算法,梯度下降 or 最小二乘法?
matlab的基本用法,已经总结在上。相对于python来说,的确matlab的语法更简单,上手更快,只要简单学习下就能上手编写算法,或者用于计算。
matlab实现一般梯度下降法
针对于Andrew Ng的machine learning课当中的数据,我们这里给出了matlab的一般梯度下降法的代码。
在了解了算法原理后,实现起来就非常简单了,主要分为以下几步:
数据加载和预处理
从文件中读入数据,并分块放到相应的矩阵中去。这里我们选取的模型是\(y = \theta_0+\theta_1x_1\)。显然\(x_0\)取1,所以需要在原有的X矩阵中添加一列全1的列。
data = load ('data1.txt');
X = data(:, 1);
y = data(:, 2);
X = [ones(length(data),1),data(:,1)];
设置算法的学习参数
X = [ones(length(data),1),data(:,1)];
theta = zeros(2,1);%theta初始值为0
alpha = 0.01;
max_iter = 5000;
m = length(y);%数据组数
J_history = zeros(max_iter,1);%初始化迭代误差变量
执行算法。
for iter = 1:max_iter
theta = theta - alpha / m * X' * (X * theta - y);
J_history(iter) = sum((X * theta-y) .^ 2) / (2*m);
%记录每次 迭代后的全局误差
fprintf('iter:%d ------ Error:%f\n',iter,J_history(iter));
下面是完整的代码:
%加载数据和数据预处理
data = load ('data1.txt');
fprintf('Running Gradient Descent ...\n');
X = data(:, 1);
y = data(:, 2);
%画出数据的散点图
plot(X, y, 'rx', 'MarkerSize', 10);
ylabel('Profit in $10,000s');
xlabel('Population of City in 10,000s');
%设置学习参数
X = [ones(length(data),1),data(:,1)];
% y = theta0*x0 + theta1*x1 默认x0为1
theta = zeros(2,1); %theta初始值为0
alpha = 0.01;
max_iter = 5000;
m = length(y);
J_history = zeros(max_iter,1);
%初始化迭代误差变量
for iter = 1:max_iter
%每迭代100次画一条曲线
mod(iter,100) == 0
plot(X(:,2), X*theta, 'g')
theta = theta - alpha / m * X' * (X * theta - y);
J_history(iter) = sum((X * theta-y) .^ 2) / (2*m);
%记录每次迭代后的全局误差
fprintf('iter:%d ------ Error:%f\n',iter,J_history(iter));
%输出最终的theta值和最终的拟合曲线
disp('Theta found by gradient descent:');
disp(theta);
plot(X(:,2), X*theta, 'k')
legend('Training data', 'Linear regression')
运行结果如下:
图1为得到的结果,可以看到在现有的学习速率下,基本上4600次左右就能收敛了。得出了最终的\(\theta\)值。
图2为拟合的过程,每迭代100次会画出一条绿色曲线,不断迭代最终收敛的曲线是黑色的那条,可以清楚看见拟合的过程。
特征缩放和数据的归一化
下图为上例中的数据部分,可以看到第一列和第二列的数据差距并不大,所以不需要很多的迭代次数就能收敛。但是如果数据之间差距很大,在计算过程中会导致数据超出数据类型的最大存储值,或者是需要额外的迭代次数来到达收敛的情况,所以此时我们对数据进行处理,也就是所说的特征缩放。
数据归一化
数据归一化是非常有用的特征缩放方法,可以把数据缩放到\([-1,1]\)中。常见的归一化方法有两种。
min-max标准化(Min-Max Normalization)
可以使数据进行线性变换,使结果值映射到\([0,1]\)之间。设原区间为\([a,b]\),转换函数如下:
x^* = \frac{x-a}{b-a}
Z-score标准化方法(Z-socre Normalization)
这种方法给予原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1,转化函数为:
x^* = \frac{x-\mu}{\sigma}
其中\(\mu\)为数据的均值,\(\sigma\)为数据的标准差。
matlab来处理数据归一化问题
新的数据集如下,显然,不同的特征之前的差距比较大,此时就需要进行归一化处理。
数据归一化
%Z-score Normalization
function [ X_norm,avg,sigma ] = normalize(X)
avg = mean(X,1); %均值
sigma = std(X,1);%标准差
%repmat函数用来数据填充
= (X - repmat(avg,size(X,1),1)) ./
repmat(sigma,size(X,1),1);
测试样本需要进行归一化。
% 使用1 1650 3对数据进行估计
x = [1650 3];
price = [1 (([1650 3] - avg) ./ sigma)] *
学习速率的取值
可以看到学习速率太小,需要进行多次迭代才能收敛;学习速率太大,可能会miss最小值儿无法收敛。因此我们需要选取合适的学习速率Andrew Ng已经告诉我们方法,如图所示,选择学习速率的区间,不断地去调整以满足自己的数据和算法。说到底机器学习就是个调参的过程,啊哈哈~~
梯度下降法VS最小二乘法
对于线性回归问题,我们既可以用梯度下降法也可以用最小二乘法来解决。那么这两种算法有和不同?简而言之,前者是需要多次迭代来收敛到全局最小值,后者则是提供一种解析解法,直接一次性求得\(\theta\)的最优值。
对于最小二乘法,我们这里只给出具体的结论。证明牵涉到矩阵的求导,可以直接看西瓜书。
那么,当\(X^TX\)为满秩矩阵或正定矩阵时,我们可以一步得到\(\theta\)的最优值。
\theta = (X^TX)^{-1}X^Ty
而在matlab中,最小二乘法的求解过程也的确只需要一行代码就可以完成。把下面的代码替换掉梯度下降的代码即可。
theta = pinv( X' * X ) * X' *
How to choose?
梯度下降法
需要设置学习速率。
需要进行多次迭代。
数据比较大时(百万?),可以很好的工作。
最小二乘法
不需要设置学习速率。
不需要迭代。
需要矩阵计算,数据大时,计算速度慢。特征缩放 - 简书
1、什么是特征缩放
特征缩放的目的是将所有数字数据放在一个数量级上。
2、特征缩放对于欧式距离、决策树收敛的重要性
特征缩放与欧式距离.png
机器学习的目的是分析数据间的关系,欧式距离是数据间一个重要的关系,如果研究对象的两组特征数据不在一个数量级上,那么其中一个特征对于欧式距离这个参数的影响会占据主要位置。
数据缩放有利于决策树的收敛速度。
3、标准特征缩放与常规化特征缩放
特征缩放的两种形式.png
标准特征缩放后的数据平均值为0,标准差为1。
常规化特征缩放后的数据在0到1之间。
4、Python实现特征缩放
Python中实现标准化特征缩放.png
Python特征缩放的基本步骤就是类实例化,然后进行数据拟合以及转化,注意这里对训练集进行过一次拟合操作,就不对测试集进行拟合了,直接转化就行,因为不需要对测试集再进行一次求平均值与方差的操作。
对于虚拟数据本身就在0和1之间,但对训练的影响是因人而异的,所以最好也进行数据缩放。
对于因变量,由于其本身表现的是分类信息,不需要数据缩放;如果是拟合模型,因变量表示的是数字信息,则进行数据缩放的效果因人而异。注意这里的因人而异是指数据缩放对建模的效率与结果可能产生影响,也可能没影响,最好缩放,但对于明确表示分类信息的因变量可以不进行缩放。
from sklearn.preprocessing import StandardScaler
sc_X=StandardScaler()
X_train=sc_X.fit_transform(X_train)
X_test=sc_X.transform(X_test)
5、R实现特征缩放
R中特征缩放代码.png
R中特征缩放结果.png
R区别于Python的特征是由一类的数据类型叫分类因子,它是进行数据分类后的数据类型,而特征缩放只针对数值型数据(numerical)。
training_set[,2:3]=scale(training_set[,2:3])
test_set[,2:3]=scale(test_set[,2:3])
在获取样本时,样本的取值范围过大的时候,如果数据未处理的话,在应用梯度下降算法寻找全局最小值的时候,代价函数需要花费巨大的代价。当对特征进行缩放的时候,减小样本的变化范围,特征缩放有时能提高算法的收敛速度,代价函数花费代价更少,计算更快。 一般的: 将特征值约束在-1《 x...
首页 资讯 文章 资源 小组 相亲 登录 注册 首页 最新文章 IT 职场 前端 后端 移动端 数据库 运维 其他技术 - 导航条 -首页最新文章IT 职场前端- JavaScript- HTML5- CSS后端- Python- Java- C/C++- PHP- .NE...
pdf下载地址:Java面试宝典 第一章内容介绍 20 第二章JavaSE基础 21 一、Java面向对象 21 1. 面向对象都有哪些特性以及你对这些特性的理解 21 2. 访问权限修饰符public、private、protected, 以及不写(默认)时的区别(201...
文章作者:Tyan博客:noahsnail.com | CSDN | 简书 声明:作者翻译论文仅为学习,如有侵权请联系作者删除博文,谢谢! 翻译论文汇总:https://github.com/SnailTyan/deep-learning-papers-translatio...
声明:作者翻译论文仅为学习,如有侵权请联系作者删除博文,谢谢! 翻译论文汇总:https://github.com/SnailTyan/deep-learning-papers-translation ImageNet Classification with Deep Co...
有一句老话道“好事不出门,坏事传千里”,虽然这句话用到这里不是那么合时宜,但是也最能表达“熬夜”这个词语,不知从几何起,“熬夜”渐渐开始风行,熬夜的人也渐渐增多,一股“熬夜”风一直久居不下。今年的诺贝尔生理奖奖颁布给美国科学家杰弗里霍尔、迈克尔罗斯巴什、迈克尔杨。而他们获奖...
(1) 很多时候都会陷入困顿当中,很想有个人可以来陪我说会儿话,哪怕他不吭一言,只是坐在我身边,也能给我一些慰藉,让我觉得感激。但遗憾的是,身边的人好像都没有想参与你人生的欲望,他们在各自的生活中兜转,被琐碎之事缠身,抽不出任何时间赶到你身边,给你陪伴。所有人都把你当成了倾...
周末回家,硕硕告诉爷爷,昨天他们姐弟三个都挨批了。
原因始于我班四个没交作业的孩子。一个女生理由是不知道让写作文,关键是我在快要下课时郑重说了作文要求;班级第一名周晨鹏把作业忘家里;另外两个女生也说作业忘家里了,当我说要给家长电话的时候,她俩承认自己没完成作...
最初在简书写东西的时候,我只是一个人安安静静地写,谁也没告诉。有一阵子,偶尔贴一个链接到QQ空间,后来想了想,就果断放弃了。 上次看到简书作者@纯银V的一段微博: 反思了一下自己,我大概也是属于那种很有「分享欲」的人。小时候主要是和妹妹分享,后来慢慢地开始和同学分享。那时候...
躺在床上,我发现,我内心深处根根本没有所谓的力量,既没有大量回忆之前的事情,也对未来没有任何展望,就包括我最喜欢的旅行拍照发图写字一条龙,也没有让我提起兴趣。只有一天我特别想回四川,想立刻回去吃离家一公里的那家四块钱的米凉粉。
人很颓丧,但是依旧要面...计算机科学并不仅仅关于计算机,就像天文学并不仅仅关于望远镜。
梯度下降实用技巧I之特征缩放 Gradient Descent in practice I - feature scaling
梯度下降实用技巧I之特征缩放 Gradient Descent in practice I - feature scaling
当多个特征的范围差距过大时,代价函数的轮廓图会非常的偏斜,如下图左所示,这会导致梯度下降函数收敛的非常慢。因此需要特征缩放(feature scaling)来解决这个问题,特征缩放的目的是把特征的范围缩放到接近的范围。当把特征的范围缩放到接近的范围,就会使偏斜的不那么严重。通过代价函数执行梯度下降算法时速度回加快,更快的收敛。如下图右所示。
特征缩放的范围:一般把特征的范围缩放到-1到1,和这接近就行,没必要同一范围。梯度下降就能很好的工作。如下图所示,x1 的范围为0到3,x2的范围为-2到0.5都是可以的。但不能相差的很大,-100到100则是不可以的。
特征缩放的方法:直接先看图再解释,主要是均值归一化
一般的均值归一化公式为: ,其中为均值,s为特征的范围,即max-min。也可以用标准差。
其实归一化主要有两种方法:
第一种是min-max标准化(Min-Max Normalization)它把原始数据映射到[0-1]之间,公式为:
第二种是0均值标准化(z-score标准化)公式为:
其中,为均值,标准差。标准差是方差的开方,把标注差公式也贴上来吧:
这两种归一化方法的适用场景为:
在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,第二种方法(Z-score standardization)表现更好。
没有更多推荐了,

我要回帖

更多关于 梯度直方图特征 的文章

 

随机推荐