Python PCA Plot (Parametri c Ellipse) - Определение и маркировка выбросов - PullRequest
1 голос
/ 04 мая 2020

Я выполняю анализ 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()

Буду признателен за любую помощь.

...