趙文來,楊俊秀,陳秋妹
(浙江理工大學(xué) 信息學(xué)院,浙江 杭州 310018)
RLC串聯(lián)諧振電路是電學(xué)實驗內(nèi)容之一,旨在加強(qiáng)對串聯(lián)諧振電路的諧振條件,及阻抗、電流、電壓特點(diǎn)的理解[1]。對諧振現(xiàn)象的研究具有一定的實際意義,一方面諧振現(xiàn)象廣泛應(yīng)用于電子技術(shù)中實現(xiàn)選頻及濾波,另一方面在電力系統(tǒng)中發(fā)生諧振卻需要避免或抑制[2]。利用Python的第三方機(jī)器學(xué)習(xí)庫Scikit-learn來處理RLC串聯(lián)諧振實驗數(shù)據(jù),并通過matplotlib庫實現(xiàn)數(shù)據(jù)及其分析結(jié)果的可視化[3]。
Python是面向?qū)ο蟮母呒壋绦蛘Z言,其風(fēng)格簡潔,庫類多樣,且采用開源,具有豐富三方庫和開源軟件包接口,成為應(yīng)用于科學(xué)計算、數(shù)據(jù)庫、網(wǎng)絡(luò)工程、GUI設(shè)計等眾多領(lǐng)域的高級語言。
實驗數(shù)據(jù)處理采用了Python的numpy,Scikit-learn和Matplotlib等庫。Numpy是數(shù)值計算庫,提供快速的數(shù)組矩陣運(yùn)算,將RLC串聯(lián)諧振實驗測試數(shù)據(jù)通過相應(yīng)函數(shù)轉(zhuǎn)化為數(shù)組;Scikit-learn是Python的機(jī)器學(xué)習(xí)庫,是用于數(shù)據(jù)挖掘、數(shù)據(jù)分析的工具,通過數(shù)據(jù)訓(xùn)練,實現(xiàn)數(shù)據(jù)的擬合回歸預(yù)測、聚類、模型選取等復(fù)雜算法,采用其中的一元線性回歸模型來完成實驗數(shù)據(jù)的擬合;Matplotlib是Python二維畫圖庫,可以簡潔地畫出折線,柱狀,散點(diǎn)等二維圖像,實現(xiàn)實驗數(shù)據(jù)的可視化[4]。
圖1 RLC串聯(lián)諧振實驗電路原理圖
其中,電路諧振時,回路電流I為:
(1)
任意頻率時,回路電流I為:
(2)
回路品質(zhì)因數(shù)Q為:
(3)
歸一化電流為:
(4)
幅頻特性表現(xiàn)為:
(5)
實際測量時,通常測量不同頻率下的電阻電壓、電感電壓和電容電壓,經(jīng)計算得回路電流有效值,繪制出歸一化電流頻率特性曲線[7-10]。
“損失函數(shù)”是機(jī)器學(xué)習(xí)優(yōu)化中至關(guān)重要的一部分,機(jī)器學(xué)習(xí)中的算法都需要最大化或最小化一個函數(shù),被稱為“目標(biāo)函數(shù)”。一般把最小化的一類函數(shù),稱為“損失函數(shù)”。它能根據(jù)預(yù)測結(jié)果,衡量出模型預(yù)測能力的好壞。在實際應(yīng)用中,選取損失函數(shù)會受到諸多因素的制約,比如是否有異常值、機(jī)器學(xué)習(xí)算法的選擇、梯度下降的時間復(fù)雜度、求導(dǎo)的難易程度以及預(yù)測值的置信度等等[11]。
最常用的損失函數(shù)是均方誤差MSE,定義如下:
(6)
本方法在Win7操作系統(tǒng)上實現(xiàn),基于Python3.6版本,并導(dǎo)入Python第三方軟件庫工具pip安裝numpy,matplotlib,scikit-learn等庫。
首先錄入RLC串聯(lián)諧振實驗測試數(shù)據(jù),再利用numpy進(jìn)行數(shù)據(jù)預(yù)處理,調(diào)用scikit-learn建立一元多階線性回歸模型并求解,利用數(shù)據(jù)訓(xùn)練及機(jī)器學(xué)習(xí),最后通過均分誤差回歸損失分析判定模型最佳階數(shù),并進(jìn)行可視化輸出。實驗框圖如圖2所示[3]。
圖2 擬合曲線實現(xiàn)框圖
(1)導(dǎo)入第三方庫文件:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import Polynomial Features
from sklearn.linear_model import Linear Regression,Perceptron
from sklearn.metrics import mean_squared_error,r2_score
from sklearn.model_selection import train_test_split
mpl.rcParams[′font.sans-serif′]=[’simHei′]
(2)輸入數(shù)據(jù):基于numpy的數(shù)組array()函數(shù)把數(shù)據(jù)轉(zhuǎn)化成行向量,再結(jié)合reshape()函數(shù)把行向量轉(zhuǎn)化為列向量。
X1=[]
Y1=[]
X=np.array([]).reshape(-1,1)
y=np.array([]).reshape(-1,1)
(3)數(shù)據(jù)擬合,機(jī)器學(xué)習(xí):利用numpy的polyfit()函數(shù)進(jìn)行數(shù)據(jù)擬合,及polyld()函數(shù)進(jìn)行機(jī)器學(xué)習(xí)。
coefn=np.polyfit(x,y,n)
poly_fitn=np.poly1d(coefn)
(4)畫圖,利用matplotlib的plot()函數(shù),實現(xiàn)數(shù)據(jù)擬合曲線可視化。
plt.scatter(X1,y1,color=′black′,′g:′,label="五階,R=1K歐")
plt.xlabel("頻率(KHz)")
plt.ylabel("歸一化電流")
plt.legend(loc=2)
plt.show()
(5)數(shù)據(jù)分割及最優(yōu)判斷[12,13]:
x_train,x_test,y_train,y_test=train_test_split(X,y,test_size=0.3)
rmses=[]
degrees=np.arange(1,10)
min_rmse,min_deg,score=1e10,0,0
for deg in degrees:
poly=PolynomialFeatures(degree=deg,include_bias=False)
x_train_poly=poly.fit_transform(x_train)
poly_reg=LinearRegression()
poly_reg.fit(x_train_poly,y_train)
x_test_poly=poly.fit_transform(x_test)
y_test_pred=poly_reg.predict(x_test_poly)
poly_rmse=np.sqrt(mean_squared_error(y_test,y_test_pred))
rmses.append(poly_rmse)
r2score=r2_score(y_test,y_test_pred)
if min_rmse > poly_rmse:
min_rmse=poly_rmse
min_deg=deg
score=r2score
print(′degree=%s,RMSE=%.2f,r2_score=%.2f′ % (deg,poly_rmse,r2score))
fig=plt.figure()
ax=fig.add_subplot(111)
ax.plot(degrees,rmses)
ax.set_yscale(′log′)
ax.set_xlabel(′Degree′)
ax.set_ylabel(′RMSE′)
ax.set_title(′Best degree=%s,RMSE=%.2f,r2_score=%.2f′ %(min_deg,min_rmse,score))
plt.show()
當(dāng)R=330 Ω時,某生測試的2組實驗數(shù)據(jù)見表1、表2所示。
表1 RLC實驗數(shù)據(jù)第一組(R=330 Ω)
表2 RLC實驗數(shù)據(jù)第二組(R=330 Ω)
代入程序,對應(yīng)數(shù)據(jù)二階、三階、及高階擬合結(jié)果如圖3、圖4所示。
頻率/kHz
頻率/kHz
第一組數(shù)據(jù)均方誤差回歸損失決定系數(shù)與階數(shù)的關(guān)系曲線如圖5所示[12,13]。
頻率/kHz
由上圖5可知,R=330 Ω時均方誤差回歸損失第一組數(shù)據(jù)在階數(shù)為6時最佳,擬合決定系數(shù)為0.59,對應(yīng)的六階擬合曲線如圖6所示。
頻率/kHz
第二組數(shù)據(jù)均方誤差回歸損失決定系數(shù)與階數(shù)的關(guān)系曲線如圖7所示。
由上圖7可知,R=330 Ω時均方誤差回歸損失第二組數(shù)據(jù)在階數(shù)為4時最佳,且決定系數(shù)為0.92,大于第一組數(shù)據(jù)0.59,可見第二組數(shù)據(jù)更精確。利用均分誤差回歸與階數(shù)的對應(yīng),比較擬合曲線的大致走勢即可評估測試數(shù)據(jù)的優(yōu)劣,決定系數(shù)越接近1越優(yōu)[11]。
頻率/kHz
當(dāng)R=1 KΩ時,測得的2組實驗數(shù)據(jù)見表3、表4所示。
表3 RLC實驗數(shù)據(jù)第一組(R=1 KΩ)
表4 RLC實驗數(shù)據(jù)第二組(R=1 KΩ)
對應(yīng)數(shù)據(jù)二階、三階、及高階擬合結(jié)果如圖8、圖9所示。
頻率/kHz
頻率/kHz
第一組數(shù)據(jù)均方誤差回歸損失決定系數(shù)與階數(shù)的關(guān)系曲線如圖10所示。
頻率/kHz
由上圖10可知,均方誤差回歸損失在階數(shù)為6時最佳,決定系數(shù)為0.91,對應(yīng)的六階擬合曲線如圖11所示。
頻率/kHz
不同R的情形下比較第二組測試數(shù)據(jù),對歸一化電流幅頻特性曲線的影響,如下圖12所示。
頻率/kHz
由圖12可清晰觀察諧振電阻R對曲線的影響,及通頻帶的變化情況。一方面驗證測試數(shù)據(jù)的質(zhì)量,同時增加對參數(shù)及曲線的感性認(rèn)識。
借助Python語言,基于庫函數(shù)的一元線性回歸模型對RLC實驗數(shù)據(jù)進(jìn)行了二階、三階等曲線擬合,繪制了各擬合曲線并計算均方誤差回歸損失決定系數(shù),實現(xiàn)了實驗數(shù)據(jù)的可視化分析[4]。可見Python語言靈活方便且資源豐富,避免了學(xué)生手動計算耗時長,易出錯,且不直觀的弊端,學(xué)生可根據(jù)曲線自我判斷測試數(shù)據(jù)的質(zhì)量,實驗教師通過實驗數(shù)據(jù)的可視化曲線及數(shù)據(jù)分析結(jié)果,便于實驗報告中數(shù)據(jù)處理部分的批改,有效提高實驗教學(xué)質(zhì)量。