#?-*-?coding:utf-8?-*-
創(chuàng)新互聯(lián)2013年開創(chuàng)至今,先為信陽等服務(wù)建站,信陽等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為信陽企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
#py3
'''
用高級函數(shù)reduce()
'''
from?functools?import?reduce
lis=[1,2,3,4,5]
r=reduce(lambda?x,y:x*y,lis)#對序列l(wèi)is中元素逐項相乘lambda用法請自行度娘
print(r)
reduce把一個函數(shù)作用在一個序列[x1, x2, x3, ...]上,這個函數(shù)必須接收兩個參數(shù),reduce把結(jié)果繼續(xù)和序列的下一個元素做累積計算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
比方說對一個序列求和,就可以用reduce實現(xiàn),比如:
from?functools?import?reduce
def?add(x,y):
return?x+y
reduce(add,[1,2,3])
#結(jié)果是6
按照以下圖示,最終的神經(jīng)網(wǎng)絡(luò)調(diào)參,以最簡單的3層神經(jīng)網(wǎng)絡(luò)為例,公式如下:
? ? 怎么求這個函數(shù)的最優(yōu)解?
如果不試圖耍聰明,那么我們可以只是簡單地嘗試隨機組合權(quán)重,直到找到好的權(quán)重組合。
當陷入一個困難的問題而焦頭爛額時,這不算是一個瘋狂的想法。這種方法一般稱為暴力方法。
暴力方法的不好之處:
假設(shè)每個權(quán)重在-1和+1之間有1000種可能的值。那么對于3層、每層3個節(jié)點的神經(jīng)網(wǎng)絡(luò),可以得到18個權(quán)重,因此有18000種可能性需要測試。如果一個相對經(jīng)典的神經(jīng)網(wǎng)絡(luò),每層有500個節(jié)點,那么需要測試5億種權(quán)重的可能性。如果每組組合需要花費1秒鐘計算,那么對于一個訓練樣本,就需要花費16年更新權(quán)重!對于1000種訓練樣本,要花費16000年!? ? ? ?這就是暴力方法不切實際之處。
數(shù)學家多年來也未解決這個難題,直到20世紀60年代到70年代,這個難題才有了切實可行的求解辦法。
如何解決這樣一個明顯的難題呢?——我們必須做的第一件事是,擁抱悲觀主義。
首先,你的語法是 Python3 的語法,但是用的是 Python2;
其實,類似這種題目,借助格式化輸出會更加方便,看代碼:
# -*- encoding: gbk -*-
for row in range(1, 10):
for col in range(1, row + 1):
prod = row * col
print '%d * %d = %-2d ' % (col, row, prod),
Python定義
求余運行a % b的值處于開區(qū)間[0, b)內(nèi),如果b是負數(shù),開區(qū)間變?yōu)?b, 0]。這是一個很常見的定義方式。不過其實它依賴于整除的定義。為了讓方程式:b * (a // b) + a % b = a恒真,整除運行需要向負無窮小方向取值。比如7 // 3的結(jié)果是2,而(-7) // 3的結(jié)果卻是-3。這個算法與其它很多編程語言不一樣,需要注意,它們的整除運算會向0的方向取值。
以上內(nèi)容參考:百度百科-Python
1、編寫乘法表函數(shù)
def buildMulTable():
for i in range(1, 10):
for j in range(1, i + 1):
print('{}x{}={}\t'.format(j, i, i * j), end='')
print()
buildMulTable()
2、運行結(jié)果
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
##最小二乘法
import?numpy?as?np???##科學計算庫?
import?scipy?as?sp???##在numpy基礎(chǔ)上實現(xiàn)的部分算法庫
import?matplotlib.pyplot?as?plt??##繪圖庫
from?scipy.optimize?import?leastsq??##引入最小二乘法算法
'''
設(shè)置樣本數(shù)據(jù),真實數(shù)據(jù)需要在這里處理
'''
##樣本數(shù)據(jù)(Xi,Yi),需要轉(zhuǎn)換成數(shù)組(列表)形式
Xi=np.array([6.19,2.51,7.29,7.01,5.7,2.66,3.98,2.5,9.1,4.2])
Yi=np.array([5.25,2.83,6.41,6.71,5.1,4.23,5.05,1.98,10.5,6.3])
'''
設(shè)定擬合函數(shù)和偏差函數(shù)
函數(shù)的形狀確定過程:
1.先畫樣本圖像
2.根據(jù)樣本圖像大致形狀確定函數(shù)形式(直線、拋物線、正弦余弦等)
'''
##需要擬合的函數(shù)func?:指定函數(shù)的形狀
def?func(p,x):
k,b=p
return?k*x+b
##偏差函數(shù):x,y都是列表:這里的x,y更上面的Xi,Yi中是一一對應(yīng)的
def?error(p,x,y):
return?func(p,x)-y
'''
主要部分:附帶部分說明
1.leastsq函數(shù)的返回值tuple,第一個元素是求解結(jié)果,第二個是求解的代價值(個人理解)
2.官網(wǎng)的原話(第二個值):Value?of?the?cost?function?at?the?solution
3.實例:Para=(array([?0.61349535,??1.79409255]),?3)
4.返回值元組中第一個值的數(shù)量跟需要求解的參數(shù)的數(shù)量一致
'''
#k,b的初始值,可以任意設(shè)定,經(jīng)過幾次試驗,發(fā)現(xiàn)p0的值會影響cost的值:Para[1]
p0=[1,20]
#把error函數(shù)中除了p0以外的參數(shù)打包到args中(使用要求)
Para=leastsq(error,p0,args=(Xi,Yi))
#讀取結(jié)果
k,b=Para[0]
print("k=",k,"b=",b)
print("cost:"+str(Para[1]))
print("求解的擬合直線為:")
print("y="+str(round(k,2))+"x+"+str(round(b,2)))
'''
繪圖,看擬合效果.
matplotlib默認不支持中文,label設(shè)置中文的話需要另行設(shè)置
如果報錯,改成英文就可以
'''
#畫樣本點
plt.figure(figsize=(8,6))?##指定圖像比例:?8:6
plt.scatter(Xi,Yi,color="green",label="樣本數(shù)據(jù)",linewidth=2)?
#畫擬合直線
x=np.linspace(0,12,100)?##在0-15直接畫100個連續(xù)點
y=k*x+b?##函數(shù)式
plt.plot(x,y,color="red",label="擬合直線",linewidth=2)?
plt.legend(loc='lower?right')?#繪制圖例
plt.show()
Python是支持四則運算的,Python中的乘法運算也很簡單,如下:
假設(shè)變量a的值是10,變量b的值是21,則
更多技術(shù)請關(guān)注Python視頻教程。