Đâm
Tôi đang cố gắng xác định một kỹ thuật phân cụm với một thước đo tương tự sẽ hoạt động đối với dữ liệu nhị phân phân loại và số.
Khoảng cách Gower là một thước đo khoảng cách hữu ích khi dữ liệu chứa cả biến liên tục và biến phân loại.
Có các kỹ thuật trong phân cụm R kmodes và kprototype được thiết kế cho loại vấn đề này, nhưng tôi đang sử dụng Python và cần một kỹ thuật từ phân cụm sklearn hoạt động tốt với loại vấn đề này.
Tôi đã không thể tìm thấy triển khai Gower Khoảng cách trong Python khi tôi tìm kiếm nó khoảng 4-5 tháng trước. Vì vậy, tôi đã đưa ra thực hiện của riêng tôi.
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)
Liên kết đến cùng một đoạn mã: https://github.com/matchado/Misc/blob/master/gower_dist.py
Liên quan đến kỹ thuật phân cụm, tôi đã không sử dụng những cái bạn đã đề cập. Nhưng tôi đã sử dụng phân cụm theo thứ bậc trong R cùng với khoảng cách gower với thành công trong quá khứ.
Nhìn vào các kỹ thuật phân cụm có sẵn trong scikit learn, Agglomerative Clustering dường như phù hợp với dự luật. http://scikit-learn.org/urdy/modules/clustering.html#hierarchical-clustering
Tôi muốn xây dựng hồ sơ của các phân khúc của cá nhân. có nghĩa là nhóm các cá nhân quan tâm nhiều hơn về các tính năng này.
Khi bạn đã gán nhãn cụm cho từng hàng dữ liệu của mình, cho mỗi cụm xem xét phân phối các tính năng (thống kê tóm tắt cho các biến liên tục & phân phối tần suất cho các biến phân loại). Điều này dễ dàng hơn để phân tích trực quan nếu số lượng tính năng của bạn có thể quản lý được (<20 có thể?).
Nhưng vì bạn có hơn 100 tính năng, tôi đề xuất một cách tiếp cận có tổ chức hơn. Tạo một ma trận với các nhãn cụm trong các cột và chỉ số tóm tắt của các tính năng trong các hàng (Tôi đề nghị sử dụng trung bình cho biến liên tục và tỷ lệ phần trăm xuất hiện của giá trị thường xuyên nhất trong cụm cho biến phân loại)
Nó có thể trông giống như thế này.
╔═══════════════════════╦═══════════╦═══════════╦════╦═══════════╗
║ 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 ║
╚═══════════════════════╩═══════════╩═══════════╩════╩═══════════╝