主成分分析是一種常用的降維方法,多見于數據預處理階段,其偽代碼如下:
輸入:樣本數據集D={x1,x2,x3,x4},低空間維度數d'
過程:
-
1 對所有樣本進行中心化(每個特征維度都減去其均值)
-
2 計算所有樣本的協方差矩陣
-
3 對協方差矩陣進行特征分解
-
4 取最大的d'個特征值的對應特征向量w1,w2,w3
輸出: 投影矩陣W*=(w1,w2,wd')
下面是其代碼實現:
首先是產生數據,我們使用sklearn的make_blobs方法產生三類數據,每類有三個特征。數據結構是(n_samples, n_features)
圖片如下:
?
可以看到,三維空間下的三類數據分的很開,在二維結構下,只有圖(1)分的較開,從這一角度來看,我們的feature1和feature2是比較好的特征。
?
import numpy as np
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
np.random.seed(123)
if __name__ == '__main__':
# 產生三類數據
x, y = make_blobs(n_samples=600, n_features=3, centers=3)
# 繪制三維圖像
fig = plt.figure(figsize=(8, 6))
ax = Axes3D(fig)
ax.scatter(x[:, 0], x[:, 1], x[:, 2], c='r')
plt.savefig('3-D distribution of Datapoints')
plt.show()
# # 繪制二維圖像
fig = plt.figure(figsize=(8, 6))
ax1 = fig.add_subplot(2, 2, 1)
ax1.scatter(x[:, 0], x[:, 1], c=y)
ax2 = fig.add_subplot(2, 2, 2)
ax2.scatter(x[:, 1], x[:, 2], c=y)
ax3 = fig.add_subplot(2, 2, 3)
ax3.scatter(x[:, 0], x[:, 2], c=y)
plt.savefig('2-D distribution of Datapoints')
plt.show()
# step1 中心化
x_mean = np.mean(x, axis=0)
x_center = x - x_mean
# step2 計算協方差矩陣
covX = np.cov(x_center.T)
# step3 對協方差矩陣進行特征分解
featureValue, featureVector = np.linalg.eig(covX)
# step4 取最大的幾個特征值
index = np.argsort(-featureValue)
selectVec = featureVector.T[index[:2]]
print(selectVec.shape)
final_matrix = np.dot(x_center, selectVec.T)
print(final_matrix.shape)
# 繪制最終二維圖像
fig = plt.figure(figsize=(8, 6))
plt.scatter(final_matrix[:, 0], final_matrix[:, 1], c=y)
plt.title('2-D distribution after PCA')
plt.savefig('2-D distribution of Datapoints after PCA')
plt.show()
?
PCA的結果如下圖所示,可以看到,效果明顯:
?
總結分析:為什么PCA有效
分析:PCA的目標是通過某種線性投影方法,將高維的數據映射到較低維的空間中,并期望在所投影的維度上數據的信息量最大(方差最大,通過協方差矩陣的特征實現),具體內容可看博客:PCA主成分分析 詳細解釋
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
