首先:得对数据进行标准化
min-max标准化(离差标准化):对原始数据进行线性变换,是结果落到【0,1】区间,转换方法为 X'=(X-min)/(max-min),其中max为样本数据最大值,min为样本数据最小值。
from sklearn import preprocessingX = preprocessing.MinMaxScaler().fit_transform(X)
一、K-means:(适用于连续数据、采用欧式距离(或余弦距离))
算法步骤:
1.确立最终聚类处理得到簇的个数k。(若已知分几类,则k确定,若k未知,可由轮廓系数Silhouette Coefficient和Calinski-Harabasz Index确定)
Calinski-Harabasz指标
参数:X: 训练特征数据;labels: 预测的样本类;
输出:score: float, 结果的Calinski-Harabaz分数, 分数越大越好.
2.选取k条初始记录作为质心,k条记录的欧式具体尽量大,说明记录的相关性低,提高聚类效果;
3.从数据集读取一条记录,计算与k个质心的欧式距离,并归并到距离最短的一个簇内,并更新簇的质心(质心就是各个维度的算术平均);重复第三部直至将数据集读取完;
4.重新调整记录所属的簇,这一步也是比较难理解的。因为每个簇的质心随着加入记录而更新改变,因此导致原先属于这个簇的记录由于与现在改变后的另外一个簇的质心距离更短,所以也应该重新将它分配到更短距离的那个簇上。分配后更新所有簇的质心,不断重复第四步知道没有记录重新分配。
from sklearn.cluster import KMeans
from sklearn import metrics#KMeans
KM = KMeans(n_clusters=k).fit_predict(X)
#计算calinski_harabaz分数 用于确定k
score = metrics.calinski_harabaz_score(X,y_pred)
二、K-modes(适用于离散数据,采用汉明距离)
K-modes算法是按照k-means算法的核心内容进行修改,针对分类属性的的1.度量。2.更新质心的问题而改进。具体如下
1.度量记录之间的相关性D的计算公式是比较两记录之间,属性相同为0,不同为1.并所有相加。因此D越大,即他的不相关程度越强(与欧式距离代表的意义是一样的);
汉明距离
汉明距离/Hamming Distance也能用来计算两个向量的相似度;即通过比较向量每一位是否相同,若不同则汉明距离加1,这样得到汉明距离。向量相似度越高,对应的汉明距离越小。如10001001和10110001有3位不同。
2.更新modes,使用一个簇的每个属性出现频率最大的那个属性值作为代表簇的属性值(如{[a,b] [a,c] [c,b] [b,c]})代表模式为[a,b]或者[a,c];
from kmodes.kmodes import KModesKM = KModes(n_clusters=i,init='Huang').fit_predict(X)
三、K-prototypes(适用于混合数据(有离散有连续))
K-Prototype算法是结合K-Means与K-modes算法,针对混合属性的,解决2个核心问题如下:
1.度量具有混合属性的方法是,数值属性采用K-means方法得到P1,分类属性采用K-modes方法P2,那么D=P1+a*P2,a是权重,如果觉得分类属性重要,则增加a,否则减少a,a=0时即只有数值属性
2.更新一个簇的中心的方法,方法是结合K-Means与K-modes的更新方法
from kmodes.kprototypes import KPrototypesKP = KPrototypes(n_clusters=self.k, init='Cao').fit_predict(X, categorical=self.dis_col)
参考:
https://www.jianshu.com/p/fc91fed8c77b
https://blog.csdn.net/peterchan88/article/details/78432082