機器學習(6)--主成分分析(Principal component analysis,PCA)

文章推薦指數: 80 %
投票人數:10人

在這個範例裡,我們將使用葡萄酒數據集來做示範,把原本有的13個特徵,利用PCA分析後只找出兩個主要的特徵值作為分類器模型分類的特徵依據。

PCA著眼在高 ... 2017年2月23日星期四 機器學習(6)--主成分分析(Principalcomponentanalysis,PCA)   這一篇介紹主成分分析(Principalcomponentanalysis,PCA),是一種特徵提取的技術,利用特徵降維來避免因維度災難所造成的過度適合(Overfitting)現象。

就是說假如訓練資料集裡有很多個特徵數據,我們可以利用主成分分析(Principalcomponentanalysis,PCA)來選取最有影響的幾個特徵來做分類器模型的訓練而不需要使用所有的特徵數據來做訓練。

  在這個範例裡,我們將使用葡萄酒數據集來做示範,把原本有的13個特徵,利用PCA分析後只找出兩個主要的特徵值作為分類器模型分類的特徵依據。

  PCA著眼在高維度的數據,"最大化變異數"並投影到與原數據及相同維數或較低維數的"新特徵子空間"。

新特徵子空間的正交軸即是"主成分"。

x1,x2軸維原本的,PC1,PC2為主成分   使用PCA來做降維,需要一個dxk維的轉換矩陣W。

