欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python 梯度下降法

系統 2173 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條評論
主站蜘蛛池模板: 午夜免费视频观看 | 国产一区二区三区免费 | 免费中文字幕 | 日本高清中文字幕一区二区三区 | 国产成人一区二区三区 | 久久久久国产精品免费免费搜索 | 久久er热在这里只有精品85 | 新超碰97 | 精品欧美一区二区在线观看欧美熟 | 欧美成人精品一区二区男人看 | 老版亮剑50集免费观看 | 国产精品亚洲视频 | xifan在线a精品一区二区视频网站 | 国产日韩欧美三级 | 亚洲精品在线播放视频 | 久久精品国产99久久6动漫亮点 | 亚洲精品久久久一二三区 | 热99re久久精品2久久久 | 高清性做爰免费无遮挡网站 | 久草国产电影 | 欧美一级免费 | 91看片淫黄大片一级在线观看 | 一级黄色片在线 | 91网页在线观看 | 99re99| 精品久久香蕉国产线看观看亚洲 | 激情插插插 | 国产男女爽爽爽免费视频 | 色客成人网 | 欧美第一视频 | 日韩一区二区在线观看视频 | 成人伊人 | 色综合久久精品中文字幕首页 | 国产免费播放一区二区 | 久久精品久久久久电影 | 天天色天天射天天操 | 亚洲区视频| 日本精品久久久久久久久免费 | 日韩欧美一区二区三区不卡在线 | 久草在线观看福利视频 | 久久精品视香蕉蕉er大臿蕉 |