day 8.0 降維算法 PCA

# PCA和SVD
from sklearn.decomposition import PCA
# PCA(n_components=None
#     , copy=True
#     , whiten=False
#     , svd_solver='auto'
#     , tol=0.0
#     , iterated_power='auto'
#     , random_state=None)

# todo 重要參數
# n_components 是我們降維後需要的維度
# 如果我們希望可視化一組數據來觀察數據分佈,我們往往將數據降到三維以下,很
# 多時候是二維,即n_components的取值爲2
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA

# todo:1  提取數據集
data = load_iris()
x = data.data
y = data.target
import pandas as pd

# print(pd.DataFrame(x))
# print(y)

# todo: 2 建模
# 調用PCA
pca = PCA(n_components=2)
pca.fit(x)  # 擬合模型
x_dr = pca.transform(x)  # 獲取新矩陣
# print(x_dr.shape)
# print(pd.DataFrame(x_dr))
# print(x_dr)
#  也可以一步到位
# xdr=PCA(2).fit_transform(x)
# x_dr[y == 0, 0]
# print(data.target_names) # ['setosa' 'versicolor' 'virginica']

# todo: 3 可視化
# # plt.figure()
# # plt.scatter(x_dr[y == 0, 0], x_dr[y == 0, 1], c='red', label=data.target_names[0])
# # plt.scatter(x_dr[y == 1, 0], x_dr[y == 1, 1], c='black', label=data.target_names[1])
# # plt.scatter(x_dr[y == 2, 0], x_dr[y == 2, 1], c='orange', label=data.target_names[2])
# # plt.legend()
# # plt.title("PCA of IRIS dataset")
# # plt.show()
# colors = ['red', 'black', 'orange']
# plt.figure()
# for i in [0, 1, 2]:
#     plt.scatter(x_dr[y == i, 0]
#                ,x_dr[y == i, 1]
#                ,alpha=.7
#                ,c=colors[i]
#                ,label=data.target_names[i]
#                )
# plt.legend()
# plt.title('PCA of IRIS dataset')
# plt.show()

# todo: 4 探索降維後的數據
# 屬性explained_variance,查看降維後每個新特徵向量上所帶的信息量大小(可解釋性方差的大小)
# pca.explained_variance_
# 屬性explained_variance_ratio,查看降維後每個新特徵向量所佔的信息量佔原始數據總信息量的百分比
# 又叫做可解釋方差貢獻率
# pca.explained_variance_ratio_
# 大部分信息都被有效地集中在了第一個特徵上
# print(pca.explained_variance_ratio_.sum())

# todo 5: 選擇最好的n_components
# 如果不加限制的時候
# pca_line = PCA().fit(x)
# print(pca_line.explained_variance_ratio_)  # [0.92461872 0.05306648 0.01710261 0.00521218]
# import numpy as np
#
# # np的累加功能
# # print(np.cumsum(pca_line.explained_variance_ratio_)) # [0.92461872 0.97768521 0.99478782 1.        ]
# plt.plot([1, 2, 3, 4], np.cumsum(pca_line.explained_variance_ratio_))
# plt.xticks([1, 2, 3, 4])  # 這是爲了限制座標軸顯示爲整數
# plt.xlabel("number of components after dimension reduction")
# plt.ylabel("cumulative explained variance ratio")
# plt.show()   # 結果發現,特徵 2 或者 3個的時候最好,,一般選擇逐漸變平的轉折點的特徵數量

# todo 6:最大似然估計自選超參數 n_components
# 讓PCA用最大似然估計(maximum likelihood estimation)自選超參數的方法,
# 輸入“mle”作爲n_components的參數輸入
# pca_mle = PCA(n_components="mle")
# pca_mle = pca_mle.fit(x)
# X_mle = pca_mle.transform(x)
# # print(X_mle)
# #可以發現,mle爲我們自動選擇了3個特徵
#
# print(pca_mle.explained_variance_ratio_.sum())  # 0.9947878161267247

# todo 7:按信息量佔比選超參數 n_components
# 輸入[0,1]之間的浮點數,並且讓參數svd_solver =='full',
# 表示希望降維後的總解釋性方差佔比大於n_components
# 指定的百分比,即是說希望保留百分之多少的信息量
# pca_f = PCA(n_components=0.97, svd_solver="full")
# pca_f = pca_f.fit(x)
# X_f = pca_f.transform(x)
# print(X_f)
# print(pca_f.explained_variance_ratio_.sum())

# todo 8:重要參數 svd_solver
# svd_solver: 默認auto,一般就用auto,不必糾結
#               randomized,  適合特徵矩陣巨大,計算量龐大的情況
#               full, 運行精準完整的svd,適合時間充足的情況
#               arpack  可以加快運算速度,適合特徵矩陣很大的時候,但特徵矩陣爲稀鬆矩陣的情況
# random_state

# todo 9 : 重要屬性: components_
#  #### 查看PCA保存的屬性
# # print(PCA(2).fit(x).components_)
# # print(PCA(2).fit(x).components_.shape)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章