主成分析法 PCA

2022-09-10 03:48:14 字數 2810 閱讀 4616

解決過擬合的三個方法:

資料維度過多會導致資料稀疏性增大,形成維度災難

思想資料從原來的座標系轉換到新的座標系,新座標系的選擇是由資料本身決定的。第乙個新座標軸選擇的是原始資料中方差最大的方向,第二個新座標軸選擇和第乙個座標軸正交且具有最大方差的方向。該過程一直重複,重複次數為原始資料中特徵的數目。我們會發現,大部分方差都包含在最前面的幾個新座標軸中。因此,我們可以忽略餘下的座標軸,即對資料進行降維處理。

​ 找到一組正交基,將一組線性相關特徵變換到線性無關

pca 演算法流程

code

import numpy as np

from sklearn.datasets import load_iris

import matplotlib.pyplot as plt

def pca(data, n_dim):

# |data| = m * n

# 歸一化(中心化、去平均值) data - mean(data)

data = data - np.mean(data, axis = 0, keepdims = true)

"""去中心化後,那麼每個維度均值就是為0,投影 方差就是 data^2

這裡資料維度為 4

那麼協方差 cov(x,y,q,p) = [

[cov(x, x), cov(x, y), cov(x, q), cov(x, p)]

[cov(y, x), cov(y, y), cov(y, q), cov(y, p)]

[cov(q, x), cov(q, y), cov(q, q), cov(q, p)]

[cov(p, x), cov(p, y), cov(p, q), cov(p, p)]

]"""

cov = np.dot(data.t, data)

# 求方陣解特徵值 1 * n 和特徵向量 n * n

eig_values, eig_vector = np.linalg.eig(cov)

# 按照特徵值的大小進行排序,此處按照從小到大的值進行排序,並且返回前 n_dim 個資料的下標 |index| = n_dim

indexs_ = np.argsort(-eig_values)[:n_dim]

# 提取 index_ 列中的特徵向量 n * |index| = n * n_dim

picked_eig_vector = eig_vector[:, indexs_]

# data_dim = m * n x n * n_dim = m * n_dim,就是資料降維

data_ndim = np.dot(data, picked_eig_vector)

return data_ndim

def highdim_pca(data, n_dim):

'''when n_features(d) >> n_samples(n), highdim_pca is o(n^3)

:param data: (n_samples, n_features)

:param n_dim: target dimensions

:return: (n_samples, n_dim)

'''n = data.shape[0]

data = data - np.mean(data, axis = 0, keepdims = true)

ncov = np.dot(data, data.t)

neig_values, neig_vector = np.linalg.eig(ncov)

indexs_ = np.argsort(-neig_values)[:n_dim]

npicked_eig_values = neig_values[indexs_]

# print(npicked_eig_values)

npicked_eig_vector = neig_vector[:, indexs_]

# print(npicked_eig_vector.shape)

picked_eig_vector = np.dot(data.t, npicked_eig_vector)

picked_eig_vector = picked_eig_vector/(n*npicked_eig_values.reshape(-1, n_dim))**0.5

# print(picked_eig_vector.shape)

data_ndim = np.dot(data, picked_eig_vector)

return data_ndim

if __name__ == "__main__":

data = load_iris()

x = data.data

y = data.target

data_2d1 = pca(x, 2)

plt.figure(figsize=(8,4))

plt.subplot(121)

plt.title("my_pca")

plt.scatter(data_2d1[:, 0], data_2d1[:, 1], c = y)

data_2d2 = data_2d1 = highdim_pca(x, 2)

plt.subplot(122)

plt.title("highdim_pca")

plt.scatter(data_2d2[:, 0], data_2d2[:, 1], c = y)

plt.show()

結果

主成分分析法(PCA)

一 數學基礎 1.方差 用來計算每乙個變數 觀察值 與總體均數之間的差異。總體方差計算公式 為總體方差,為變數,為總體均值,為總體例數。2.協方差 在概率論 和統計學中,協方差用於衡量兩個變數的總體誤差。而方差是 協方差的一種特殊情況,即當兩個變數是相同的情況。期望值分別為 e x 與 e y 的兩...

主成分分析法 PCA 答疑

問 為什麼要去均值?1 我認為歸一化的表述並不太準確,按統計的一般說法,叫標準化。資料的標準化過程是減去均值並除以標準差。而歸一化僅包含除以標準差的意思或者類似做法。2 做標準化的原因是 減去均值等同於座標的移動,把原始資料點的重心移到和原點重合,這樣利於很多表達,比如資料的協方差矩陣可以寫成xx ...

主成分分析法(PCA) 降維

主成分分析是一種降維演算法,它能將多個指標轉換為少數幾 個主成分,這些主成分是原始變數的線性組合,且彼此之間 互不相關,其能反映出原始資料的大部分資訊。一般來說,當研究的問題涉及到多變數且變數之間存在很強的相關性時,我們可考慮使用主成分分析的方法來對資料進行簡化。樣本標準化 計算標準化樣本協方差矩陣...