試答系列:「西瓜書」-周志華《機器學習》習題試答
系列目錄
[第01章:緒論]
[第02章:模型評估與選擇]
[第03章:線性模型]
[第04章:決策樹]
[第05章:神經網絡]
[第06章:支持向量機]
第07章:貝葉斯分類器
第08章:集成學習
第09章:聚類
第10章:降維與度量學習
第11章:特徵選擇與稀疏學習
第12章:計算學習理論(暫缺)
第13章:半監督學習
第14章:機率圖模型
(後續章節更新中...)html
答:編程代碼附後。運行結果以下(考慮了k=1,3,5,以及分別採用曼哈頓(p=1),歐式(p=2)和切比雪夫(p=50)三種距離):
上圖中,「+」和「-」離散點分別表明訓練數據樣本點,黑色線條爲決策樹邊界,紅色線條爲kNN邊界。
討論:python
證實:首先來理解一下這兩個指望錯誤率,它們都表示成「錯誤率=1-正確率」的形式,所以問題轉化成理解正確率。
對於預測樣本\(x\),貝葉斯最優分類器的決策結果\(c^*\),若是預測正確,意味着這個樣本的真實類別恰好也是\(c^*\),而該樣本以\(P(c^*|x)\)的機率屬於\(c^*\)類別,所以預測正確的機率即爲\(P(c^*|x)\),而錯誤率\(err^*=1-P(c^*|x)\)。
最近鄰分類器的決策結果等於近鄰樣本\(z\)相同的類別,假設這個共同的類別爲\(c\),若是這個決策結果是正確的,意味着\(x\)樣本和\(z\)樣本恰好都屬於\(c\)類,這個事件發生的機率是\(P(c|x)P(c|z)\)。考慮各類不一樣的\(c\)值,把它們加起來即是總的指望正確率\(=\sum_c P(c|x)P(c|z)\),所以錯誤率\(err=1-\sum_c P(c|x)P(c|z)\)。
接下來證實上面的不等式:算法
第2行利用了關係\(P(c|x)\leq P(c^*|x)\),第4行利用了關係\(\sum_cP(c|z)=1\)。
不等式左半邊得證。編程
第4行利用了不等式關係:\(\frac{\sum a_i^2 }{n} \geq (\frac{\sum a_i}{n})^2, \ \ a_i\geq 0,\ i=1,2,\cdots ,n\);第5行利用了關係\(\sum_{c\neq c^\ast}P(c|x)=1-P(c^*|x)=err^*\)。
不等式右半邊得證。網絡
答:至關於將\(X\)變爲\(X^{\prime}\):app
其效果即是中心化\(x_i^{\prime}=x_i-\bar{x}\)。機器學習
答:首先看一下,確實能夠經過SVD(奇異值)分解獲得協方差矩陣的特徵值和特徵向量。由附錄A.33式有,任意實矩陣\(A\in R^{m\times n}\)均可以分解爲函數
其中U和V分別爲m階和n階的酉矩陣,\(\Sigma\)是m×n矩陣,對角元之外元素均爲零,因而有:學習
所以,\(U\)的列向量是\(AA^T\)的特徵向量,\(V\)的列向量是\(A^TA\)的特徵向量,\(\Sigma\)矩陣的非零對角元\(\sigma_{ii}\)的平方即爲\(AA^T\)和\(A^TA\)的共同非零特徵值。spa
在前面原理介紹部分採用的10.2和10.4等圖中,數據維度d=2或3,而樣本數m遠大於數據維數,m>>d。然而在實際狀況中,既然須要降維,一般維度d很大,好比對於100張100*100的圖片,m=100,d=10000,此時的協方差矩陣\(XX^T\)的shape爲\(R^{10000\times10000}\),矩陣維度較大。而\(X\in R^{10000\times100}\),對其進行SVD(奇異值)分解的計算成本較低一些。
另外,參考博友Vic時代的解答:
其實對X進行奇異值分解,也要消耗與\(XX^T\)相同的10000×10000的存儲空間。
能夠先求\(X^TX\in R^{100\times 100}\)的特徵分解,獲得特徵值\(\lambda\)和特徵向量\(\nu\),那麼\(\lambda\)和\(X\nu\)分別也是\(XX^T\)的特徵值和特徵向量。
由於\(X^TX\nu=\lambda\nu\),等式左右兩邊左乘\(X\)獲得,\(XX^T(X\nu)=\lambda (X\nu)\)。
答: 正交有兩個好處:
其實至於不一樣特徵之間「去相關」有什麼好處,如今沒有相關的實踐應用,很差體會,留待之後有所體會的時候再回來補充吧。
關於正交的缺點方面,大概也就是「去相關」後的缺點吧,某些狀況下也許特徵之間徹底去相關未必是好事。一樣須要慢慢實踐、體會。如今想到的例子,好比:一我的的身高和體重是正相關的,經過PCA方法大概能夠獲得「身體年齡」和「肥瘦度」兩個相互獨立的特徵,可是,或許在一個特定任務中,直接用身高和體重兩個特徵更容易一些。
答:
答:
答:
答:
答:
# -*- coding: utf-8 -*- """ Created on Mon Apr 27 11:04:11 2020 @author: Administrator """ import numpy as np import matplotlib.pyplot as plt #設置繪圖時顯示中文 plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus'] = False def kNN(X,Y,Xpre,k,p=2): # k近鄰算法 # X:樣本數據 # Y:樣本標記 # Xpre:待預測樣本 # k:k近鄰的k值 # p:計算距離所採用的閔可夫斯基距離的p值 mt,n=X.shape #訓練樣本數和特徵數 Xpre=np.array(Xpre).reshape(-1,n) mp=Xpre.shape[0] #預測樣本數 dist=np.zeros([mp,mt]) #存儲預測樣本和訓練樣本之間的距離 for i in range(mt): dist[:,i]=(((abs(Xpre-X[i]))**p).sum(axis=1))**(1/p) neighbor=np.argsort(dist,axis=1) #訓練樣本按距離遠近排序的索引號 neighbor=neighbor[:,:k] #只取前k個做爲最近鄰 Ypre=Y[neighbor] return (Ypre.sum(axis=1)>=0)*2-1 #西瓜3.0α僅兩類,故可如此計算 # 西瓜3.0α 樣本數據 X=np.array([[0.697,0.46],[0.774,0.376],[0.634,0.264],[0.608,0.318],[0.556,0.215], [0.403,0.237],[0.481,0.149],[0.437,0.211],[0.666,0.091],[0.243,0.267], [0.245,0.057],[0.343,0.099],[0.639,0.161],[0.657,0.198],[0.36,0.37], [0.593,0.042],[0.719,0.103]]) Y=np.array([1,1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1]) # 執行kNN算法 # 嘗試 k=1,3,5,p=1,2,30的不一樣狀況 ks=[1,3,5] ps=[1,2,50] #p=1爲曼哈頓距離,p=2爲歐式距離,p=50(→∞)爲切比雪夫距離 for i,k in enumerate(ks): for j,p in enumerate(ps): # kNN算法預測結果 x0=np.linspace(min(X[:,0]),max(X[:,0]),60) x1=np.linspace(min(X[:,1]),max(X[:,1]),60) X0,X1=np.meshgrid(x0,x1) Xpre=np.c_[X0.reshape(-1,1),X1.reshape(-1,1)] Ypre=kNN(X,Y,Xpre,k,p).reshape(X0.shape) # 畫圖 plt.subplot(len(ks),len(ps),i*len(ps)+j+1) #plt.axis('equal') plt.title('k=%d,p=%d'%(k,p)) plt.xlabel('密度') plt.ylabel('含糖率') # 畫樣本點 plt.scatter(X[Y==1,0],X[Y==1,1],marker='+',s=30,label='好瓜') plt.scatter(X[Y==-1,0],X[Y==-1,1],marker='_',s=30,label='壞瓜') # 畫決策樹邊界 (直接根據教材上圖4.10和4.11肯定邊界曲線座標) plt.plot([0.381,0.381,0.56,0.56,max(X[:,0])], [max(X[:,1]),0.126,0.126,0.205,0.205],'k',label='決策樹邊界') # 畫kNN邊界 plt.contour(X0,X1,Ypre,1,colors='r',s=2) plt.show()
# -*- coding: utf-8 -*- """ Created on Sat May 16 21:03:47 2020 @author: Administrator """ import numpy as np from PIL import Image from sklearn.decomposition import PCA import matplotlib.pyplot as plt #==========讀取Yale圖片數據=========== #Yale人臉數據爲15人,每人11張照片 #下載到的Yale文件存儲規律是: # Yale文件夾下有名稱分別爲1~15的15個子文件夾, # 每一個子文件夾下有s1.bmp~s11.bmp的11張圖片 rootpath='Yale' #Yale根文件夾所在路徑,我這裏將Yale文件夾放在當前目錄下,若其餘位置,改爲相應路徑便可 X=[] #存儲圖片數據 for person in range(15): for num in range(11): path=rootpath+'/'+str(person+1)+'/s'+str(num+1)+'.bmp' img=Image.open(path) X.append(np.array(img).reshape(-1)) X=np.array(X) #==========觀察這15人的圖片============ #只顯示第一張圖片s1 for i in range(3): for j in range(5): plt.subplot(3,5,i*5+j+1) plt.imshow(X[(i*5+j)*11,:].reshape(100,100),cmap='gray') plt.axis('off') plt.title('%d'%(i*5+j+1)) plt.show() #========PCA主成分分析(d'=20)========== pca=PCA(n_components=20) Z=pca.fit_transform(X) #輸入X的shape爲m×d,與教材中相反 W=pca.components_ #特徵向量W,shape爲d'×d,與教材中相反 #====可視化觀察特徵向量所對應的圖像====== for i in range(5): for j in range(4): plt.subplot(4,5,i*4+j+1) plt.imshow(W[i*4+j,:].reshape(100,100),cmap='gray') plt.axis('off') plt.title('w%d'%(i*4+j+1)) plt.show() #========觀察重構後的15人圖片=========== #只顯示第一張圖片s1 X_re=pca.inverse_transform(Z) for i in range(3): for j in range(5): plt.subplot(3,5,i*5+j+1) plt.imshow(X_re[(i*5+j)*11,:].reshape(100,100),cmap='gray') plt.axis('off') plt.title('%d'%(i*5+j+1)) plt.show()