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)
我正在 运行 使用 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)