亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python 梯度下降法

系統 2329 0

接上篇博客

題目描述:
自定義一個可微并且存在最小值的一元函數,用梯度下降法求其最小值。并繪制出學習率從0.1到0.9(步長0.1)時,達到最小值時所迭代的次數的關系曲線,根據該曲線給出簡單的分析。

代碼:

            
              
                # -*- coding: utf-8 -*-
              
              
                """
Created on Tue Jun  4 10:19:03 2019

@author: Administrator
"""
              
              
                import
              
               numpy 
              
                as
              
               np

              
                import
              
               matplotlib
              
                .
              
              pyplot 
              
                as
              
               plt
plot_x
              
                =
              
              np
              
                .
              
              linspace
              
                (
              
              
                -
              
              
                1
              
              
                ,
              
              
                6
              
              
                ,
              
              
                150
              
              
                )
              
              
                #在-1到6之間等距的生成150個數
              
              
plot_y
              
                =
              
              
                (
              
              plot_x
              
                -
              
              
                2.5
              
              
                )
              
              
                **
              
              
                2
              
              
                +
              
              
                3
              
              
                # 同時根據plot_x來生成plot_y(y=(x-2.5)2+3)
              
              

plt
              
                .
              
              plot
              
                (
              
              plot_x
              
                ,
              
              plot_y
              
                )
              
              
plt
              
                .
              
              show
              
                (
              
              
                )
              
              
                ###定義一個求二次函數導數的函數dJ
              
              
                def
              
              
                dJ
              
              
                (
              
              x
              
                )
              
              
                :
              
              
                return
              
              
                2
              
              
                *
              
              
                (
              
              x
              
                -
              
              
                2.5
              
              
                )
              
              
                ###定義一個求函數值的函數J
              
              
                def
              
              
                J
              
              
                (
              
              x
              
                )
              
              
                :
              
              
                try
              
              
                :
              
              
                return
              
              
                (
              
              x
              
                -
              
              
                2.5
              
              
                )
              
              
                **
              
              
                2
              
              
                +
              
              
                3
              
              
                except
              
              
                :
              
              
                return
              
              
                float
              
              
                (
              
              
                'inf'
              
              
                )
              
              

x
              
                =
              
              
                0.0
              
              
                #隨機選取一個起始點
              
              
eta
              
                =
              
              
                0.1
              
              
                #eta是學習率,用來控制步長的大小
              
              
epsilon
              
                =
              
              
                1e
              
              
                -
              
              
                8
              
              
                #用來判斷是否到達二次函數的最小值點的條件
              
              
history_x
              
                =
              
              
                [
              
              x
              
                ]
              
              
                #用來記錄使用梯度下降法走過的點的X坐標
              
              
count
              
                =
              
              
                0
              
              
                min
              
              
                =
              
              
                0
              
              
                while
              
              
                True
              
              
                :
              
              
    gradient
              
                =
              
              dJ
              
                (
              
              x
              
                )
              
              
                #梯度(導數)
              
              
    last_x
              
                =
              
              x
    x
              
                =
              
              x
              
                -
              
              eta
              
                *
              
              gradient
    history_x
              
                .
              
              append
              
                (
              
              x
              
                )
              
              
    count
              
                =
              
              count
              
                +
              
              
                1
              
              
                if
              
              
                (
              
              
                abs
              
              
                (
              
              J
              
                (
              
              last_x
              
                )
              
              
                -
              
              J
              
                (
              
              x
              
                )
              
              
                )
              
              
                <
              
              epsilon
              
                )
              
              
                :
              
              
                #用來判斷是否逼近最低點
              
              
                min
              
              
                =
              
              x
        
              
                break
              
              
    
plt
              
                .
              
              plot
              
                (
              
              plot_x
              
                ,
              
              plot_y
              
                )
              
                   
plt
              
                .
              
              plot
              
                (
              
              np
              
                .
              
              array
              
                (
              
              history_x
              
                )
              
              
                ,
              
              J
              
                (
              
              np
              
                .
              
              array
              
                (
              
              history_x
              
                )
              
              
                )
              
              
                ,
              
              color
              
                =
              
              
                'r'
              
              
                ,
              
              marker
              
                =
              
              
                '*'
              
              
                )
              
              
                #繪制x的軌跡
              
              
plt
              
                .
              
              show
              
                (
              
              
                )
              
              
                print
              
              
                'min_x ='
              
              
                ,
              
              
                (
              
              
                min
              
              
                )
              
              
                print
              
              
                'min_y ='
              
              
                ,
              
              
                (
              
              J
              
                (
              
              
                min
              
              
                )
              
              
                )
              
              
                #打印到達最低點時y的值
              
              
                print
              
              
                'count ='
              
              
                ,
              
              
                (
              
              count
              
                )
              
              

