解決過擬合的三個方法:
資料維度過多會導致資料稀疏性增大,形成維度災難
思想資料從原來的座標系轉換到新的座標系,新座標系的選擇是由資料本身決定的。第乙個新座標軸選擇的是原始資料中方差最大的方向,第二個新座標軸選擇和第乙個座標軸正交且具有最大方差的方向。該過程一直重複,重複次數為原始資料中特徵的數目。我們會發現,大部分方差都包含在最前面的幾個新座標軸中。因此,我們可以忽略餘下的座標軸,即對資料進行降維處理。
找到一組正交基,將一組線性相關特徵變換到線性無關
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) 降維
主成分分析是一種降維演算法,它能將多個指標轉換為少數幾 個主成分,這些主成分是原始變數的線性組合,且彼此之間 互不相關,其能反映出原始資料的大部分資訊。一般來說,當研究的問題涉及到多變數且變數之間存在很強的相關性時,我們可考慮使用主成分分析的方法來對資料進行簡化。樣本標準化 計算標準化樣本協方差矩陣...