电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

python實(shí)現(xiàn)梯度下降算法的實(shí)例詳解

瀏覽:15日期:2022-07-14 08:05:00

python版本選擇

這里選的python版本是2.7,因?yàn)槲抑坝胮ython3試了幾次,發(fā)現(xiàn)在畫3d圖的時(shí)候會(huì)報(bào)錯(cuò),所以改用了2.7。

數(shù)據(jù)集選擇

數(shù)據(jù)集我選了一個(gè)包含兩個(gè)變量,三個(gè)參數(shù)的數(shù)據(jù)集,這樣可以畫出3d圖形對(duì)結(jié)果進(jìn)行驗(yàn)證。

部分函數(shù)總結(jié)

symbols()函數(shù):首先要安裝sympy庫才可以使用。用法:

>>> x1 = symbols(’x2’)>>> x1 + 1x2 + 1

在這個(gè)例子中,x1和x2是不一樣的,x2代表的是一個(gè)函數(shù)的變量,而x1代表的是python中的一個(gè)變量,它可以表示函數(shù)的變量,也可以表示其他的任何量,它替代x2進(jìn)行函數(shù)的計(jì)算。實(shí)際使用的時(shí)候我們可以將x1,x2都命名為x,但是我們要知道他們倆的區(qū)別。再看看這個(gè)例子:

>>> x = symbols(’x’)>>> expr = x + 1>>> x = 2>>> print(expr)x + 1

作為python變量的x被2這個(gè)數(shù)值覆蓋了,所以它現(xiàn)在不再表示函數(shù)變量x,而expr依然是函數(shù)變量x+1的別名,所以結(jié)果依然是x+1。subs()函數(shù):既然普通的方法無法為函數(shù)變量賦值,那就肯定有函數(shù)來實(shí)現(xiàn)這個(gè)功能,用法:

>>> (1 + x*y).subs(x, pi)#一個(gè)參數(shù)時(shí)的用法pi*y + 1>>> (1 + x*y).subs({x:pi, y:2})#多個(gè)參數(shù)時(shí)的用法1 + 2*pi

diff()函數(shù):求偏導(dǎo)數(shù),用法:result=diff(fun,x),這個(gè)就是求fun函數(shù)對(duì)x變量的偏導(dǎo)數(shù),結(jié)果result也是一個(gè)變量,需要賦值才能得到準(zhǔn)確結(jié)果。

代碼實(shí)現(xiàn):

from __future__ import divisionfrom sympy import symbols, diff, expandimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Ddata = {’x1’: [100, 50, 100, 100, 50, 80, 75, 65, 90, 90],’x2’: [4, 3, 4, 2, 2, 2, 3, 4, 3, 2],’y’: [9.3, 4.8, 8.9, 6.5, 4.2, 6.2, 7.4, 6.0, 7.6, 6.1]}#初始化數(shù)據(jù)集theta0, theta1, theta2 = symbols(’theta0 theta1 theta2’, real=True) # y=theta0+theta1*x1+theta2*x2,定義參數(shù)costfuc = 0 * theta0for i in range(10): costfuc += (theta0 + theta1 * data[’x1’][i] + theta2 * data[’x2’][i] - data[’y’][i]) ** 2costfuc /= 20#初始化代價(jià)函數(shù)dtheta0 = diff(costfuc, theta0)dtheta1 = diff(costfuc, theta1)dtheta2 = diff(costfuc, theta2)rtheta0 = 1rtheta1 = 1rtheta2 = 1#為參數(shù)賦初始值costvalue = costfuc.subs({theta0: rtheta0, theta1: rtheta1, theta2: rtheta2})newcostvalue = 0#用cost的值的變化程度來判斷是否已經(jīng)到最小值了count = 0alpha = 0.0001#設(shè)置學(xué)習(xí)率,一定要設(shè)置的比較小,否則無法到達(dá)最小值while (costvalue - newcostvalue > 0.00001 or newcostvalue - costvalue > 0.00001) and count < 1000: count += 1 costvalue = newcostvalue rtheta0 = rtheta0 - alpha * dtheta0.subs({theta0: rtheta0, theta1: rtheta1, theta2: rtheta2}) rtheta1 = rtheta1 - alpha * dtheta1.subs({theta0: rtheta0, theta1: rtheta1, theta2: rtheta2}) rtheta2 = rtheta2 - alpha * dtheta2.subs({theta0: rtheta0, theta1: rtheta1, theta2: rtheta2}) newcostvalue = costfuc.subs({theta0: rtheta0, theta1: rtheta1, theta2: rtheta2})rtheta0 = round(rtheta0, 4)rtheta1 = round(rtheta1, 4)rtheta2 = round(rtheta2, 4)#給結(jié)果保留4位小數(shù),防止數(shù)值溢出print(rtheta0, rtheta1, rtheta2)fig = plt.figure()ax = Axes3D(fig)ax.scatter(data[’x1’], data[’x2’], data[’y’]) # 繪制散點(diǎn)圖xx = np.arange(20, 100, 1)yy = np.arange(1, 5, 0.05)X, Y = np.meshgrid(xx, yy)Z = X * rtheta1 + Y * rtheta2 + rtheta0ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap(’rainbow’))plt.show()#繪制3d圖進(jìn)行驗(yàn)證

