機器學習 | 特徵工程 —— 降維:PCA(主成分分析)

1.數學原理

1.1.【參考博客】

https://www.cnblogs.com/xinyuyang/p/11178676.html

1.2.【精簡描述】

PCA實際上是將含有冗餘特徵的高維空間數據集投影到地位空間中,在保證信息量的同時,對數據集冗餘特徵進行篩選。而投影的關鍵就在於確定高維空間向低維空間轉換的基向量。而基向量選取的原則則是儘可能的保持投影后的數據的信息量,也就是高維數據投影到低維空間中某個基向量之上以後,數據越分散越好(常用方差衡量數據的分散程度,即相同特徵之間方差越大越好)。同時,也應當保證所有基向量之間的耦合程度越小越好(基向量之間是正交的),而不同基向量上投影的線性相關性度量標準則爲協方差。(不同特徵間的協方差越小越好)

2.PCA流程

  • 【原始矩陣】A_{m,n}: m表示對象個數,n表示特徵個數
  • step 1. 數據預處理:每一個特徵列減去其列均值,使得特徵列中所有元素之和爲0
  • step 2. 求協方差矩陣B_{n,n} = (A^T·A):1)協方差矩陣對角線元素爲特徵方差(方差儘可能大); 2)非對角線元素爲特徵之間的協方差(協方差儘可能小)
  • step 3. 對協方差矩陣進行特徵分解:特徵值降序,選擇前N大特徵值對應特徵向量組成特徵向量組P_{n,N}
  • step 4. 將原始數據投影到選取的特徵向量上:D_{m,N} = A_{m,n}×P_{n,N}

3.PCA的python實現

3.1.python中PCA接口

from sklearn import decomposition
from sklearn import datasets
import matplotlib.pyplot as plt


def load_data():
    """加載數據"""
    digits = datasets.load_digits()
    return digits.data, digits.target


# 實例化PCA對象並訓練
# 1.PCA()參數說明:
# -n_components: 降維後的主成分數量
# -copy: 表示是否在運算法時,將原始訓練數據複製一份
# -whiten: 判斷是否白化,即對降維後的每個特徵進行歸一化
# -random_state: 隨機數種子
# 2.PCA()實例對象屬性+方法:
# -components_: 返回具有最大方差的成分
# -explained_variance_: 降維後的各主成分的方差值
# -explained_variance_ratio_:返降維後的各主成分的方差值佔總方差值的比例,這個比例越大,則越是重要的主成分
# -n_components_:返回所保留的成分個數n
# 2.PCA()對象方法:
# -fit(x):模型訓練
# -fit_transform(x): 用X來訓練PCA模型,同時返回降維後的數據。
# -inverse_transform(): 將降維後的數據轉換成原始數據
# -transform(x): 將數據X轉換成降維後的數據。當模型訓練好後,對於新輸入的數據,都可以用transform方法來降維
def construct_my_pca(x, n_components, random_state=1):
    """構造pca模型"""
    pca = decomposition.PCA(n_components=n_components, random_state=random_state)
    pca.fit(x)
    return pca.fit_transform(x)


def draw_figure(x_pca, y):
    """繪圖"""
    plt.figure(figsize=(10, 10), dpi=100)
    plt.scatter(x_pca[:, 0], x_pca[:, 1], c=y)
    plt.xlabel("component-1", fontsize=11)
    plt.ylabel("component-2", fontsize=11)
    plt.show()


def main():
    data, label = load_data()
    data_pca = construct_my_pca(data, 2, 1)
    draw_figure(data_pca, label)


if __name__ == "__main__":
    main()

3.2.python結構化實現PCA

from sklearn import decomposition
from sklearn import datasets
import matplotlib.pyplot as plt
import numpy as np


def load_data():
    """加載數據"""
    digits = datasets.load_digits()
    return digits.data, digits.target


def construct_my_pca(rawData, n_components, random_state=1):
    """構造pca模型"""
    try:
        # 1.數據預處理
        meanVal = np.mean(rawData, axis=0)
        x = rawData - meanVal

        # 2.計算協方差矩陣[一行代表一個樣本]
        cov = np.cov(x, rowvar=False)

        # 3.計算協方差矩陣的特徵值與特徵向量
        eigVals, eigVects = np.linalg.eig(cov)
        eigValIndice = np.argsort(eigVals)
        n_eigValIndice = eigValIndice[-1:-(n_components+1):-1]
        n_eigVects = eigVects[:, n_eigValIndice]

        # 4.生成低維空間數據
        res = np.dot(x, n_eigVects)
        return res
    except Exception as e:
        return "this is error!"


def draw_figure(x_pca, y):
    """繪圖"""
    plt.figure(figsize=(10, 10), dpi=100)
    plt.scatter(x_pca[:, 0], x_pca[:, 1], c=y)
    plt.xlabel("component-1", fontsize=11)
    plt.ylabel("component-2", fontsize=11)
    plt.show()


def main():
    data, label = load_data()
    data_pca = construct_my_pca(data, 2, 1)
    draw_figure(data_pca, label)


if __name__ == "__main__":
    main()

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章