PCA投影中心点和省略号

问题描述 投票:0回答:1

我目前正在攻读博士学位,我想知道,如果有人使用PCA投影有什么想法,可以显示一些更多的信息,R中的一些库可以默认打印。请看一个STHDA的例子 PCA Analysis

最好的方法是什么?

python pca projection
1个回答
0
投票

我打算问的技巧,但我发现一些答案自己产生同样的结果在Python上。

我所做的是。

def confidence_ellipse(x, y, ax, n_std=3.0, facecolor='none', **kwargs):
    """
    Create a plot of the covariance confidence ellipse of `x` and `y`

    Parameters
    ----------
    x, y : array_like, shape (n, )
        Input data.

    ax : matplotlib.axes.Axes
        The axes object to draw the ellipse into.

    n_std : float
        The number of standard deviations to determine the ellipse's radiuses.

    Returns
    -------
    matplotlib.patches.Ellipse

    Other parameters
    ----------------
    kwargs : `~matplotlib.patches.Patch` properties
    """
    if x.size != y.size:
        raise ValueError("x and y must be the same size")

    cov = np.cov(x, y)
    pearson = cov[0, 1] / np.sqrt(cov[0, 0] * cov[1, 1])
    # Using a special case to obtain the eigenvalues of this
    # two-dimensionl dataset.
    ell_radius_x = np.sqrt(1 + pearson)
    ell_radius_y = np.sqrt(1 - pearson)
    ellipse = Ellipse((0, 0),
                      width=ell_radius_x * 2,
                      height=ell_radius_y * 2,
                      facecolor=facecolor,
                      **kwargs)

    # Calculating the stdandard deviation of x from
    # the squareroot of the variance and multiplying
    # with the given number of standard deviations.
    scale_x = np.sqrt(cov[0, 0]) * n_std
    mean_x = np.mean(x)

    # calculating the stdandard deviation of y ...
    scale_y = np.sqrt(cov[1, 1]) * n_std
    mean_y = np.mean(y)

    transf = transforms.Affine2D() \
        .rotate_deg(45) \
        .scale(scale_x, scale_y) \
        .translate(mean_x, mean_y)

    ellipse.set_transform(transf + ax.transData)
    return ax.add_patch(ellipse)


method = PCA(n_components=2, whiten=True)  # project to 2 dimensions
projected = method.fit_transform(np.array(inputs[tags['datum']].tolist()))

figure = pyplot.figure()
axis = figure.add_subplot(111)
# Display data
for label in labels:
  color = np.expand_dims(np.array(settings.get_color(label)), axis=0)
  pyplot.scatter(projected[labels == label, 0], projected[labels == label, 1],
                           c=color, alpha=0.5, label=label, edgecolor='none')

# Centroids
for label in labels:
# Centroids
color = np.array(settings.get_color(label))
# Ellipsis
Views.confidence_ellipse(projected[labels == label, 0], projected[labels == label, 1], axis,
                         edgecolor=color, linewidth=3, zorder=0)


The confidence_ellipse came from matplotlib example.
© www.soinside.com 2019 - 2024. All rights reserved.