如下列原本d維的數據x,對應到新的k維 特徵子空間z,這個新的特徵子空間z會比原本d維的特徵空間小,也就是k fromsklearn.ensembleimportRandomForestClassifier importpandasaspd importnumpyasnp importwarnings,math importmatplotlib.pyplotasplt ##讀取wine資料+ df_wine=pd.read_csv('wine_data.csv', header=None) df_wine.columns=['Classlabel','Alcohol','Malicacid','Ash', 'Alcalinityofash','Magnesium','Totalphenols', 'Flavanoids','Nonflavanoidphenols','Proanthocyanins', 'Colorintensity','Hue','OD280/OD315ofdilutedwines', 'Proline'] fromsklearn.model_selectionimporttrain_test_split X,y=df_wine.iloc[:,1:].values,df_wine.iloc[:,0].values#0:d為class1:之後為13個特徵行 X_train,X_test,y_train,y_test=\ train_test_split(X,y,test_size=0.3,random_state=0) fromsklearn.preprocessingimportStandardScaler stdsc=StandardScaler() X_train_std=stdsc.fit_transform(X_train) X_test_std=stdsc.fit_transform(X_test) ##讀取wine資料- #求共變異係數矩陣 cov_mat=np.cov(X_train_std.T) print("共變異係數矩陣.shape=",cov_mat.shape) print("共變異係數矩陣=",cov_mat) #求共變異係數矩陣的特徵向量及特徵值 eigen_vals,eigen_vecs=np.linalg.eig(cov_mat) print("特徵向量.shape=",eigen_vecs.shape) print("特徵向量=",eigen_vecs) print("特徵值=",eigen_vals) #計算解釋變異數比率各特徵值/特徵值總和 tot=sum(eigen_vals) var_exp=[(i/tot)foriinsorted(eigen_vals,reverse=True)] cum_var_exp=np.cumsum(var_exp) print("各特徵值變異數比率:",var_exp) print("特徵值變異數比率累加:",cum_var_exp) #畫圖:解釋變異數比率,各特徵值/特徵值總和 plt.bar(range(1,14),var_exp,alpha=0.5,align='center', label='individualexplainedvariance') plt.step(range(1,14),cum_var_exp,where='mid', label='cumulativeexplainedvariance') plt.ylabel('Explainedvarianceratio') plt.xlabel('Principalcomponents') plt.legend(loc='best') plt.tight_layout() plt.show() #Makealistof(eigenvalue,eigenvector)tuples eigen_pairs=[(np.abs(eigen_vals[i]),eigen_vecs[:,i]) foriinrange(len(eigen_vals))] print("特徵值,特徵向量length:",len(eigen_pairs)) print("特徵值,特徵向量:",eigen_pairs) #Sortthe(eigenvalue,eigenvector)tuplesfromhightolow eigen_pairs.sort(key=lambdak:k[0],reverse=True) print("特徵值,特徵向量排序:",eigen_pairs.sort(key=lambdak:k[0],reverse=True)) #保留兩個最具影響力的特徵向量組成13x2的投影矩陣W w=np.hstack((eigen_pairs[0][1][:,np.newaxis], eigen_pairs[1][1][:,np.newaxis])) print('MatrixW:\n',w) #畫出轉換後的數據集散點圖 #print("X_train_std[0].dot(w)=",X_train_std[0].dot(w)) X_train_pca=X_train_std.dot(w) colors=['r','b','g'] markers=['s','x','o'] forl,c,minzip(np.unique(y_train),colors,markers): plt.scatter(X_train_pca[y_train==l,0], X_train_pca[y_train==l,1], c=c,label=l,marker=m) plt.xlabel('PC1') plt.ylabel('PC2') plt.legend(loc='lowerleft') plt.tight_layout() plt.show() ##劃出決策分布圖 frommatplotlib.colorsimportListedColormap defplot_decision_regions(X,y,classifier,resolution=0.02): #setupmarkergeneratorandcolormap markers=('s','x','o','^','v') colors=('red','blue','lightgreen','gray','cyan') cmap=ListedColormap(colors[:len(np.unique(y))]) #plotthedecisionsurface x1_min,x1_max=X[:,0].min()-1,X[:,0].max()+1 x2_min,x2_max=X[:,1].min()-1,X[:,1].max()+1 xx1,xx2=np.meshgrid(np.arange(x1_min,x1_max,resolution), np.arange(x2_min,x2_max,resolution)) Z=classifier.predict(np.array([xx1.ravel(),xx2.ravel()]).T) Z=Z.reshape(xx1.shape) plt.contourf(xx1,xx2,Z,alpha=0.4,cmap=cmap) plt.xlim(xx1.min(),xx1.max()) plt.ylim(xx2.min(),xx2.max()) #plotclasssamples foridx,clinenumerate(np.unique(y)): plt.scatter(x=X[y==cl,0],y=X[y==cl,1], alpha=0.8,c=cmap(idx), marker=markers[idx],label=cl) #使用LogisticRegression並用兩個PCA主成分做訓練分類 fromsklearn.linear_modelimportLogisticRegression lr=LogisticRegression() lr=lr.fit(X_train_pca,y_train) plot_decision_regions(X_train_pca,y_train,classifier=lr) plt.xlabel('PC1') plt.ylabel('PC2') plt.legend(loc='lowerright') plt.tight_layout() plt.show() 書名:Python機器學習,作者:SebastianRaschka https://github.com/rasbt/python-machine-learning-book 加入阿布拉機的3D列印與機器人的FB專頁 https://www.facebook.com/arbu00/ 人工神經網路(1)--使用Python實作perceptron(感知器) 人工神經網路(2)--使用Python實作後向傳遞神經網路演算法(Backprogationartificialneaturenetwork) 深度學習(1)-如何在windows安裝Theano+Keras+Tensorflow並使用GPU加速訓練神經網路 機器學習(1)--使用OPENCVKNN實作手寫辨識 機器學習(2)--使用OPENCVSVM實作手寫辨識 演算法(1)--蒙地卡羅法求圓周率及橢圓面積(Montecarlo) 演算法(2)--使用Numpy.bincount來實作簡單的桶子排序法 機器學習(3)--適應線性神經元與梯度下降法(AdalineneuronandGradientdescent) 機器學習(4)--資料標準常態化與隨機梯度下降法(standardization&StochasticGradientdescent) 機器學習(5)--邏輯斯迴歸,過度適合與正規化(Logisticregression,overfittingandregularization) 張貼者: Ashing'sbolg 於 上午8:27 以電子郵件傳送這篇文章BlogThis!分享至Twitter分享至Facebook分享到Pinterest 標籤: 人工神經網路, 深度學習, 機器學習,KNN, 類神經網路, A.I, PCA, python 較新的文章 較舊的文章 首頁 關於我自己 Ashing'sbolg 檢視我的完整簡介 熱門文章 機器學習(6)--主成分分析(Principalcomponentanalysis,PCA)   這一篇介紹主成分分析(Principalcomponentanalysis,PCA),是一種特徵提取的技術,利用特徵降維來避免因維度災難所造成的過度適合(Overfitting)現象。

