Python閑談(一)mgrid慢放


不論是利用Mayavi還是matplotlib繪制三維圖表,里面都用到了numpy中的一個函數叫mgrid。本次博客我簡單地講一下mgrid是干什么用的,以及一個三維曲面是如何繪制出來的。

首先說明一下這里的三個變量分別是k(x軸)、b(y軸)以及ErrorArray(z軸)。為了更好地理解mgrid后的k、b以及ErrorArray是什么,我想在這里舉個簡單的例子,然后用Python做個圖,這樣大家就都明白了。

這次也不讓Err=∑{i=1~n}([yi-(k*xi+b)]**2)了,來個簡單的吧,假設f(k,b)=3k^2+2b+1,k軸范圍為1~3,b軸范圍為4~6:


【step1:k擴展】(朝右擴展):
[1 1 1]
[2 2 2]
[3 3 3]


【step2:b擴展】(朝下擴展):
[4 5 6]
[4 5 6]
[4 5 6]


【step3:定位(ki,bi)】(把上面的k、b聯合起來):
[(1,4) (1,5) (1,6)]
[(2,4) (2,5) (2,6)]
[(3,4) (3,5) (3,6)]


【step4:將(ki,bi)代入f(k,b)=3k^2+2b+1求f(ki,bi)】
[12 14 16]
[21 23 25]
[36 38 40]




這部分代碼如下:

 1 import numpy as np
 2 import matplotlib.pyplot as plt
 3 import mpl_toolkits.mplot3d
 4 import pylab as p
 5 import mpl_toolkits.mplot3d.axes3d as p3
 6 
 7 k,b=np.mgrid[1:3:3j,4:6:3j]
 8 f_kb=3*k**2+2*b+1
 9 
10 k.shape=-1,1
11 b.shape=-1,1
12 f_kb.shape=-1,1 #統統轉成9行1列
13 
14 fig=p.figure()
15 ax=p3.Axes3D(fig)
16 ax.scatter(k,b,f_kb,c='r')
17 ax.set_xlabel('k')
18 ax.set_ylabel('b')
19 ax.set_zlabel('ErrorArray')
20 p.show()


【step5:將(ki,bi,f(ki,bi))連起來,形成曲面】



這部分代碼如下:

 

 1 import numpy as np
 2 import matplotlib.pyplot as plt
 3 import mpl_toolkits.mplot3d
 4 import pylab as p
 5 import mpl_toolkits.mplot3d.axes3d as p3
 6 
 7 k,b=np.mgrid[1:3:3j,4:6:3j]
 8 f_kb=3*k**2+2*b+1
 9 
10 ax=plt.subplot(111,projection='3d')
11 ax.plot_surface(k,b,f_kb,rstride=1,cstride=1)
12 ax.set_xlabel('k')
13 ax.set_ylabel('b')
14 ax.set_zlabel('ErrorArray')
15 p.show()


【其它說明】

上面講了一種簡單到誇張的情況,不過我認為很好的理解了mgrid。事實上當Err=∑{i=1~n}([yi-(k*xi+b)]**2)時也是同樣的道理(這是最小二乘法擬合y=kx+b時的誤差矩陣)。

mgrid中第三個參數越大,說明某一區間被分割得越細,相應的曲面越精准。在上面的例子中第三個參數為3j,如果說我們其它不變,單純將參數改成10j,則曲面圖如下:

將參數改一下改成30j,則曲面圖如下:

可以發現曲面變得非常柔和。

這部分代碼如下:

 1 import numpy as np
 2 import matplotlib.pyplot as plt
 3 import mpl_toolkits.mplot3d
 4 import pylab as p
 5 import mpl_toolkits.mplot3d.axes3d as p3
 6 
 7 k,b=np.mgrid[1:3:30j,4:6:30j]
 8 f_kb=3*k**2+2*b+1
 9 
10 ax=plt.subplot(111,projection='3d')
11 ax.plot_surface(k,b,f_kb,rstride=1,cstride=1)
12 ax.set_xlabel('k')
13 ax.set_ylabel('b')
14 ax.set_zlabel('ErrorArray')
15 p.show()

2016.4.3

by 悠望南山


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM