机器学习:随机梯度下降法

机器学习:随机梯度下降法1.梯度下降  1)什么是梯度下降?      因为梯度下降是一种思想,没有严格的定义,所以用一个比喻来解释什么是梯度下降。         简单来说,梯度下降就是从山顶找一条最短的路走到山脚最低的地方。但是因为选择方向的原因,我们找到的的最低点可能不是真正的最低点。如图所示,黑线标注的路线所指的方向并不是真正的地方。    既然是选择一个方向下山,那么这个方向怎么选…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

1.梯度下降

   1)什么是梯度下降?

         因为梯度下降是一种思想,没有严格的定义,所以用一个比喻来解释什么是梯度下降。

        机器学习:随机梯度下降法

        简单来说,梯度下降就是从山顶找一条最短的路走到山脚最低的地方。但是因为选择方向的原因,我们找到的的最低点可能不是真正的最低点。如图所示,黑线标注的路线所指的方向并不是真正的地方。

        既然是选择一个方向下山,那么这个方向怎么选?每次该怎么走?

       先说选方向,在算法中是以随机方式给出的,这也是造成有时候走不到真正最低点的原因。

       如果选定了方向,以后每走一步,都是选择最陡的方向,直到最低点。

       总结起来就一句话:随机选择一个方向,然后每次迈步都选择最陡的方向,直到这个方向上能达到的最低点。

      2)梯度下降是用来做什么的?

       在机器学习算法中,有时候需要对原始的模型构建损失函数,然后通过优化算法对损失函数进行优化,以便寻找到最优的参数,使得损失函数的值最小。而在求解机器学习参数的优化算法中,使用较多的就是基于梯度下降的优化算法(Gradient Descent, GD)。

     3)优缺点

          优点:效率。在梯度下降法的求解过程中,只需求解损失函数的一阶导数,计算的代价比较小,可以在很多大规模数据集上应用

          缺点:求解的是局部最优值,即由于方向选择的问题,得到的结果不一定是全局最优

                     步长选择,过小使得函数收敛速度慢,过大又容易找不到最优解。

 

2.梯度下降的变形形式

         根据处理的训练数据的不同,主要有以下三种形式:

       1)批量梯度下降法BGD(Batch Gradient Descent):

             针对的是整个数据集,通过对所有的样本的计算来求解梯度的方向。

             优点:全局最优解;易于并行实现;

             缺点:当样本数据很多时,计算量开销大,计算速度慢

        2)小批量梯度下降法MBGD(mini-batch Gradient Descent)

            把数据分为若干个批,按批来更新参数,这样,一个批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性

            优点:减少了计算的开销量,降低了随机性

         3)随机梯度下降法SGD(stochastic gradient descent)

            每个数据都计算算一下损失函数,然后求梯度更新参数。

            优点:计算速度快

            缺点:收敛性能不好

        总结:SGD可以看作是MBGD的一个特例,及batch_size=1的情况。在深度学习及机器学习中,基本上都是使用的MBGD算法。

 

3.随机梯度下降

       随机梯度下降(SGD)是一种简单但非常有效的方法,多用用于支持向量机、逻辑回归等凸损失函数下的线性分类器的学习。并且SGD已成功应用于文本分类和自然语言处理中经常遇到的大规模和稀疏机器学习问题。

       SGD既可以用于分类计算,也可以用于回归计算。

    1)分类

        a)核心函数

            sklearn.linear_model.SGDClassifier

       b)主要参数(详细参数

            loss :指定损失函数。可选值:‘hinge’(默认), ‘log’, ‘modified_huber’, ‘squared_hinge’, ‘perceptron’,

                       “hinge”:线性SVM
                       “log”:逻辑回归
                       “modified_huber”:平滑损失,基于异常值容忍和概率估计
                       “squared_hinge”: 带有二次惩罚的线性SVM
                       “perceptron”:带有线性损失的感知器

             alpha:惩罚系数

        c)示例代码及详细解释

机器学习:随机梯度下降法

复制代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import SGDClassifier
from sklearn.datasets.samples_generator import make_blobs

##生产数据
X, Y = make_blobs(n_samples=50, centers=2, random_state=0, cluster_std=0.60)

##训练数据
clf = SGDClassifier(loss="hinge", alpha=0.01)
clf.fit(X, Y)

## 绘图
xx = np.linspace(-1, 5, 10)
yy = np.linspace(-1, 5, 10)

