Python PCA 图(参数椭圆)- 识别和标记异常值

Python PCA Plot (Parametric Ellipse) - Identify and Label Outliers

我正在 运行 使用 sklearn 库对某些数据进行 PCA 分析。然后我正在绘制我的 PC1 和 PC2 分数的散点图,我使用这个 link 上的答案作为我的参考 PCA Hotelling's 95% Python 在同一个图上添加一个 95% 的置信度椭圆,然后我正在绘制它使用 pyplot 如下: PCA plot with confidence ellipse output

如您所见,代码可以正常工作并按预期绘制我的数据,因为标签严重重叠。我想只标记异常值(由两个参数方程定义的椭圆外的点),因为这些是我真正感兴趣的唯一点。

有什么方法可以先识别我的异常值,然后只标记它们吗?

下面是我的代码示例(继承自上面的link):

label_buff = pca_raw.iloc[:,2]
labels = label_buff.tolist()

#Calculate ellipse bounds and plot with scores
theta = np.concatenate((np.linspace(-np.pi, np.pi, 50), np.linspace(np.pi, -np.pi, 50)))
circle = np.array((np.cos(theta), np.sin(theta)))
#Where c and d are PC1 and PC2 training score subset for constructing ellipse
sigma = np.cov(np.array((c, d)))
ed = np.sqrt(scipy.stats.chi2.ppf(0.95, 2))
ell = np.transpose(circle).dot(np.linalg.cholesky(sigma) * ed)
c, d = np.max(ell[: ,0]), np.max(ell[: ,1]) #95% ellipse bounds
t = np.linspace(0, 2 * np.pi, 100)
ellipsecos = c * np.cos(t)
ellipsesin = d * np.sin(t) 
# a and b are my PC1 and PC2 raw data scores
plt.scatter(a, b, color = "orange")
for i, txt in enumerate(labels):
    plt.annotate(txt, (a[i], b[i]), textcoords ='offset points', ha='right', va='bottom' )
plt.plot(ellipsecos, ellipsesin, color = 'black');
plt.show();

我试过的 - 如果 ellipsecos 和 ellipsesin 包含定义椭圆的所有点,那么 a 和 b 必须大于那些位于椭圆外的点,但我没有得到预期的结果(所以我不认为我已经能够正确地建立异常值条件)。我更熟悉笛卡尔系统(有可能评估椭圆方程以检查点是否在椭圆内或椭圆外)如果有人可能帮助我使用两个参数方程建立异常值条件,我将不胜感激。:

    #where a and b are PC1 and PC2 scores calculated using sklearn library
for a, b in zip(a, b):
    color = 'red'  # non-outlier color
    if (a > ellipsecos.all()  & (b > ellipsesin.all()) ):  # condition for being an outlier
        color = 'orange'  # outlier color
    plt.scatter(a, b, color=color)
plt.show()

感谢任何帮助。

pca 库可能有用,因为它使用 Hotelling T2 和 SPE/DmodX 方法提供离群值检测。

这里演示了一个例子:。 如果您只想要异常值检测,您可以使用特定的功能,例如:

import pca
outliers_hot = pca.hotellingsT2(PCs, alpha=0.05)
outliers_spe = pca.spe_dmodx(PCs, n_std=2)