有时候我们要对离散特征进行相似聚类,数据样例如下:
可以看到有很多非连续的特征,没法直接利用聚类的距离度量,因此这种状况计算类别有几种方式:
1. 图聚类,就是将特征转化为图中的一个点,然后跑图算法。
参考:利用python-sknetwork进行图聚类/社区发现 - 知乎
2. 先用文本距离算法(例如jaccard)计算好相似矩阵,再利用 sklearn dbscana的precomputd参数,先计算好相似矩阵,再进行聚类。
例如:
import numpy as np
from scipy.spatial.distance import pdist
from scipy.spatial.distance import squareform
# 计算各行数据相互之间的杰卡德距离
# A是一个向量矩阵:jaccard代表杰卡德距离
distA=pdist(df.iloc[:,1:].values, metric='jaccard')
# 将distA数组变成一个矩阵
distB = squareform(distA)
print(distB)
#将已经预训练的相似距离矩阵输入dbscan
from sklearn.cluster import DBSCAN
db = DBSCAN(eps=0.6, metric='precomputed', min_samples=2).fit(distB)
#查看分类结果
from collections import Counter
Counter(db.labels_)