##生成二维矩阵
X1, X2 = np.meshgrid(xx, yy)
##生产一个与X1相同形状的矩阵
Z = np.empty(X1.shape)
##np.ndenumerate 返回矩阵中每个数的值及其索引
for (i, j), val in np.ndenumerate(X1):
    x1 = val
    x2 = X2[i, j]
    p = clf.decision_function([[x1, x2]]) ##样本到超平面的距离
    Z[i, j] = p[0]
levels = [-1.0, 0.0, 1.0]
linestyles = ['dashed', 'solid', 'dashed']
colors = 'k'
##绘制等高线:Z分别等于levels
plt.contour(X1, X2, Z, levels, colors=colors, linestyles=linestyles)
##画数据点
plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired,
            edgecolor='black', s=20)
plt.axis('tight')
plt.show()
复制代码

         d)结果图

        机器学习:随机梯度下降法

 

   2)回归

         SGDRegressor非常适合回归问题具有大量训练样本(> 10000),对于其他的问题,建议使用的Ridge, Lasso或ElasticNet。

        a)核心函数

             sklearn.linear_model.SGDRegressor

        b)主要参数(详细参数

             loss:指定损失函数。可选值‘squared_loss’(默认), ‘huber’, ‘epsilon_insensitive’,  ‘squared_epsilon_insensitive’

                     说明:此参数的翻译不是特别准确,请参考官方文档。

                    “squared_loss”:采用普通最小二乘法
                    “huber”: 使用改进的普通最小二乘法,修正异常值
                    “epsilon_insensitive”: 忽略小于epsilon的错误
                    “squared_epsilon_insensitive”:

             alpha:惩罚系数

         c)示例代码

              因为使用方式与其他线性回归方式类似,所以这里只举个简单的例子: 

机器学习:随机梯度下降法

复制代码
import numpy as np
from sklearn import linear_model
n_samples, n_features = 10, 5
np.random.seed(0)
y = np.random.randn(n_samples)
X = np.random.randn(n_samples, n_features)
clf = linear_model.SGDRegressor()
clf.fit(X, y)
复制代码

Reference:

http://www.cnblogs.com/lc1217/p/7085034.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195052.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 稀疏矩阵的十字链表存储的思路

    稀疏矩阵的十字链表存储的思路刚才终于完完全全、彻彻底底的搞明白了稀疏矩阵十字链表的存储方式的实现与该算法的思想。我觉得有必要把自己的思路记下来,一呢等自己将来忘记了可以回过头来看,二呢希望与我一样对该存储方式迷惑的朋友可以通过我的文章得到一点点的启示。现在进入正题。       我们知道稀疏矩阵的三元组

    2022年6月18日
    27
  • 上传文件块client实现

    上传文件块client实现

    2022年1月7日
    50
  • Python实现性能自动化测试竟然如此简单[通俗易懂]

    Python实现性能自动化测试竟然如此简单[通俗易懂]一、思考❓❔1.什么是性能自动化测试?性能系统负载能力超负荷运行下的稳定性系统瓶颈自动化测试使用程序代替手工提升测试效率性能自动化使用代码模拟大批量用户让用户并发请求多页面多用

    2022年7月5日
    27
  • java高并发详解

    java高并发详解转载地址:https://www.cnblogs.com/lr393993507/p/5909804.html  对于开发的网站,如果网站的访问量非常大,那么我们应该考虑相关的、并发访问问题,并发是绝大部分程序员头疼的问题;为了更好的理解并发和同步,先明白两个重要的概念:异步和同步; 1、同步和异…

    2022年5月19日
    31
  • phpstudy搭建网站并实现外网访问[通俗易懂]

    phpstudy搭建网站并实现外网访问[通俗易懂]最近服务器被黑客攻击,挂了,只能重装系统,还好网站都在本地有备份.于是又苦逼的搭建服务器吧,这里我没有使用iis的服务器而是用了Apache服务器,并用的phpstudy集成.搭建玩ftp,网站上传完,在本地设置完域名信息,但是在外网始终无法访问,ps:域名之前就已经设置完解析的.然后一通百度,都是简单的介绍并没有解决问题.于是考虑到可能是防火墙的原因.结果发现防火墙,…

    2022年5月24日
    269
  • JAVA打印数组的四种方法

    JAVA打印数组的四种方法JAVA打印数组的四种方法探究无聊看模块Integer.java源码时(IDEA中鼠标悬浮在Integer上按ctrl+alt可以转到类源码),因为刚学java,想尝试着仿照python的方法打印数组:finalint[]arr1={1,2,3,4,5};System.out.println(arr1);只打印出了地址:于是上网搜了下打印数组内容的正确方法,整理如下:1.循环打印数组String[]arr2={“dashi”,”baiqun”,”wangxiang”

    2022年4月29日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号