sum_eta
              
                =
              
              
                [
              
              
                ]
              
              
result
              
                =
              
              
                [
              
              
                ]
              
              
                for
              
               i 
              
                in
              
              
                range
              
              
                (
              
              
                1
              
              
                ,
              
              
                10
              
              
                ,
              
              
                1
              
              
                )
              
              
                :
              
              
    x
              
                =
              
              
                0.0
              
              
                #隨機選取一個起始點
              
              
    eta
              
                =
              
              i
              
                *
              
              
                0.1
              
              
    sum_eta
              
                .
              
              append
              
                (
              
              eta
              
                )
              
              
    epsilon
              
                =
              
              
                1e
              
              
                -
              
              
                8
              
              
                #用來判斷是否到達二次函數的最小值點的條件
              
              
    num
              
                =
              
              
                0
              
              
                min
              
              
                =
              
              
                0
              
              
                while
              
              
                True
              
              
                :
              
              
        gradient
              
                =
              
              dJ
              
                (
              
              x
              
                )
              
              
                #梯度(導數)
              
              
        last_x
              
                =
              
              x
        x
              
                =
              
              x
              
                -
              
              eta
              
                *
              
              gradient
        num
              
                =
              
              num
              
                +
              
              
                1
              
              
                if
              
              
                (
              
              
                abs
              
              
                (
              
              J
              
                (
              
              last_x
              
                )
              
              
                -
              
              J
              
                (
              
              x
              
                )
              
              
                )
              
              
                <
              
              epsilon
              
                )
              
              
                :
              
              
                #用來判斷是否逼近最低點
              
              
                min
              
              
                =
              
              x
            
              
                break
              
              
    
    result
              
                .
              
              append
              
                (
              
              num
              
                )
              
              
                #記錄學習率從0.1到0.9(步長0.1)時,達到最小值時所迭代的次數
              
              

plt
              
                .
              
              scatter
              
                (
              
              sum_eta
              
                ,
              
              result
              
                ,
              
              c
              
                =
              
              
                'r'
              
              
                )
              
              
plt
              
                .
              
              plot
              
                (
              
              sum_eta
              
                ,
              
              result
              
                ,
              
              c
              
                =
              
              
                'r'
              
              
                )
              
              
plt
              
                .
              
              title
              
                (
              
              
                "relation"
              
              
                )
              
              
plt
              
                .
              
              xlabel
              
                (
              
              
                "eta"
              
              
                )
              
              
plt
              
                .
              
              ylabel
              
                (
              
              
                "count"
              
              
                )
              
              
plt
              
                .
              
              show

              
                print
              
              
                (
              
              result
              
                )
              
            
          

運行結果:
Python 梯度下降法_第1張圖片
Python 梯度下降法_第2張圖片
結果分析:
函數y=(x-2.5)2+3從學習率和迭代次數的關系圖上我們可以知道當學習率較低時迭代次數較多,隨著學習率的增大,迭代次數開始逐漸減少,當學習率為0.5時迭代次數最少,之后隨著學習率的增加,迭代次數開始增加,當學習率為0.9時迭代次數和0.1時相等。關于0.5成對稱分布。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!??!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产成人永久在线播放 | 青青青青在线成人视99 | 美女被羞羞视频网站在线 | 精品国产一区二区三区四区色 | 免费观看一级成人毛片软件 | 美女视频很黄很暴黄是免费的 | 亚洲免费在线看 | 黄色毛片毛茸茸 | 国产精品一区二区久久沈樵 | 99精品国产三级在线观看 | 老师邪恶影院a啦啦啦影院 老师在办公室被躁到白浆 老湿机午夜影院 | 日本一区二区三区久久 | 天天看片日日夜夜 | 一区二区三区欧美日韩国产 | 夜色福利视频 | 精品一区二区视频在线观看 | 一区二区国产在线播放 | 亚洲国产精品日韩在线 | 在线视频 国产交换 | 国产在线乱子伦一区二区 | 五月天久久婷婷 | 欧美人一级淫片a免费播放 欧美人与zoxxxx另类9 | 在线观看国产亚洲 | 欧美日本在线视频 | 欧洲美女啪啪 | 福利在线网站 | 一级久久 | 九九色影院 | 日韩久久久精品中文字幕 | 欧美在线观看视频 | 亚洲产在线精品第一站不卡 | 久草免费公开视频 | 尤物福利在线 | 国产一级爱c片免费播放 | 美女久久久 | 偷偷鲁影院手机在线观看 | 深夜福利剧场 | 久久99热久久精品91 | 欧美又黄又嫩大片a级 | 国产一区二区精品久 | 欧美日韩成人高清色视频 |