Вот проблема: введение INSPECTION_TYPE приводит к беспорядочной кластеризации: точки, которые должны быть членами кластера, рассматриваются как шум (отмечены серым цветом), а некоторые кластеры перекрываются с другими (точки в кластере ненасыщены на основе по близости к ядру). Кроме того, каждая точка помечается всеми тремя категориями INSPECTION_TYPE, в результате чего точки одновременно оформляются в виде кругов, квадратов и треугольников.
Для справки, вот код:
Код: Выделить всё
import pandas as pd
import hdbscan
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
if __name__ == '__main__':
plot_kwds = {'alpha' : 0.5, 's' : 50, 'linewidth' : 0}
df = pd.read_csv('Rodent_Inspection_20251121.csv')
pd.set_option('display.max_columns', None)
df.dropna(inplace=True)
df = df.head(n=10000)
X = df[['LONGITUDE', 'LATITUDE', 'INSPECTION_TYPE']]
X = pd.get_dummies(X, columns=['INSPECTION_TYPE'], dtype=int)
X_scaled = StandardScaler().fit_transform(X)
hdb = hdbscan.HDBSCAN(min_cluster_size=20)
hdb.fit(X_scaled)
palette = sns.color_palette('bright', len(set(hdb.labels_)) - (1 if -1 in hdb.labels_ else 0))
cluster_colors = [sns.desaturate(palette[col], 0.5) if col >= 0 else (0.5, 0.5, 0.5) for col in hdb.labels_]
marker_map = {
'INSPECTION_TYPE_Initial': 'o',
'INSPECTION_TYPE_BAIT': 's',
'INSPECTION_TYPE_Compliance': '^'
}
for col_name, marker_type in marker_map.items():
plt.scatter(x=X_scaled.T[0], y=X_scaled.T[1], marker=marker_type, c=cluster_colors, **plot_kwds)
print(f'Number of clusters: {len(set(hdb.labels_)) - 1}')
plt.show()
Результирующая диаграмма рассеяния
Увеличена, чтобы показать детали
Вот как диаграмма рассеяния выглядит с исключенным столбцом INSPECTION_TYPE, все остальное остается прежним:
Результирующая диаграмма рассеяния
Увеличено, чтобы показать детали
Подробнее здесь: https://stackoverflow.com/questions/798 ... clustering
Мобильная версия