Principal Component Analysis (PCA)

昨天在研究MDS的时候顺便把PCA也复习了一下,所以今天来把它相关的原理补上(非常推荐观看reference的影片呦,大概是我看过PCA讲解得最清楚的!),PCA是另一种把高维度资料转化成低维度资料的方法,让我们将本多维度的资料视觉化。

PCA原理

主要利用“线性”办法降维,也就是降维生成的每一个PC都是原本变数(x1,x2,x3...)的线性组合,因为是线性组合,我们也可以透过beta对应到哪一些变数是比较有用的,比如 PC1=0.8x1+0.25x2,由於0.8>0.25,可以知道x1为主要成份并有较大的影响。

那PC是如何生成的呢?
假设我们现在有一个实验室资料集,我们想知道老鼠间基因的相似程度(gene1,gene2),我们先把资料画出。
https://ithelp.ithome.com.tw/upload/images/20210923/2014200450M9d3e0GL.png

接着移动资料,将中心点调整至(0,0),并找出一条通过原点的线,让每个点到这条线的平方距离最小,这条线就会是我们的PC1,而PC2就是垂直於PC1的线,若有PC3,则为一条垂直於PC1与PC2的线,依此类推。

https://ithelp.ithome.com.tw/upload/images/20210923/20142004N6KuYQgcn2.png

在实际计算中,其实pc计算距离时并不是计算min(点到线的距离平方和),而是计算max(点投影在线上之後到原点的距离平方和)(eigenvalue),我们可以用简单的毕氏定理知道这是同一件事:当a固定,想求出最小的b等同於球出最大的c。
https://ithelp.ithome.com.tw/upload/images/20210923/20142004dw5eXmIp2G.png

最後呈现的图,就是把图旋转,让PC1为x轴,PC2为y轴,再把资料点根据投影在两条线上的位置画出对应位置:
https://ithelp.ithome.com.tw/upload/images/20210923/20142004dp4Do82O6G.png
https://ithelp.ithome.com.tw/upload/images/20210923/20142004XPsJKlkZO3.png

想要降成几个维度呢?看看variance

另一个常见的问题是要将资料将成几个维度,就像是k-mean cluster要定义的k一般,这时候我们可以看看每个pc解释了多少资料离散程度,variance公式为 eigenvalue/(n-1),加总所有PC的variance并算出每个PC解释的比例,解释比例越高代表PC越有效(通常variance解释比例会逐渐下降),我们可以由此找出想要的PC数量,比如总共有5个PC,但PC1,PC2已经解释95%的离散,那选择2个PC就可以很好的表达资料并不需要再增加。
https://ithelp.ithome.com.tw/upload/images/20210923/20142004jM1XgNkIiw.png

Python

我们一样用昨天iris dataset来举例:

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.manifold import MDS
from sklearn.preprocessing import MinMaxScaler

data = load_iris()
X = data.data

scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca = pca.fit_transform(X_scaled)

pca_df = pd.DataFrame(data = pca,columns = ['pc1', 'pc2'])
pca_df['target']=data.target

https://ithelp.ithome.com.tw/upload/images/20210923/20142004JWTzBPXr8Y.png

fig = plt.figure(figsize = (5,5))
ax = fig.add_subplot(1,1,1) 

targets = [0, 1, 2]
colors = ['r', 'g', 'b']
for target, color in zip(targets,colors):
    indices = pca_df['target'] == target
    ax.scatter(pca_df.loc[indices, 'pc1']
               , pca_df.loc[indices, 'pc2']
               , c = color
               ,label=data.target_names[target])
ax.legend()
ax.set_xlabel('Principal Component 1', fontsize = 15)
ax.set_ylabel('Principal Component 2', fontsize = 15)
ax.set_title('2 component PCA', fontsize = 20)
ax.grid()

https://ithelp.ithome.com.tw/upload/images/20210923/20142004K6AqGdzFN9.png

pca.explained_variance_ratio_

https://ithelp.ithome.com.tw/upload/images/20210923/201420042gBpZfBcd5.png

references:
https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html
https://www.youtube.com/watch?v=FgakZw6K1QQ


<<:  Day 22:「您好,欢迎登入 Vuta 奇幻世界」- 事件处理

>>:  Day 8 常利用的 Docker 指令

抽象类别与介面 (1)

在上一篇文章中提到,我们可以将不同类别当中的共同属性或方法,提取出来放在 parent 类别当中,然...

个人笔记 维修单派工 关联表

开始绘制维修单派工关联表,画错蛮多次。我学习的方式,先在网路上找相关的图参考,思考後进行绘制动作。画...

硬碟上的资料是否有重量?

我的学生前些日子突然脑洞爆发,问我:“存满资料的硬碟是不是比空硬碟重?资料是否有重量?” 我也查了大...

[Day07] swift & kotlin 入门篇!(5) 基础语法-集合物件

集合物件 集合物件代表 "一个放置一堆东西的地方" 它可以是有序 有可以是无序的...

[Day18] - Django-REST-Framework API 呼叫及介面操作

昨天我们使用 DRF 实作出了第一个 API -- 商品查询 API 。相信大家都有感到成就感吧!以...