結(jié)果:

python實(shí)現(xiàn)梯度下降算法的實(shí)例詳解

python實(shí)現(xiàn)梯度下降算法的實(shí)例詳解

實(shí)例擴(kuò)展:

’’’梯度下降算法Batch Gradient DescentStochastic Gradient Descent SGD’’’__author__ = ’epleone’import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dimport sys# 使用隨機(jī)數(shù)種子, 讓每次的隨機(jī)數(shù)生成相同,方便調(diào)試# np.random.seed(111111111)class GradientDescent(object): eps = 1.0e-8 max_iter = 1000000 # 暫時(shí)不需要 dim = 1 func_args = [2.1, 2.7] # [w_0, .., w_dim, b] def __init__(self, func_arg=None, N=1000): self.data_num = N if func_arg is not None: self.FuncArgs = func_arg self._getData() def _getData(self): x = 20 * (np.random.rand(self.data_num, self.dim) - 0.5) b_1 = np.ones((self.data_num, 1), dtype=np.float) # x = np.concatenate((x, b_1), axis=1) self.x = np.concatenate((x, b_1), axis=1) def func(self, x): # noise太大的話, 梯度下降法失去作用 noise = 0.01 * np.random.randn(self.data_num) + 0 w = np.array(self.func_args) # y1 = w * self.x[0, ] # 直接相乘 y = np.dot(self.x, w) # 矩陣乘法 y += noise return y @property def FuncArgs(self): return self.func_args @FuncArgs.setter def FuncArgs(self, args): if not isinstance(args, list): raise Exception( ’args is not list, it should be like [w_0, ..., w_dim, b]’) if len(args) == 0: raise Exception(’args is empty list!!’) if len(args) == 1: args.append(0.0) self.func_args = args self.dim = len(args) - 1 self._getData() @property def EPS(self): return self.eps @EPS.setter def EPS(self, value): if not isinstance(value, float) and not isinstance(value, int): raise Exception('The type of eps should be an float number') self.eps = value def plotFunc(self): # 一維畫圖 if self.dim == 1: # x = np.sort(self.x, axis=0) x = self.x y = self.func(x) fig, ax = plt.subplots() ax.plot(x, y, ’o’) ax.set(xlabel=’x ’, ylabel=’y’, title=’Loss Curve’) ax.grid() plt.show() # 二維畫圖 if self.dim == 2: # x = np.sort(self.x, axis=0) x = self.x y = self.func(x) xs = x[:, 0] ys = x[:, 1] zs = y fig = plt.figure() ax = fig.add_subplot(111, projection=’3d’) ax.scatter(xs, ys, zs, c=’r’, marker=’o’) ax.set_xlabel(’X Label’) ax.set_ylabel(’Y Label’) ax.set_zlabel(’Z Label’) plt.show() else: # plt.axis(’off’) plt.text( 0.5, 0.5, 'The dimension(x.dim > 2) n is too high to draw', size=17, rotation=0., ha='center', va='center', bbox=dict( boxstyle='round', ec=(1., 0.5, 0.5), fc=(1., 0.8, 0.8), )) plt.draw() plt.show() # print(’The dimension(x.dim > 2) is too high to draw’) # 梯度下降法只能求解凸函數(shù) def _gradient_descent(self, bs, lr, epoch): x = self.x # shuffle數(shù)據(jù)集沒有必要 # np.random.shuffle(x) y = self.func(x) w = np.ones((self.dim + 1, 1), dtype=float) for e in range(epoch): print(’epoch:’ + str(e), end=’,’) # 批量梯度下降,bs為1時(shí) 等價(jià)單樣本梯度下降 for i in range(0, self.data_num, bs): y_ = np.dot(x[i:i + bs], w) loss = y_ - y[i:i + bs].reshape(-1, 1) d = loss * x[i:i + bs] d = d.sum(axis=0) / bs d = lr * d d.shape = (-1, 1) w = w - d y_ = np.dot(self.x, w) loss_ = abs((y_ - y).sum()) print(’tLoss = ’ + str(loss_)) print(’擬合的結(jié)果為:’, end=’,’) print(sum(w.tolist(), [])) print() if loss_ < self.eps: print(’The Gradient Descent algorithm has converged!!n’) break pass def __call__(self, bs=1, lr=0.1, epoch=10): if sys.version_info < (3, 4): raise RuntimeError(’At least Python 3.4 is required’) if not isinstance(bs, int) or not isinstance(epoch, int): raise Exception( 'The type of BatchSize/Epoch should be an integer number') self._gradient_descent(bs, lr, epoch) pass passif __name__ == '__main__': if sys.version_info < (3, 4): raise RuntimeError(’At least Python 3.4 is required’) gd = GradientDescent([1.2, 1.4, 2.1, 4.5, 2.1]) # gd = GradientDescent([1.2, 1.4, 2.1]) print('要擬合的參數(shù)結(jié)果是: ') print(gd.FuncArgs) print('===================nn') # gd.EPS = 0.0 gd.plotFunc() gd(10, 0.01) print('Finished!')

