Я выполняю анализ PCA для некоторых данных с использованием библиотек sklearn. Затем я делаю точечную диаграмму моих оценок ПК1 и ПК2 и добавляю эллипс с доверительной вероятностью 95% на тот же график, используя ответ по этой ссылке в качестве моей справочной информации PCA Hotelling's 95% Python, а затем Я строю его, используя pyplot, как показано ниже: График PCA с выводом по эллипсу с доверительной вероятностью
Как видите, код работает и отображает мои данные, как и ожидалось, поскольку метки сильно перекрываются. Я думал только о том, чтобы пометить свои выбросы (точки вне эллипса, определяемого двумя параметрическими уравнениями c), поскольку это единственные точки, которые меня действительно интересуют.
Есть ли способ сначала идентифицировать мои выбросы и затем пометить их только?
Ниже приведен пример кода (унаследованный по ссылке выше):
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();
Что я пробовал - если в эллипсосе и эллипсине есть все точки, определяющие эллипс, то a и b должны быть больше, чем эти точки до l ie вне эллипса, но я не получил ожидаемого результата (поэтому я не думаю, что смог правильно установить sh условие выброса). Я более знаком с декартовой системой (с возможностью оценивать уравнение эллипса, чтобы проверить, были ли точки внутри или вне эллипса), если кто-то, возможно, поможет мне установить sh условие выброса, используя два параметра параметрических c, которые Буду признателен .:
#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()
Буду признателен за любую помощь.