Monday, August 1, 2022

How Outliers are Filtered in Nonparametric Regression

Одним из  методов фильтрация выбросов в непараметрической регрессии является 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