首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >降维- PCA解释

降维- PCA解释
EN

Stack Overflow用户
提问于 2020-12-27 22:06:39
回答 1查看 207关注 0票数 1

我不认为我对PCA有很好的理解,有人能帮我解决下面的困惑吗?

以虹膜数据集为例,我有4个协变量,x1:萼片长度;x2:萼片宽度;x3:花瓣长度;x4:花瓣宽度。公式如下,a1,a2,a3,a4是协变量的权重。PCA将尝试使用不同的线性变换来最大限度地利用方差。同时也遵循a1^2 + a2^2 + a3^2 + a4^2=1的规则,我想知道a1,a2,a3,a4的值。

代码语言:javascript
复制
a1*x1 + a2*x2 + a3*x3 + a4*x4

下面有关于python的代码,我认为这是正确的吗?

代码语言:javascript
复制
# load libraries
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
import seaborn as sns
import pandas as pd
import numpy as np

iris = load_iris()
X = iris.data
df = pd.DataFrame(X,columns=iris.feature_names)

pca = decomposition.PCA(n_components = 4)
digits_pca_4 = pca.fit(X)
digits_pca_4.explained_variance_ratio_

结果是

代码语言:javascript
复制
array([0.92461872, 0.05306648, 0.01710261, 0.00521218])

我的问题是:

我认为a1=sqrt(0.92),a2=sqrt(0.005),a3=sqrt(0.0 2),a4=sqrt(0.005)是正确的吗?

第二个问题:

如果我选择a1=a2=a3=a4=0.5的线性组合,与PCA的方差相比,它的方差是多少(假设它小于PCA的结果,因为PCA使方差最大化?)如何在python中获得何时a1=a2=a3=a4=0.5的方差?与PCA的差异是下面的代码吗?

代码语言:javascript
复制
pca.explained_variance_.sum()

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-28 18:24:47

要直接回答你的问题:不,你最初的解释是不正确的

解释

PCA的实际投影是矩阵乘Y = (X - u) W,其中u是X (u = X.mean(axis=0))的均值,W是PCA发现的投影矩阵:n x p正交矩阵,n是原始数据维数,p是期望输出维数。您给出的表达式(a1*x1 + a2*x2 + a3*x3 + a4*x4)并不意味着所有值都是标量。充其量,它可能意味着计算单个组件,使用下面一列j of W作为a_kY[i, j] == sum(W[k, j] * (X[i, k] - u[k]) for k in range(n))

在任何情况下,您都可以使用pca = PCA.fit(...)检查vars(pca)结果的所有变量。特别是,上面描述的投影矩阵可以被发现为W = pca.components_.T。下列陈述可以核实:

代码语言:javascript
复制
# projection
>>> u = pca.mean_
... W = pca.components_.T
... Y = (X - u).dot(W)
... np.allclose(Y, pca.transform(X))
True

>>> np.allclose(X.mean(axis=0), u)
True

# orthonormality
>>> np.allclose(W.T.dot(W), np.eye(W.shape[1]))
True

# explained variance is the sample variation (not population variance)
# of the projection (i.e. the variance along the proj axes)
>>> np.allclose(Y.var(axis=0, ddof=1), pca. explained_variance_)
True

图形演示

理解主成分分析最简单的方法是,它纯粹是n-D中的旋转(平均去除后),而只保留第一个p维。旋转使数据的最大方差方向与投影中的自然轴对齐。

下面是一些演示代码,可以帮助您可视化正在发生的事情。请同时阅读PCA维基百科页面

代码语言:javascript
复制
def pca_plot(V, W, idx, ax):
    # plot only first 2 dimensions of W along with axes W
    colors = ['k', 'r', 'b', 'g', 'c', 'm', 'y']
    u = V.mean(axis=0)  # n
    axes_lengths = 1.5*(V - u).dot(W).std(axis=0)
    axes = W * axes_lengths  # n x p
    axes = axes[:2].T  # p x 2
    ax.set_aspect('equal')
    ax.scatter(V[:, 0], V[:, 1], alpha=.2)
    ax.scatter(V[idx, 0], V[idx, 1], color='r')
    hlen = np.max(np.linalg.norm((V - u)[:, :2], axis=1)) / 25
    for k in range(axes.shape[0]):
        ax.arrow(*u[:2], *axes[k], head_width=hlen/2, head_length=hlen, fc=colors[k], ec=colors[k])

def pca_demo(X, p):
    n = X.shape[1]  # input dimension
    pca = PCA(n_components=p).fit(X)
    u = pca.mean_
    v = pca.explained_variance_
    W = pca.components_.T
    Y = pca.transform(X)
    assert np.allclose((X - u).dot(W), Y)
    
    # plot first 2D of both input space and output space
    # for visual identification: select a point that's as far as possible
    # in the direction of the diagonal of the axes cube, after normalization
    # Z: variance-1 projection
    Z = (X - u).dot(W/np.sqrt(v))
    idx = np.argmax(Z.sum(axis=1) / np.sqrt(np.linalg.norm(Z, axis=1)))

    fig, ax = plt.subplots(ncols=2, figsize=(12, 6))

    # input space
    pca_plot(X, W, idx, ax[0])
    ax[0].set_title('input data (first 2D)')

    # output space
    pca_plot(Y, np.eye(p), idx, ax[1])
    ax[1].set_title('projection (first 2D)')
    
    return Y, W, u, pca

示例

虹膜数据

代码语言:javascript
复制
# to better understand the shape of W, we project onto
# a space of dimension p=3
X = load_iris().data
Y, W, u, pca = pca_demo(X, 3)

请注意,投影实际上只是(X - u) W

代码语言:javascript
复制
>>> np.allclose((X - u).dot(W), Y)
True

合成椭球数据

代码语言:javascript
复制
A = np.array([
    [20, 10, 7],
    [-1, 3, 7],
    [5, 1, 2],
])
X = np.random.normal(size=(1000, A.shape[0])).dot(A)
Y, W, u, pca = pca_demo(X, 3)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65470930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档