就是說假如訓練資料集裡有很多個特徵數據,我們可以利用主成分分析(Pri... 深度學習(2)--使用Tensorflow實作卷積神經網路(Convolutionalneuralnetwork,CNN)   卷積神經網路(Convolutionalneuralnetwork,CNN),是一多層的神經網路架構,是以類神經網路實現的深度學習,在許多實際應用上取得優異的成績,尤其在影像物件識別的領域上表現優異。

   傳統的多層感知器(MultilayerPer... 深度學習(3)--循環神經網絡(RNN,RecurrentNeuralNetworks)   本節介紹最簡單的循環神經網路,稱之為Simple-RNN,它是LSTM的基礎。

Simple-RNN與BP一樣都有前饋層與反饋層。

但是Simple-RNN引入了基於時間(狀態)的循環機制。

  下圖一所示為Simple-RNN的神經網路示意圖。

神經網路為A,通過讀... 深度學習(1)-如何在windows安裝Theano+Keras+Tensorflow並使用GPU加速訓練神經網路 本篇文章介紹如何安裝Theano及Keras,Tensorflow深度學習的框架在windows環境上,並快速的使用Keras的內建範例來執行人工神經網路的訓練。

   之前也有實作Tensorflow及caffe在VM+ubuntu16.04環境安裝的經驗,甚至... 機器學習(1)--使用OPENCVKNN實作手寫辨識     這一篇我們要來利用OPENCV所提供的kNN(k-NearestNeighbour)來實作手寫辨識。

在程式實作中,我稍微改變了OPENCV官版原本的範例程式,除了修正在Python3.5+OPENCV3.xbuildcode會error以外,程式最... 人工神經網路(2)--使用Python實作後向傳遞神經網路演算法(Backprogationartificialneaturenetwork)    這篇文章介紹後向傳遞神經網路演算法(Backprogationartificialneaturenetwork),並使用Python語言實作實現一XOR邏輯功能的多層網路模型。

   在底下前一篇文章單一神經元感知器的實作上知道,單一感知器無法實作出具X... 機器學習(10)--訊息量、資訊熵(InformationEntropy) 訊息量    在資訊理論中,訊息量是有確定解釋並可以量化計算的,這裡提到的訊息量是一種資訊數量化,度量的規則。

    用科學公式性的方法去量化一段文字有多少資訊的想法,最早是由哈萊特(RVLHartley)在1928年首先提出。

他將消息數的對數(log... 使用python與arduino連接控制LED     這篇文章示範如何使用Python跟Arduino連結.並簡單的控制LEDON/OFF.由於Python是跨平台的程式語言所以可以安裝在一般電腦的windows上,也可以安裝在使用Linux的系統如樹梅派.       底下的範例程式... 深度學習(4)--使用Tensorflow實現類Lenet5手寫數字辨識   這一節介紹一完整的手寫數字辨識的範例,使用Tensorflow來實現類似Lenet5的架構。

除了使用MNIST數據集來做訓練與測試外,我們將訓練好的模型儲存起來,並用微軟小畫家自行手寫幾張數字來進行實際的辨識預測,最後使用Kaggle網站上的手寫數字數據進行預測,並將結... 深度學習(8)--使用TensorflowObjectDetectionAPI實現物件自動辨識 2017年6月,Google公司開放了TensorflowObjectDetectionAPI。

這個專案使用TensorFlow實現了大多數深度學習目標檢測架構,其中就包含FasterR-CNN。

在本文章中將會介紹如何安裝TensorflowObjectDete... 網誌存檔 ►  2020 (2) ►  十二月2020 (1) ►  五月2020 (1) ►  2018 (5) ►  十月2018 (1) ►  八月2018 (2) ►  三月2018 (1) ►  一月2018 (1) ▼  2017 (17) ►  十一月2017 (1) ►  八月2017 (1) ►  七月2017 (1) ►  五月2017 (2) ►  三月2017 (4) ▼  二月2017 (6) 機器學習(7)--利用核主成分分析(KernelPCA)處理非線性對應 機器學習(6)--主成分分析(Principalcomponentanalysis,PCA) 機器學習(5)--邏輯斯迴歸,過度適合與正規化(Logisticregression,overf... 機器學習(4)--資料標準常態化與隨機梯度下降法(standardization&Stocha... 機器學習(3)--適應線性神經元與梯度下降法(AdalineneuronandGradient... 演算法(2)--使用Numpy.bincount來實作簡單的桶子排序法 ►  一月2017 (2) ►  2016 (37) ►  十二月2016 (2) ►  十一月2016 (10) ►  十月2016 (5) ►  九月2016 (3) ►  七月2016 (5) ►  五月2016 (3) ►  四月2016 (4) ►  三月2016 (2) ►  二月2016 (1) ►  一月2016 (2) ►  2015 (31) ►  十二月2015 (6) ►  十一月2015 (2) ►  十月2015 (4) ►  九月2015 (5) ►  八月2015 (3) ►  七月2015 (11)



請為這篇文章評分?