当前位置: 首页 > 后端技术 > Python

pyclustering.cluster.kmeans使用说明

时间:2023-03-25 19:53:02 Python

pyclustering是一个用于聚类分析的python库。本文将解释kmeans库。最近,我正在研究kmeans算法。有想法替换kmeans的distance函数,但是sklearn没有提供接口,自制的轮子效果不好。终于找到了pyclustering这个库,所以在这里记录下自己的心得。kmeans训练过程如博客所示。使用的包是frompyclustering.cluster.center_initializerimportkmeans_plusplus_initializerfrompyclustering.cluster.kmeansimportkmeansimportnumpyasnp1。初始化质心:initial_centers=kmeans_plusplus_initializer(x,cluster_num).initialize()wherexisnum,clusternumber\。2.实例化kmeans类:kmeans_instance=kmeans(x,initial_centers,metric=metric)metric是距离的度量,默认是欧式距离,下面会详细介绍。3.训练:kmeans_instance.process()3.分类:clusters=kmeans_instance.get_clusters()将上述训练数据x以列表的形式进行分类。例如数据a、b、c的类别分别为1、1、0,则返回索引列表[[0,0],[1]]4.返回质心:cs=kmeans_instance.get_centers()5.预测:关于预测,这里给出了几种方法以适应不同的场景。第一种是直接使用实例类根据之前得到的clusterslabel=np.array([0]*len(x))fori,subinenumerate(clusters):label进行预测label=kmeans_instance.predict(x)[sub]=i根据得到的centroid,这里直接封装成一个函数,metric是一个度量函数defClu_predict(x,cs,class_num,metric=distance_metric(type_metric.EUCLIDEAN)):differences=np.zeros((len(x),class_num))forindex_pointinrange(len(x)):differences[index_point]=[metric(x[index_point],c)forcincs]label=np.argmin(differences,axis=1)returnlabel注意这里效率很全,建议自己定义矩阵运算。6.度数:使用库的度数,以曼哈顿距离为例子:manhattan_metric=distance_metric(type_metric.MANHATTAN)kmeans_instance=kmeans(x,initial_centers,metric=manhattan_metric)把type_metric.后面的替换掉的纱就进行类,库有提供类type_metric(IntEnum):"""!@brief计算两点之间距离的模块中支持的度量的枚举。"""##Euclidean距离,更多信息参见函数'euclidean_distance'。EUCLIDEAN=0##SquareEuclidean距离,有关更多信息,请参阅函数“euclidean_distance_square”。EUCLIDEAN_SQUARE=1##曼哈顿距离,有关更多信息,请参阅函数“manhattan_distance”。MANHATTAN=2##Chebyshev距离,有关更多信息,请参阅函数“chebyshev_distance”。CHEBYSHEV=3##Minkowski距离,有关更多信息,请参阅函数“minkowski_distance”。MINKOWSKI=4##堪培拉距离,有关更多信息,请参阅函数“canberra_distance”。CANBERRA=5##卡方距离,更多信息见函数'chi_square_距离'。CHI_SQUARE=6##高尔距离,更多信息见函数'gower_distance'。GOWER=7##用于计算两点之间距离的用户定义函数。USER_DEFINED=1000使用自定义距离,以余弦距离为例:defcosine_distance(a,b):a_norm=np.linalg.norm(a)b_norm=np.linalg.norm(b)similiarity=np.dot(a,b.T)/(a_norm*b_norm)dist=1.-similiarityreturndistmetric=distance_metric(type_metric.USER_DEFINED,func=cosine_distance)distance只需要计算两点之间的距离