最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年02月24日 16:39:45   作者:epleone  
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)梯度下降算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了python實(shí)現(xiàn)梯度下降算法的具體代碼,供大家參考,具體內(nèi)容如下

簡(jiǎn)介

本文使用python實(shí)現(xiàn)了梯度下降算法,支持y = Wx+b的線性回歸
目前支持批量梯度算法和隨機(jī)梯度下降算法(bs=1)
也支持輸入特征向量的x維度小于3的圖像可視化
代碼要求python版本>3.4

代碼

'''
梯度下降算法
Batch Gradient Descent
Stochastic Gradient Descent SGD
'''
__author__ = 'epleone'
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import 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

 pass


if __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("===================\n\n")
 # gd.EPS = 0.0
 gd.plotFunc()
 gd(10, 0.01)
 print("Finished!")

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python面向?qū)ο笾惖睦^承詳解

    python面向?qū)ο笾惖睦^承詳解

    這篇文章主要介紹了python面向?qū)ο笾惖睦^承詳解,通過概述定義講解了類的繼承的功能和創(chuàng)建方式,寫出了代碼實(shí)例供參考,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Python實(shí)現(xiàn)雙進(jìn)程防止單點(diǎn)故障實(shí)例深度探究

    Python實(shí)現(xiàn)雙進(jìn)程防止單點(diǎn)故障實(shí)例深度探究

    在分布式系統(tǒng)中,確保系統(tǒng)的高可用性是至關(guān)重要的,本文將深入探討如何使用Python實(shí)現(xiàn)雙進(jìn)程自我保護(hù)機(jī)制,以應(yīng)對(duì)單點(diǎn)故障,確保系統(tǒng)穩(wěn)定運(yùn)行,將通過詳實(shí)的示例代碼,介紹雙進(jìn)程自我保護(hù)的原理、實(shí)現(xiàn)步驟以及可能遇到的挑戰(zhàn)
    2024-01-01
  • Numpy將二維數(shù)組添加到空數(shù)組的實(shí)現(xiàn)

    Numpy將二維數(shù)組添加到空數(shù)組的實(shí)現(xiàn)

    今天小編就為大家分享一篇Numpy將二維數(shù)組添加到空數(shù)組的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python從單元素字典中獲取key和value的實(shí)例

    Python從單元素字典中獲取key和value的實(shí)例

    今天小編就為大家分享一篇Python從單元素字典中獲取key和value的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • 關(guān)于Python網(wǎng)絡(luò)爬蟲框架scrapy

    關(guān)于Python網(wǎng)絡(luò)爬蟲框架scrapy

    這篇文章主要介紹了關(guān)于Python網(wǎng)絡(luò)爬蟲框架scrapy,爬蟲框架是實(shí)現(xiàn)爬蟲功能的一個(gè)軟件結(jié)構(gòu)和功能組件的集合,需要的朋友可以參考下
    2023-04-04
  • jupyter notebook tensorflow打印device信息實(shí)例

    jupyter notebook tensorflow打印device信息實(shí)例

    這篇文章主要介紹了jupyter notebook tensorflow打印device信息實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 使用python itchat包爬取微信好友頭像形成矩形頭像集的方法

    使用python itchat包爬取微信好友頭像形成矩形頭像集的方法

    今天小編就為大家分享一篇使用python itchat包爬取微信好友頭像形成矩形頭像集的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • python3.7 openpyxl 刪除指定一列或者一行的代碼

    python3.7 openpyxl 刪除指定一列或者一行的代碼

    這篇文章主要介紹了python3.7 openpyxl 刪除指定一列或者一行,文中通過代碼給大家介紹了python3 openpyxl基本操作,代碼簡(jiǎn)單易懂,需要的朋友可以參考下
    2019-10-10
  • Python如何使用Selenium WebDriver模擬用戶操作

    Python如何使用Selenium WebDriver模擬用戶操作

    這篇文章主要為大家詳細(xì)介紹了如何使用Selenium WebDriver來模擬用戶操作,以規(guī)避這些驗(yàn)證機(jī)制,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2025-04-04
  • python for和else語句趣談

    python for和else語句趣談

    這篇文章主要介紹了python for和else語句趣談,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07

最新評(píng)論

呼图壁县| 伊吾县| 兰坪| 大石桥市| 商都县| 兰考县| 阜平县| 济阳县| 洛隆县| 南汇区| 丰镇市| 石家庄市| 合阳县| 罗平县| 南溪县| 萍乡市| 马边| 昭苏县| 遂平县| 山东省| 繁峙县| 南充市| 中江县| 饶河县| 阿城市| 陇西县| 长兴县| 墨脱县| 无为县| 滦平县| 兴隆县| 兴安盟| 宜君县| 德昌县| 周宁县| 顺义区| 九龙城区| 临猗县| 荥经县| 镶黄旗| 新建县|