Einen Stich machen:
Ich versuche, eine Clustering-Technik mit einem Ähnlichkeitsmaß zu identifizieren, das für kategoriale und numerische Binärdaten funktioniert.
Gower Distance ist eine nützliche Entfernungsmetrik, wenn die Daten sowohl kontinuierliche als auch kategoriale Variablen enthalten.
Es gibt Techniken in R kmodes Clustering und kprototype, die für diese Art von Problem entwickelt wurden, aber ich verwende Python und benötige eine Technik aus sklearn Clustering, die bei dieser Art von Problemen gut funktioniert.
Ich konnte keine Implementierung von Gower Distance in Python finden, als ich vor ungefähr 4-5 Monaten danach suchte. Also habe ich mir eine eigene Implementierung ausgedacht.
import pandas as pd
import numpy as np
from sklearn.neighbors import DistanceMetric
def gower_distance(X):
"""
This function expects a pandas dataframe as input
The data frame is to contain the features along the columns. Based on these features a
distance matrix will be returned which will contain the pairwise gower distance between the rows
All variables of object type will be treated as nominal variables and the others will be treated as
numeric variables.
Distance metrics used for:
Nominal variables: Dice distance (https://en.wikipedia.org/wiki/S%C3%B8rensen%E2%80%93Dice_coefficient)
Numeric variables: Manhattan distance normalized by the range of the variable (https://en.wikipedia.org/wiki/Taxicab_geometry)
"""
individual_variable_distances = []
for i in range(X.shape[1]):
feature = X.iloc[:,[i]]
if feature.dtypes[0] == np.object:
feature_dist = DistanceMetric.get_metric('dice').pairwise(pd.get_dummies(feature))
else:
feature_dist = DistanceMetric.get_metric('manhattan').pairwise(feature) / np.ptp(feature.values)
individual_variable_distances.append(feature_dist)
return np.array(individual_variable_distances).mean(0)
Der Link zum selben Code: https://github.com/matchado/Misc/blob/master/gower_dist.py
In Bezug auf die Clustering-Technik habe ich die von Ihnen erwähnten nicht verwendet. Aber ich habe in der Vergangenheit mit Erfolg hierarchisches Clustering in R zusammen mit Gower-Distanz verwendet.
Mit Blick auf die in scikit learn verfügbaren Clustering-Techniken scheint Agglomerative Clustering genau das Richtige für Sie zu sein. http://scikit-learn.org/stable/modules/clustering.html#hierarchical-clustering
Ich möchte Profile von Segmenten von Individuen erstellen. Dies bedeutet, dass sich diese Gruppe von Personen mehr um diese Funktionen kümmert.
Nachdem Sie jeder Zeile Ihrer Daten Cluster-Labels zugewiesen haben, überprüfen Sie für jeden Cluster die Verteilung der Features (Zusammenfassungsstatistiken für kontinuierliche Variablen und Häufigkeitsverteilungen für kategoriale Variablen). Dies ist einfacher visuell zu analysieren, wenn Ihre Anzahl von Funktionen verwaltbar ist (<20 vielleicht?).
Da Sie jedoch über 100 Funktionen verfügen, empfehle ich einen besser organisierten Ansatz. Erstellen Sie eine Matrix mit Cluster-Beschriftungen in den Spalten und der Zusammenfassung der Features in den Zeilen (ich empfehle, den Median für die kontinuierliche Variable und das prozentuale Auftreten des häufigsten Werts im Cluster für die kategoriale Variable zu verwenden).
Es könnte ungefähr so aussehen.
╔═══════════════════════╦═══════════╦═══════════╦════╦═══════════╗
║ Feature ║ Cluster 1 ║ Cluster 2 ║ … ║ Cluster N ║
╠═══════════════════════╬═══════════╬═══════════╬════╬═══════════╣
║ Numeric feature 1 ║ 15 ║ 37 ║ .. ║ 1 ║
║ Numeric feature 2 ║ 34 ║ 56 ║ … ║ 56 ║
║ Categorical feature 1 ║ 47% ║ 87% ║ … ║ 25% ║
║ … ║ … ║ … ║ … ║ … ║
║ Categorical feature N ║ 25% ║ 91% ║ … ║ 11% ║
║ Numeric feature N ║ 0.2 ║ 0.7 ║ … ║ 0.5 ║
╚═══════════════════════╩═══════════╩═══════════╩════╩═══════════╝