第一章 UCI数据集wine.data主成分分析PCA
生活随笔
收集整理的這篇文章主要介紹了
第一章 UCI数据集wine.data主成分分析PCA
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 前言
- 一、什么是PCA?
- 二、PCA算法流程
- 二、使用步驟
- 1.引入庫
- 2.讀入數據
- 3.數據標準化(規范化)
- 4.主成分分析PCA
- 5.PCA可視化
- 總結(拓展)
前言
學習數據挖掘,用于記錄練習和回顧
一、什么是PCA?
經典主成分分析(Classical Principal Component Analysis)的核心思想:PCA的思想是將n維特征映射到k維上(k<n),這k維是全新的正交特征。這k維特征稱為主成分,是重新構造出來的k維特征,而不是簡單地從n維特征中去除其余n-k維特征。
二、PCA算法流程
1.按列計算數據集X的均值Xmean,然后令Xnew=X?Xmean
2. 求解矩陣Xnew的協方差矩陣,并將其記為Cov
3.計算協方差矩陣Cov的特征值和相應的特征向量
4.將特征值按照從大到小的排序,選擇其中最大的k個,然后將其對應的k個特征向量分別作為列向量組成特征向量矩陣Wnxk
5. 計算XnewW,即將數據集Xnew投影到選取的特征向量上,這樣就得到了我們需要的已經降維的數據集XnewW
二、使用步驟
1.引入庫
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler import numpy as np import matplotlib.pyplot as plt2.讀入數據
代碼如下(示例):
df_wine = pd.read_csv('./UCI/wine/wine.data', header=None) # 加載葡萄酒數據集 X, y = df_wine.iloc[:, 1:].values, df_wine.iloc[:, 0].values # 把分類屬性與常規屬性分開 X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.3, random_state=0) # 把整個數據集的70%分為訓練集,30%為測試集3.數據標準化(規范化)
如果數據特征在不同的范圍上,要先對數據集標準化。下面3行代碼把數據集標準化為均值0方差1,避免異常值對結果造成影響
sc = StandardScaler() X_train_std = sc.fit_transform(X_train) X_test_std = sc.fit_transform(X_test)4.主成分分析PCA
#計算協方差矩陣 cov_mat = np.cov(X_train_std.T)#求協方差矩陣的特征值和特征向量 eigen_vals, eigen_vecs = np.linalg.eig(cov_mat) # 下面的輸出為eigen_vals """求出的特征值的意義就是特征向量的大小,因此只要找出最大特征值所對應的特征向量就可以知道哪個方向保留的方差最大。""" # array([ 4.8923083 , 2.46635032, 1.42809973, 1.01233462, 0.84906459, # 0.60181514, 0.52251546, 0.08414846, 0.33051429, 0.29595018, # 0.16831254, 0.21432212, 0.2399553 ])""" 下面的代碼都是繪圖的,涉及的參數建議去查看官方文檔 計算統計主成分分析 """tot = sum(eigen_vals) # 求出特征值的和 """即每個主成分捕捉多少方差,描述樣本的貢獻值""" var_exp = [(i / tot) for i in sorted(eigen_vals, reverse=True)] # 求出每個特征值占的比例(降序)plt.bar(range(len(eigen_vals)), var_exp, width=1.0, bottom=0.0, alpha=1, label='individual explained variance') plt.ylabel('Explained variance ratio') plt.xlabel('Principal components') plt.legend(loc='best') plt.show()第一個主成分將近0.4,第二個主成分將近0.2,也就是說明前兩個主成分可以捕捉該數據集60%的方差;第三個主成分0.1,前三個主成分可以捕捉70%
5.PCA可視化
選取前兩個主成分和前三個主成分分別做二維和三維分布圖
eigen_pairs =[(np.abs(eigen_vals[i]),eigen_vecs[:,i]) for i in range(len(eigen_vals))] # 把特征值和對應的特征向量組成對 eigen_pairs.sort(reverse=True) # 用特征值排序"""選出前2對來構建映射矩陣,但是在實際應用中,應該權衡計算效率和分類器之間的性能來選擇恰當的主成分數量""" first = eigen_pairs[0][1] second = eigen_pairs[1][1] third = eigen_pairs[2][1] first = first[:,np.newaxis] second = second[:,np.newaxis] third = third[:,np.newaxis]w = np.hstack((first,second,third))plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False X_train_pca = X_train_std.dot(w) # 轉換訓練集 colors = ['r', 'b', 'g'] markers = ['s', 'x', 'o'] for l, c, m in zip(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('PCA 1') plt.ylabel('PCA 2') plt.legend(loc='upper right') # plt.show()"""3d展示主成分""" fig =plt.figure() ax = fig.add_subplot(111,projection='3d') for l, c, m in zip(np.unique(y_train), colors, markers):ax.scatter(X_train_pca[y_train==l, 0], X_train_pca[y_train==l, 1],X_train_pca[y_train==l, 2], c=c, label=l, marker=m) plt.show()總結(拓展)
參考文章 :Blessy_Zhu https://blog.csdn.net/weixin_42555080
總結
以上是生活随笔為你收集整理的第一章 UCI数据集wine.data主成分分析PCA的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php form action跳转,fo
- 下一篇: js unescape 对应php的函数