周志華《機器學習》課後習題解答系列(四):Ch3.5 - 程式設計實現線性判別分析
本系列主要採用Python-sklearn實現,環境搭建可參考 資料探勘入門:Python開發環境搭建(eclipse-pydev模式).
相關答案和原始碼託管在我的Github上:PnYuan/Machine-Learning_ZhouZhihua.
3.5 程式設計實現線性判別分析(LDA)
本題採用題3.3中的西瓜資料集如下圖示:
這裡採用基於sklearn和自己程式設計實現兩種方式實現線性判別分析(檢視完整程式碼)。
關於資料集的介紹:
具體過程如下:
1. 資料匯入、視覺化、預分析:
可以參照周志華《機器學習》課後習題解答系列(四):Ch3.3 - 程式設計實現對率迴歸中的第一步。
2. 採用sklean得到線性判別分析模型:
採用sklearn.discriminant_analysis.LinearDiscriminantAnalysis直接實現基礎的LDA,通過分割資料集,在訓練集上訓練資料,在預測集上度量模型優劣。
給出樣例程式碼如下:
from sklearn import model_selection
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn import metrics
import matplotlib.pyplot as plt
# generalization of train and test set
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.5, random_state=0)
# model fitting
lda_model = LinearDiscriminantAnalysis(solver='lsqr', shrinkage=None).fit(X_train, y_train)
# model validation
y_pred = lda_model.predict(X_test)
# summarize the fit of the model
print(metrics.confusion_matrix(y_test, y_pred))
print(metrics.classification_report(y_test, y_pred))
得出的混淆矩陣及相關度量結果如下:
[[4 1]
[1 3]]
precision recall f1-score support
0.0 0.80 0.80 0.80 5
1.0 0.75 0.75 0.75 4
avg / total 0.78 0.78 0.78 9
可以看出,由於資料集的散度不太明顯,得出的類別判斷存在較大誤差。總體來看,這裡的線性判別分類器與3.3題的對率迴歸效能相當(accuracy≈0.78)。
基於matplotlib繪製出LDA的分類區域如下圖示:
可以看出,LDA的決策區域與3.3採用對率迴歸得到的結果相當。
3. 自己程式設計實現線性判別分析:
關於LDA的原理及引數求解,可參考書上p61、62。所謂線性判別。類似PCA,LDA可將較高維資料投影到較低維空間上,分析其降維後的資料特徵的類別區分情況。
這裡採用西瓜資料集,包含2個屬性(特徵),一個類標籤(二分類0、1)。在此上運用LDA,即是要找到最優直線,對映到直線上的資料特徵類分明顯。
如何區分類別呢?採用類內散度(within-class scatter)最小化,類間散度(between-class scatter)最大化,關於散度的定義參考書中p61式(3.33)和(3.34)。
優化目標為最大化下式(Sw-類內散度,Sb-類間散度,w-直線方向向量):
我們的目的是最大化上面的式子,根據書中推導,最優解(直線引數)如下式:
相關詳細過程參考樹p61-62頁。
- 程式設計:根據式3.39計算w:
樣例程式碼如下:
# computing the d-dimensional mean vectors
import numpy as np
# 1-st. get the mean vector of each class
u = []
for i in range(2): # two class
u.append(np.mean(X[y==i], axis=0)) # column mean
# 2-nd. computing the within-class scatter matrix, refer on book (3.33)
m,n = np.shape(X)
Sw = np.zeros((n,n))
for i in range(m):
x_tmp = X[i].reshape(n,1) # row -> cloumn vector
if y[i] == 0: u_tmp = u[0].reshape(n,1)
if y[i] == 1: u_tmp = u[1].reshape(n,1)
Sw += np.dot( x_tmp - u_tmp, (x_tmp - u_tmp).T )
# 3-th. computing the parameter w, refer on book (3.39)
# here we use singular value decomposition(SVD) to get the inverse of a ndarray
Sw = np.mat(Sw)
U, sigma, V= np.linalg.svd(Sw)
Sw_inv = V.T * np.linalg.inv(np.diag(sigma)) * U.T
w = np.dot( Sw_inv, (u[0] - u[1]).reshape(n,1) )
print(w)
- 繪製LDA直線並作資料點投影來檢視類簇情況:
通過繪製投影的方式,視覺化西瓜資料在LDA直線上類簇情況(檢視相關程式碼),如下圖示:
從上圖看出,由於資料線性不可分,則出現類簇重疊現象。接下來,通過觀查資料,我們考慮將西瓜資料集中的bad類離群點15刪去(即圖中左上的黑點)此時資料集的線性可分性大大提高。
然後再次採用LDA進行對映,得到結果圖如下:
可以看出,在資料集變得線性可分時,二維點到一維LDA直線的投影出現明顯的分類,此時LDA分類器效果很好。
綜上所述,由於西瓜資料集自身非線性因素,LDA所得直線未能很好的表現出類別的分簇情景,說明,LDA基本模型不太適用於線性不可分的情況。要擴充到非線性,或許可以考慮SVM-核技巧。
本文的一些重要索引如下:
相關文章
- 周志華《機器學習》課後習題解答系列(四):Ch3 - 線性模型機器學習模型
- 周志華《機器學習》課後習題解答系列(四):Ch3.3 - 程式設計實現對率迴歸機器學習程式設計
- 周志華《機器學習》課後習題解答系列(一):目錄機器學習
- 周志華《機器學習》課後習題解答系列(五):Ch4.3 - 程式設計實現ID3演算法機器學習程式設計演算法
- 周志華《機器學習》課後習題解答系列(四):Ch3.4 - 交叉驗證法練習機器學習
- 周志華《機器學習》課後習題解答系列(六):Ch5.5 - BP演算法實現機器學習H5演算法
- 周志華《機器學習》課後習題解答系列(五):Ch4.4 - 程式設計實現CART演算法與剪枝操作機器學習程式設計演算法
- 周志華《機器學習》課後習題解答系列(五):Ch4 - 決策樹機器學習
- 周志華《機器學習》課後習題解答系列(六):Ch5.8 - SOM網路實驗機器學習H5
- 周志華《機器學習》課後習題解答系列(六):Ch5.7 - RBF網路實驗機器學習H5
- 周志華《機器學習》課後習題解答系列(六):Ch5 - 神經網路機器學習H5神經網路
- 機器學習-周志華-課後習題答案5.5機器學習
- 周志華《機器學習》課後習題解答系列(三):Ch2 - 模型評估與選擇機器學習模型
- 周志華《機器學習》課後習題解答系列(六):Ch5.6 - BP演算法改進機器學習H5演算法
- 周志華《機器學習》課後習題解答系列(六):Ch5.10 - 卷積神經網路實驗機器學習H5卷積神經網路
- 機器學習-周志華機器學習
- 周志華 機器學習ppt機器學習
- 周志華西瓜書《機器學習》機器學習
- 周志華西瓜書《機器學習》第三章線性模型機器學習模型
- 機器學習降維之線性判別分析機器學習
- 運用sklearn進行線性判別分析(LDA)程式碼實現LDA
- 重磅!周志華《機器學習》手推筆記來了!機器學習筆記
- LDA(線性判別分析)LDA
- 北大張志華:機器學習就是現代統計學機器學習
- 機器學習定義及基本術語(根據周志華的《機器學習》概括)機器學習
- 《機器學習導論》和《統計機器學習》學習資料:張志華教授機器學習
- 《深度學習——Andrew Ng》第四課第四周程式設計作業_1_人臉識別深度學習程式設計
- 好程式設計師web前端學習路線解答前後端對接問題程式設計師Web前端後端
- AI會議排名_周志華AI
- 線性判別分析LDA原理總結LDA
- 2018 AI World 觀後感——周志華教授partAI
- 預處理(3):python實現用scikit-learn實現的線性判別分析(LDA)PythonLDA
- 史上最好的LDA(線性判別分析)教程LDA
- 四. 文字程式設計--Windows程式設計課程學習筆記程式設計Windows筆記
- 第四周:選擇結構的程式設計的習題(北理)程式設計
- PTA 程式設計 判斷題-期末複習程式設計
- 線性判別分析(Linear Discriminant Analysis)NaN
- 《80X86組合語言程式設計》課後習題答案(華中科技大學王元珍版本)組合語言程式設計