到此這篇關(guān)于python實(shí)現(xiàn)梯度下降算法的實(shí)例詳解的文章就介紹到這了,更多相關(guān)教你用python實(shí)現(xiàn)梯度下降算法內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 吹塑加工_大型吹塑加工_滚塑代加工-莱力奇吹塑加工有限公司 | 四川成人高考_四川成考报名网| 上海平衡机-单面卧式动平衡机-万向节动平衡机-圈带动平衡机厂家-上海申岢动平衡机制造有限公司 | 地图标注-手机导航电子地图如何标注-房地产商场地图标记【DiTuBiaoZhu.net】 | 光泽度计_测量显微镜_苏州压力仪_苏州扭力板手维修-苏州日升精密仪器有限公司 | ?水马注水围挡_塑料注水围挡_防撞桶-常州瑞轩水马注水围挡有限公司 | 包塑丝_高铁绑丝_地暖绑丝_涂塑丝_塑料皮铁丝_河北创筹金属丝网制品有限公司 | 盘扣式脚手架-附着式升降脚手架-移动脚手架,专ye承包服务商 - 苏州安踏脚手架工程有限公司 | 动物解剖台-成蚊接触筒-标本工具箱-负压实验台-北京哲成科技有限公司 | 酒糟烘干机-豆渣烘干机-薯渣烘干机-糟渣烘干设备厂家-焦作市真节能环保设备科技有限公司 | 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | HDPE储罐_厂家-山东九州阿丽贝防腐设备 | 浙江寺庙设计-杭州寺院设计-宁波寺庙规划_汉匠 | 校车_校车价格_19座幼儿园校车_幼儿园校车_大鼻子校车 | 振动筛-交叉筛-螺旋筛-滚轴筛-正弦筛-方形摇摆筛「新乡振动筛厂家」 | 通辽信息港 - 免费发布房产、招聘、求职、二手、商铺等信息 www.tlxxg.net | 散热器-电子散热器-型材散热器-电源散热片-镇江新区宏图电子散热片厂家 | 自清洗过滤器_全自动过滤器_全自动反冲洗过滤器_量子过滤器-滑漮滴 | 小港信息港-鹤壁信息港 鹤壁老百姓便民生活信息网站 | Safety light curtain|Belt Sway Switches|Pull Rope Switch|ultrasonic flaw detector-Shandong Zhuoxin Machinery Co., Ltd | 深圳激光打标机_激光打标机_激光焊接机_激光切割机_同体激光打标机-深圳市创想激光科技有限公司 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | 金属回收_废铜废铁回收_边角料回收_废不锈钢回收_废旧电缆线回收-广东益夫金属回收公司 | 西门子代理商_西门子变频器总代理-翰粤百科 | 泰安办公家具-泰安派格办公用品有限公司 | 煤粉取样器-射油器-便携式等速飞灰取样器-连灵动 | 烘干设备-热泵烘干机_广东雄贵能源设备有限公司 | 电气控制系统集成商-PLC控制柜变频控制柜-非标自动化定制-电气控制柜成套-NIDEC CT变频器-威肯自动化控制 | 通风气楼_通风天窗_屋顶风机-山东美创通风设备有限公司 | 钢托盘,钢制托盘,立库钢托盘,金属托盘制造商_南京飞天金属制品实业有限公司 | 汽液过滤网厂家_安平县银锐丝网有限公司 | 悬浮拼装地板_篮球场木地板翻新_运动木地板价格-上海越禾运动地板厂家 | 质检报告_CE认证_FCC认证_SRRC认证_PSE认证_第三方检测机构-深圳市环测威检测技术有限公司 | 拉力机-万能试验机-材料拉伸试验机-电子拉力机-拉力试验机厂家-冲击试验机-苏州皖仪实验仪器有限公司 | 中央空调维修、中央空调保养、螺杆压缩机维修-苏州东菱空调 | 维泰克Veertek-锂电池微短路检测_锂电池腐蚀检测_锂电池漏液检测 | 沧州友城管业有限公司-内外涂塑钢管-大口径螺旋钢管-涂塑螺旋管-保温钢管生产厂家 | 洛阳网站建设_洛阳网站优化_网站建设平台_洛阳香河网络科技有限公司 | 台湾HIWIN上银直线模组|导轨滑块|TBI滚珠丝杆丝杠-深圳汉工 | ◆大型吹塑加工|吹塑加工|吹塑代加工|吹塑加工厂|吹塑设备|滚塑加工|滚塑代加工-莱力奇塑业有限公司 | 韦伯电梯有限公司 | 智慧养老_居家养老_社区养老_杰佳通 |