機器學習(周志華)學習筆記三:第三章習題3.5(線性判別分析)

前文

一、線性判別分析的基本思想

“給定訓練樣例集,設法將樣例投影到一條直線上,使得同類樣例的投影點儘可能接近、異類樣例的投影點儘可能遠離;在對新樣本進行分析時,將其投影到同樣的這條直線上,再根據投影點的位置來確定新樣本的類別。”
書中的這段話總感覺缺了點什麼,缺的就是具體的判斷方法,究竟哪個位置纔算“正例”和“反例”的分界線呢?
首先,求出訓練集“正例”、“反例”的均值中心點。之後,過這兩個均值點的中點做LDA直線的垂線。那麼,這條垂線應該就是“正例”與“反例”分界的“超平面”。

二、程序運行結果

程序運行結果圖:
線性判別分析運行結果

圖中,紅色的“+”表示“正例”樣本,綠色的“-”表示“反例”樣本;紅色的圓圈代表“正例”均值中心,綠色的源泉代表“反例”均值中心;藍色的直線爲LDA直線;紫色的直線爲LDA算法求得的正例、反例的分界線,也就是“超平面”。

三、結果分析

LDA算法求得的這個“超平面”的劃分效果並不好。圖中,正例均值中心在紫色直線右邊,因此右邊應該是程序經過學習後劃分的“正例”範圍,左邊爲“反例”範圍。

顯然,LDA算法在這個數據集的劃分正確率僅爲9/17(大約爲50%)。50%的正確率意味着什麼?假設數據集中17條數據正、反例的頻率能夠接近二者發生的概率(即假設好瓜、壞瓜出現的概率均爲50%左右),假設好瓜、壞瓜的出現相互獨立。這就是說,如果你在不知道任何信息的前提下,瞎蒙的正確率也能達到50%。所以,LDA算法在該數據集上根本沒有獲得任何有價值的信息。

這說明LDA算法只適用於線性可分的數據集,這點和“硬間隔”支持向量機十分類似。(事實上,二者也存在聯繫。之間聯繫將在以後介紹)

四、程序源碼

線性判別分析.zip

五、部分代碼修改

"""求取超平面分界線"""
x = (central_x_0 + central_x_1) / 2
y = (central_y_0 + central_y_1) / 2
k2 = w[1, 0] / w[0, 0]
b2 = y - k2 * x
line_density = linspace(0, 0.8, 10)
line_sugar = -(w[0, 0] / w[1, 0]) * line_density
line_boundary = k2 * line_density + b2
pyplot.plot(line_density, line_sugar,
            c='blue', label='LDA_line', linewidth=1)
pyplot.plot(line_density, line_boundary, c='DarkMagenta', linewidth=1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章