Одним из методов фильтрация выбросов в непараметрической регрессии является DBSCAN кластеризация
Метод основан на методе кластеризации DBSCAN. DBSCAN - это непараметрический метод обнаружения выбросов на основе плотности в одномерном или многомерном пространстве признаков. Это непараметрический алгоритм кластеризации базированный на плотности: при заданном наборе точек в некотором пространстве он группирует вместе точки, которые плотно упакованы (точки со многими соседними соседями), помечая как выбросы точки, которые лежат поодиночке в областях с низкой плотностью. (у которых ближайшие соседи слишком далеко). DBSCAN является одним из наиболее распространенных алгоритмов кластеризации.
================================
DBSCAN вычисляет графы ближайших соседей и создает кластеры произвольной формы в наборах данных (которые могут содержать шум или выбросы), в отличие от кластеризации k-средних, которая обычно генерирует кластеры сферической формы.В отличие от кластеризации методом k-средних, DBSCAN не требует первоначального указания количества кластеров. Однако DBSCAN требует два параметра, а именно. радиус окрестностей для данной точки данных p (eps или ε) и минимальное количество точек данных в данной ε-окрестности для формирования кластеров (minPts).
===============================
Для кластеризации с использованием DBSCAN используем набор данных экспрессии генов одной клетки корневых клеток Arabidopsis thaliana, обработанный специальным конвейером. Набор данных представляет собой предварительно обработанный метод уменьшения размерности t-SNE. Теперь будем использовать векторы встраивания t-SNE для идентификации кластеров с помощью DBSCAN.
(.env) boris@boris-All-Series:~/DBSCAN$ cat plotDbscan1.py
import pandas as pd
import numpy as np
from sklearn.neighbors import NearestNeighbors
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from collections import Counter
import seaborn as sns
df = pd.read_csv("https://reneshbedre.github.io/assets/posts/tsne/tsne_scores.csv")
print(df.head())
print(df.shape)
f1 = plt.figure(1)
# n_neighbors = 5 as kneighbors function returns distance of point to itself
# first column will be zeros)
nbrs = NearestNeighbors(n_neighbors=5).fit(df)
# Find the k-neighbors of a point
neigh_dist, neigh_ind = nbrs.kneighbors(df)
# sort the neighbor distances (lengths to points) in ascending order
# axis = 0 represents sort along first axis i.e. sort along row
sort_neigh_dist = np.sort(neigh_dist, axis=0)
k_dist = sort_neigh_dist[:, 4]
plt.plot(k_dist)
plt.axhline(y=2.5, linewidth=1, linestyle='dashed', color='k')
plt.ylabel("k-NN distance")
plt.xlabel("Sorted observations (4th NN)")
# plt.show()
f2 = plt.figure(2)
clusters = DBSCAN(eps=2.5, min_samples=4).fit(df)
# get cluster labels
clusters.labels_
# check unique clusters
set(clusters.labels_)
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, -1}
# -1 value represents noisy points could not assigned to any cluster
Counter(clusters.labels_)
# output
Counter({1: 1501, 0: 834, 2: 703, 3: 285, 7: 283, 5: 245, 6: 232, 4: 145, 12: 46, -1: 34, 11: 13, 8: 11, 9: 11, 14: 10, 15: 8, 17: 8, 13: 6, 10: 5, 18: 5, 19: 5, 22: 4, 16: 4, 20: 4, 21: 4})
p = sns.scatterplot(data=df, x="t-SNE-1", y="t-SNE-2", hue=clusters.labels_, legend="full", palette="deep")
sns.move_legend(p, "upper right", bbox_to_anchor=(1.17, 1.2), title='Clusters')
plt.show()
No comments:
Post a Comment