程凱
分類器的建立及參數(shù)調(diào)整
人類可以根據(jù)散點圖的分布直接給出分類直線所在的位置,但是機器看不到,也不知道這條分類直線應(yīng)該放在哪里,它只能一點點地將樣本點帶入分段函數(shù)中。如果分段函數(shù)判斷的結(jié)果與實際類別匹配就說明該直線能夠正確分類;否則不能正確分類,需要修正直線的位置,直到全部樣本帶入后都能正確分類為止。因此,機器需要具備判斷能力?;诖耍o定判斷規(guī)則,機器就可以通過自身學(xué)習(xí)迭代出正確的分類直線的位置。
感知器就是訓(xùn)練分類器的一種算法,在分類模型形式確定的情況下,可以通過感知器訓(xùn)練算法獲得模型的參數(shù),進而獲得分類器。感知器訓(xùn)練算法本質(zhì)上是一種迭代算法,通過不斷修正參數(shù)減少誤分類的程度。因此,感知器訓(xùn)練算法不同于最小二乘法,感知器訓(xùn)練算法不是一步到位求取模型的參數(shù),是不斷迭代、不斷接近最優(yōu)的分類位置。迭代的快慢依賴于問題的復(fù)雜程度和迭代過程中一些初始參數(shù)和學(xué)習(xí)率的選擇。高中學(xué)生初次接觸迭代算法,要理解迭代算法不能給出一步到位的解析解的原因,應(yīng)先從理解迭代算法出現(xiàn)的實際必然性出發(fā),也可以結(jié)合實驗的演示,觀察在參數(shù)修正迭代的時候,分類直線如何不斷擺動,逼近最佳的分類位置,從感性上理解迭代的思想。
因為建立的是二維坐標(biāo),可以使用一條直線將平面分開。如果是多維的,我們可以使用n-1維將它們分開,這叫作超平面。為了顯示方便,我們以二維為例,需要兩個點確定一條直線,將數(shù)據(jù)分開。我們在初中學(xué)過一條直線可以表示為ax+b=y,將這個移項可以變?yōu)閍x+b-y=0,在這里不表示x和y的對應(yīng)關(guān)系,而表示已輸入的2個參數(shù)的關(guān)系,我們可以把y用參數(shù)x代替,那么這個函數(shù)就變?yōu)閍x-x+b=0,為了能更好地計算,我們這里可以先學(xué)一點矩陣的構(gòu)成和運算。這時就把它變成[a,-1,1]與[x,x,b]兩個矩陣的相乘了。我們在輸入數(shù)據(jù)的時候只輸入了2個變量x和x,我們可以使用np.one人為地制造一個全為1的數(shù)據(jù)。這樣一個函數(shù)方程就建立了,然后通過調(diào)整參數(shù)改變方程,最后方程將2組數(shù)據(jù)完全分開。下面是方程的前期建立。
X=np.hstack((np.ones((X.shape[0],1)),X))
w=np.ones((3,1))
注意:參數(shù)的設(shè)置可以使用隨機方法,使它們的分布符合高斯分布,本次為了更好地觀察數(shù)據(jù)的變化我們將所有參數(shù)設(shè)置為1,使用numpy建立。
調(diào)整參數(shù)使用學(xué)習(xí)率,在課本上介紹的方法是通過計算真實值和預(yù)測值的偏差調(diào)整參數(shù),a←a+ηy'x',a←a+ηy'x',b←b+ηy,為了方便計算這在y值輸入的時候選取兩類1,-1。
下面是程序代碼,有能力的學(xué)生可以嘗試?yán)斫狻?/p>
初步設(shè)置學(xué)習(xí)率為0.01。使用循環(huán)語句逐漸嘗試,剛開始實驗的次數(shù)為100次,得不到結(jié)果,后將實驗次數(shù)更改為5000,經(jīng)過多次調(diào)試,發(fā)現(xiàn)大約需要1500次左右就可以形成圖像。同時,這里可以學(xué)習(xí)一下循環(huán)語句,判斷語句的使用,重點對break和continue的講解,以及np.where條件語句的使用。當(dāng)所有的數(shù)據(jù)都完全分類后跳出循環(huán)。
將所有的鳶尾花分類后,權(quán)重的參數(shù)顯示為w[0],w[1],w[2],分別表示a,a,b。參數(shù)帶入直線方程為ax+ax+b=0,變形為matplotlib容易顯示的直線。
設(shè)計意圖:通過講解可以使學(xué)生更好地理解感知器,感知器其實屬于線性分類器,對異?;騿栴}還不能處理。在教學(xué)中增加部分簡單的大學(xué)內(nèi)容(矩陣簡單應(yīng)用),更能激發(fā)學(xué)生學(xué)習(xí)的熱情,使得學(xué)生看待問題的方式發(fā)生改變。并不強調(diào)學(xué)生能看懂代碼,但可以讓學(xué)生調(diào)整部分代碼,更好地理解感知器通過迭代的方法,最后通過matplotlib顯示結(jié)果。
學(xué)習(xí)率分析
提出問題學(xué)習(xí)率或系數(shù)大小應(yīng)該如何選擇,過大過小會出現(xiàn)什么問題。
通過程序檢測哪個學(xué)習(xí)率能更快得到收斂,得到分類的結(jié)果。本次從0.1到0.2,步長為0.001,最高分類次數(shù)為5000次,如果能完全分類,則跳出循環(huán),并將學(xué)習(xí)率和次數(shù)添加到list,通過matplotlib顯示檢測結(jié)果。代碼如下:
通過檢測可以發(fā)現(xiàn)當(dāng)學(xué)習(xí)率為0.1630、0.190、0.194時學(xué)習(xí)次數(shù)為3次,其他學(xué)習(xí)率的學(xué)習(xí)次數(shù)較高。
設(shè)計意圖:通過實驗的方法能進一步了解學(xué)習(xí)率在快速收斂中選擇的重要性。學(xué)習(xí)率過高可能導(dǎo)致發(fā)散,過低則會導(dǎo)致迭代次數(shù)太多。實驗的嘗試也為高三學(xué)習(xí)導(dǎo)數(shù)作好鋪墊,提高學(xué)生學(xué)習(xí)的積極性。
反思總結(jié)
本次實驗對從原始鳶尾花數(shù)據(jù)集的觀察、調(diào)用、顯示、分類,讓學(xué)生更好地體會人工智能中使用python進行應(yīng)用,使我們有了更深層次的思考,是否可以使用同樣的方法對其他東西分類。在高中階段我們已經(jīng)學(xué)了部分知識,在實驗中得到了應(yīng)用,更加深了學(xué)生對數(shù)學(xué)的學(xué)習(xí)興趣。同時,學(xué)生對矩陣有了初步的認(rèn)識。
通過鳶尾花的數(shù)據(jù)分析很好地認(rèn)識了感知器模型。對數(shù)據(jù)集的處理及感知器的參數(shù)如何調(diào)整和學(xué)習(xí)率的選擇有了更深的理解。通過matplotlib的顯示,使抽象數(shù)據(jù)可以更為直觀地展示,激發(fā)學(xué)生學(xué)習(xí)的熱情。
當(dāng)然,實驗和代碼編寫過程中也出現(xiàn)了一些不足之處,希望以后能盡力避免并成為借鑒。比如,數(shù)據(jù)集中只能存在-1和+1,如果出現(xiàn)多個分類要如何使用感知器模型?在高中信息課python學(xué)習(xí)中,只是簡單地對語言本身的學(xué)習(xí),對編程理解還是不到位,學(xué)生不能很好地理解程序代碼