【问题标题】:PCA projection centroids and ellipsisPCA 投影质心和省略号
【发布时间】:2020-09-05 21:19:00
【问题描述】:

我目前正在攻读博士学位,我想知道使用 PCA 投影的人是否有想法显示更多信息,R 中的某些库可以默认打印。查看 STHDA 的示例

最好的方法是什么?

【问题讨论】:

    标签: python pca projection


    【解决方案1】:

    我打算寻求提示,但我自己找到了一些答案以在 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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多