一、Python主要聚类分析算法
Python的聚类相关的算法主要在Scikit-Learn中,Python里面实现的聚类主要包括K-Means聚类、层次聚类、FCM以及神经网络聚类,其主要相关函数如下表所示:
对象名 |
函数功能 |
所属工具箱 |
Kmeans |
K均值聚类 |
sklearn.cluster |
AffinityPropagation |
吸引力传播聚类,2007年提出,几乎优于所有其他方法,不需要指定聚类数,但运行效率较低 |
sklearn.cluster |
MeanShift |
均值漂移聚类算法 |
sklearn.cluster |
SpectralClustering |
谱聚类,具有效果比K均值好,速度比K均值块等特点 |
sklearn.cluster |
AgglomerativeClustering |
层次聚类,给出一颗聚类层次树 |
sklearn.cluster |
DBSCAN |
具有噪声的基于密度的聚类算法 |
sklearn.cluster |
BIRCH |
综合的层次聚类算法,可以处理大规模数据的聚类 |
sklearn.cluster |
这些不同模型的使用方法是大同小异的,基本都是先用对应的函数建立模型,然后用.fit()方法来训练模型,训练好之后,就可以用.label_方法给出样本数据的标签,或者用.predict()方法预测新的输入的标签。
此外,Scipy库也提供了一个聚类子库scipy.cluster,里边提供了一些聚类算法,如层次聚类等,但没有Scikit-Learn那么完美和丰富。Scipy.cluster的好处是它的函数名和功能基本和Python是一一对应的(Scipy致力于让Python称为Python般强大),如层次聚类的linkage、dendrogram等。
TSNE是Laurens van der Maaten和Geoffrey Hintton在2008年提出的,它的定位是高维数据的可视化。通常来说输入的特征数是高维的(大于3维),一般难以直接以原特征对聚类结果进行展示。而TSNE提供了一种有效的数据降维方式,让我们可以在2维或者3维的空间中展示聚类结果。
算法演示:
- # @Desc : 用TSNE进行数据降维并展示聚类结果
- import pandas as pd
- # 参数初始化
- inputfile = 'data/consumption_data.xls' # 销量及其他属性数据
- outputfile = 'tmp/data_type.xls' # 保存结果的文件名
- k = 3 # 聚类的类别
- iteration = 500 # 聚类最大循环次数
- data = pd.read_excel(inputfile, index_col='Id') # 读取数据
- data_zs = 1.0 * (data - data.mean()) / data.std() # 数据标准化
- from sklearn.cluster import KMeans
- model = KMeans(n_clusters=k, max_iter=iteration) # 分为k类
- model.fit(data_zs) # 开始聚类
- # 简单打印结果
- r1 = pd.Series(model.labels_).value_counts() # 统计各个类别的数目
- r2 = pd.DataFrame(model.cluster_centers_) # 找出聚类中心
- # 横向连接(0是纵向),得到聚类中心对应的类别下的数目
- r = pd.concat([r