『壹』 python最小二乘法擬合與作圖
在函數擬合中,如果用p表示函數中需要確定的參數,那麼目標就是找到一組p,使得下面函數S的值最小:
這種演算法稱為最小二乘法擬合。Python的Scipy數值計算庫中的optimize模塊提供了 leastsq() 函數,可以對數據進行最小二乘擬合計算。
此處利用該函數對一段弧線使用圓方程進行了擬合,並通過Matplotlib模塊進行了作圖,程序內容如下:
Python的使用中需要導入相應的模塊,此處首先用 import 語句
分別導入了numpy, leastsq與pylab模塊,其中numpy模塊常用用與數組類型的建立,讀入等過程。leastsq則為最小二乘法擬合函數。pylab是繪圖模塊。
接下來我們需要讀入需要進行擬合的數據,這里使用了 numpy.loadtxt() 函數:
其參數有:
進行擬合時,首先我們需要定義一個目標函數。對於圓的方程,我們需要圓心坐標(a,b)以及半徑r三個參數,方便起見用p來存儲:
緊接著就可以進行擬合了, leastsq() 函數需要至少提供擬合的函數名與參數的初始值:
返回的結果為一數組,分別為擬合得到的參數與其誤差值等,這里只取擬合參數值。
leastsq() 的參數具體有:
輸出選項有:
最後我們可以將原數據與擬合結果一同做成線狀圖,可採用 pylab.plot() 函數:
pylab.plot() 函數需提供兩列數組作為輸入,其他參數可調控線條顏色,形狀,粗細以及對應名稱等性質。視需求而定,此處不做詳解。
pylab.legend() 函數可以調控圖像標簽的位置,有無邊框等性質。
pylab.annotate() 函數設置注釋,需至少提供注釋內容與放置位置坐標的參數。
pylab.show() 函數用於顯示圖像。
最終結果如下圖所示:
用Python作科學計算
numpy.loadtxt
scipy.optimize.leastsq
『貳』 想用python來求解牛頓插值問題,編了一段程序,其中有些錯誤看不出來,懇請大佬指出錯誤,代碼如下
importmatplotlib.pyplotasplt
frompylabimportmpl
importmath
"""
牛頓插值法
插值的函數表為
xi-28.9,-12.2,4.4,21.1,37.8
f(xi)2.2,3.9,6.6,10.3,15.4
"""
x=[-28.9,-12.2,4.4,21.1,37.8]
y=[2.2,3.9,6.6,10.3,15.4]
"""計算4次差商的值"""
defFour_time_difference_quotient(x,y):
i=0#i記錄計算差商的次數
quotient=[0,0,0,0,0,]
whilei<4:
j=4
whilej>i:
ifi==0:
quotient[j]=((y[j]-y[j-1])/(x[j]-x[j-1]))
else:
quotient[j]=(quotient[j]-quotient[j-1])/(x[j]-x[j-1-i])
j-=1
i+=1
returnquotient;
deffunction(data):
returnx[0]+parameters[1]*(data-0.4)+parameters[2]*(data-0.4)*(data-0.55)+
parameters[3]*(data-0.4)*(data-0.55)*(data-0.65)
+parameters[4]*(data-0.4)*(data-0.55)*(data-0.80)
"""計算插值多項式的值和相應的誤差"""
defcalculate_data(x,parameters):
returnData=[];
fordatainx:
returnData.append(function(data))
returnreturnData
"""畫函數的圖像
newData為曲線擬合後的曲線
"""
defdraw(newData):
plt.scatter(x,y,label="離散數據",color="red")
plt.plot(x,newData,label="牛頓插值擬合曲線",color="black")
plt.scatter(0.596,function(0.596),label="預測函數點",color="blue")
plt.title("牛頓插值法")
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
plt.legend(loc="upperleft")
plt.show()
parameters=Four_time_difference_quotient(x,y)
yuanzu=calculate_data(x,parameters)
draw(yuanzu)
『叄』 python中from pylab import *是什麼意思
* 代表所有,就是從pylab中導入所有的非私有類,函數,全局變數等。
『肆』 python怎麼讀取視屏文件的信息
用python讀取視頻有兩種主要方法,大家可依據自己的需求進行使用。
方法一:
使用imageio庫,沒有安裝的可用pip安裝或自己下載。自己下載的話給大家推薦一個鏡像網站:[pip鏡像](mageio/%20python%E5%BA%93%E9%95%9C%E5%83%8F%E7%BD%91%E7%AB%99),安裝好後重啟終端即可調用。1234
import pylabimport imageio#視頻的絕對路徑filename = '/path/to/your/video.mp4'#可以選擇解碼工具vid = imageio.get_reader(filename, 'ffmpeg')for im in enumerate(vid): #image的類型是mageio.core.util.Image可用下面這一注釋行轉換為arrary
#image = skimage.img_as_float(im).astype(np.float32)
fig = pylab.figure()
fig.suptitle('image #{}'.format(num), fontsize=20)
pylab.imshow(image)
pylab.show()12345678910111213
方法二:
用cv2庫,用這種方法的好處是返回的就是arrary,不用轉換,但方法一可以指定顯示某一幀,而這種方法是從頭讀到尾。
import numpy as npimport matplotlib.pyplot as pltimport pylabimport imageioimport skimage.ioimport numpy as np
import cv2
cap = cv2.VideoCapture('/path/to/your/video.mp4')
while(cap.isOpened()):
ret, frame = cap.read()
cv2.imshow('image', frame)
k = cv2.waitKey(20)
#q鍵退出
if (k & 0xff == ord('q')):
break cap.release()
cv2.destroyAllWindows()
大家可能注意到,兩種方法的顯示方法也是不一樣的,這里不詳細展開,實踐一下便很清楚了。