使用PyMetis实现聚类融合算法

最近因为看文献看到了聚类融合技术,所以这里做一个简单的整理。

1. 聚类融合简介

  任何聚类算法都对数据集本身对有一定的预先假设。根据“No Free Lunch” 理论,如果数据集本身的分布并不符合预先的假设,则算法的结果将毫无意义,甚至可以说该结果只是给出了一个错误的分布,或者给数据集强加了一个虚构的分布。因此,面对特定的应用问题,如何选择合适的聚类算法是聚类分析研究中的一个重要课题。
  聚类融合将不同算法或者同一算法下使用不同参数得到的结果进行合并,从而得到比单一算法更为优越的结果。
  在聚类融合中,先要产生数据集的多个聚类成员,然后对这些聚类成员的聚类结果采用共识函数进行合并。

1.1 聚类成员的产生
  • 随机选择不同的初始点,运行多次k-means算法 ,从而产生所需要的聚类成员。优点:算法的复杂度低,运行方便等。但是对于分布非球形的数据以及处理高维数据是,该方法的效果并不理想。
  • 使用随机抽样的方法产生数据子集,然后对每个数据子集使用k-means算法生成聚类,从而得到聚类成员。
  • “弱”聚类组成的聚类成员实现的聚类融合方法。弱聚类的产生方法:(1):将多维数据随机投影到一维空间,(2): 用一组随机的超平面将数据空间切割。然后用k-means算法分别对得到的子空间数据进行聚类,组成聚类成员。
  • 使用随机投影将高维数据投影到低维空间,通过多次投影得到若干个数据子集,然后用EM聚类算法对每次的投影子集聚类,从而得到聚类成员。
    综上:通过选择不同的算法,对一个算法选择不同的初始值、选择不同的对象子集、选择不同的特征子集投影到数据子空间等来产生聚类成员。
1.2 共识函数设计
  • Co-Association矩阵:用于衡量数据点之间的相似度,其中第i个点和第j个数据点之间的相似度为:a_ij=(i与j同属一聚类的次数)/(聚类算法总次数) co_association矩阵中大于0.5的点即认为属于最终聚类结果中的同一类。
  • 基于超图的方法:CPSA、HGPA、MCLA
    • CPSA: 首先得到聚类成员的co-association值,然后用基于图论的聚类算法METIS算法进行聚类,得到最终的聚类成果.

2. Python实现

from sklearn.datasets import load_iris
import pandas as pd
from sklearn.cluster import KMeans
import numpy as np
import pymetis

X,y=load_iris(return_X_y=True)
X=pd.DataFrame(X)
X_result=[]

#调整k-means的初始参数得到不同的聚类成员
for k in [2,3,4,5,6]:
    kmeans=KMeans(n_clusters=k,random_state=0).fit(X)
    X_result.append(kmeans.labels_)

X_result=pd.DataFrame(X_result)
X_result=X_result.T
matrix=[]
#构造co-association矩阵,并保留矩阵中大于0.5的值对应的数据项索引
for i in range(X_result.shape[0]):
    tmp=X_result.drop(i)
    tmp=(tmp==X_result.iloc[i,:]).sum(axis=1)
    matrix.append(tmp[tmp>=3].index)
    
n_cuts, membership = pymetis.part_graph(3, adjacency=matrix)

nodes_part_0 = np.argwhere(np.array(membership) == 0).ravel() # 第一组聚类结果
nodes_part_1 = np.argwhere(np.array(membership) == 1).ravel() # 第二组聚类结果
nodes_part_2 = np.argwhere(np.array(membership) == 2).ravel() # 第三组聚类结果

你可能感兴趣的:(机器学习,数据分析,数据挖掘,big,data)