Python 梯度下降法
生活随笔
收集整理的這篇文章主要介紹了
Python 梯度下降法
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目描述:
自定義一個(gè)可微并且存在最小值的一元函數(shù),用梯度下降法求其最小值。并繪制出學(xué)習(xí)率從0.1到0.9(步長(zhǎng)0.1)時(shí),達(dá)到最小值時(shí)所迭代的次數(shù)的關(guān)系曲線,根據(jù)該曲線給出簡(jiǎn)單的分析。
代碼:
# -*- coding: utf-8 -*- ''' 遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書(shū)! ''' import numpy as np import matplotlib.pyplot as plt plot_x=np.linspace(-1,6,150) #在-1到6之間等距的生成150個(gè)數(shù) plot_y=(plot_x-2.5)**2+3 # 同時(shí)根據(jù)plot_x來(lái)生成plot_y(y=(x-2.5)2+3)plt.plot(plot_x,plot_y) plt.show()###定義一個(gè)求二次函數(shù)導(dǎo)數(shù)的函數(shù)dJ def dJ(x):return 2*(x-2.5)###定義一個(gè)求函數(shù)值的函數(shù)J def J(x):try:return (x-2.5)**2+3except:return float('inf')x=0.0 #隨機(jī)選取一個(gè)起始點(diǎn) eta=0.1 #eta是學(xué)習(xí)率,用來(lái)控制步長(zhǎng)的大小 epsilon=1e-8 #用來(lái)判斷是否到達(dá)二次函數(shù)的最小值點(diǎn)的條件 history_x=[x] #用來(lái)記錄使用梯度下降法走過(guò)的點(diǎn)的X坐標(biāo) count=0 min=0 while True:gradient=dJ(x) #梯度(導(dǎo)數(shù))last_x=xx=x-eta*gradienthistory_x.append(x)count=count+1if (abs(J(last_x)-J(x)) <epsilon): #用來(lái)判斷是否逼近最低點(diǎn)min=xbreakplt.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)) #打印到達(dá)最低點(diǎn)時(shí)y的值 print'count =',(count)sum_eta=[] result=[] for i in range(1,10,1):x=0.0 #隨機(jī)選取一個(gè)起始點(diǎn)eta=i*0.1sum_eta.append(eta)epsilon=1e-8 #用來(lái)判斷是否到達(dá)二次函數(shù)的最小值點(diǎn)的條件num=0min=0while True:gradient=dJ(x) #梯度(導(dǎo)數(shù))last_x=xx=x-eta*gradientnum=num+1if (abs(J(last_x)-J(x)) <epsilon): #用來(lái)判斷是否逼近最低點(diǎn)min=xbreakresult.append(num)#記錄學(xué)習(xí)率從0.1到0.9(步長(zhǎng)0.1)時(shí),達(dá)到最小值時(shí)所迭代的次數(shù)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)運(yùn)行結(jié)果:
結(jié)果分析:
函數(shù)y=(x-2.5)2+3從學(xué)習(xí)率和迭代次數(shù)的關(guān)系圖上我們可以知道當(dāng)學(xué)習(xí)率較低時(shí)迭代次數(shù)較多,隨著學(xué)習(xí)率的增大,迭代次數(shù)開(kāi)始逐漸減少,當(dāng)學(xué)習(xí)率為0.5時(shí)迭代次數(shù)最少,之后隨著學(xué)習(xí)率的增加,迭代次數(shù)開(kāi)始增加,當(dāng)學(xué)習(xí)率為0.9時(shí)迭代次數(shù)和0.1時(shí)相等。關(guān)于0.5成對(duì)稱(chēng)分布。
總結(jié)
以上是生活随笔為你收集整理的Python 梯度下降法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python-jsonpath使用和js
- 下一篇: Python的位置参数、默认参数、关键字