聚类分析: 即在没有给定类别标签的情况下根据数据的相似度进行样本分组。将无标签标记的数据聚集为多个簇,每个簇就是一类,是一种非监督学习的方法。
应用: 从消费者数据库中区分出不同的消费群体,并概括出每一类消费者的消费习惯或者模式; 也可作为数据分析算法中其他分析算法的一个预处理步骤,如异常值识别、连续特征离散化等。
聚类划分原则: 组内举例最小化,组间举例最大化。
常用的聚类方法: 有那么五六种。
常用的聚类分析算法:
算法名称算法描述K-MeansK-均值聚类也称为快速聚类法,在最小误差函数的基础上将数据划分为预定的类数K,适用于处理大量数据。K-中心点K-中心点算法不采用簇对象的平均值作为簇中心,而选用簇中离平均值最近的对象作为簇中心。系统聚类只适合小数据量时使用,大数据量时速度很慢。 sklenrn.cluster中包含的聚类算法及适用范围: 有那么六种。 这些不同模型的使用方法是大同小异的,基本都是先用对应的函数简历模型,然后用.fit()方法来训练模型,训练好之后,就可以用.label_的方法给出样本数据的标签,或者是可以用.predict的方法预测新的输入的标签。此外,Scipy库也提供了一个聚类子库scipy.cluster,里边提供了一些聚类算法,如层次聚类,但没有sklearn那么全面。
聚类算法实现需要sklearn的估计器,该估计其有两个方法:fit和predict。 fit:主要用于训练算法。可接收有监督学习的训练集及其标签两个参数,也可接受无监督学习的数据。 predict:用于预测有监督学习的测试集标签,也可以用于划分无监督学习传入数据的类别。
使用sklearn估计器构建k-means聚类模型
#构建聚类模型 from sklearn.datasets import load_iris from sklearn.preprocessing import MinMaxScaler from sklearn.cluster import KMeans iris = load_iris() iris_data = iris['data'] iris_target = iris['target']#标签,之后可能将预测的和原始的标签比较看是否预测正确 iris_names = iris['target_names'] #有啥用? scale = MinMaxScaler().fit(iris_data)#训练数据标准化规则 iris_dataScale = scale.transform(iris_data)#应用规则 kmeans = KMeans(n_clusters = 3, random_state=123).fit(iris_dataScale)#训练kmeans聚类规则 print("构建的K-Means模型为:\n", kmeans) 用预构建的模型预测一下: #通过鸢尾花的特征预测其所属的类别 print("请输入你要预测的鸢尾花的特征:\n") a = input("花瓣长度:") b = input("花瓣宽度:") c = input("花萼长度:") d = input("花萼宽度:") result = kmeans.predict([[a, b, c, d]])#预测规则 print("你的花预测其类别为:", result[0]) 聚类结果可视化 通过sklearn的manifold模块中的TSNE函数可以实现多维数据的可视化展现。 TSNE: T分布随机邻居嵌入。本质是一种降维和可视化的技术。 可视化kmeans聚类结果的过程: 1)先将原始数据data降维,降成几维自己决定,将降维后的数据(tsne.bedding_)转换成DataFrame的格式,方便之后画图; 2)然后将聚类结果的标签kmeans.labels_新建一列后也存储到之前新建的这个DataFrame里。 3)提取出不同标签下的数据(比如有三类你就提取出三类的DataFrame数据),方便之后画图。 4)然后就是画图就可以了。 #聚类结果的可视化 import pandas as pd from sklearn.manifold import TSNE import matplotlib.pyplot as plt #使用TSNE函数进行数据降维,降成两维 tsne = TSNE(n_components=2, init='random', random_state=177).fit(iris_data)#依然是训练TSNE规则 df = pd.DataFrame(tsne.embedding_) #提取不同标签的数据 df['labels'] = kmeans.labels_ #在这个降维后的二维数据里增加了一列kmeans聚类结果标签数据 df0 = df[df['labels'] == 0] df1 = df[df['labels'] == 1] df2 = df[df['labels'] == 2] #绘图 fig = plt.figure(figsize=(9,6)) plt.plot(df0[0], df0[1], 'bo', df1[0], df1[1], 'r*', df2[0], df2[1], 'gD', ) plt.show()评价标准:组内是相似的,组间的差别较大,这样的聚类模型较好。sklearn.metrics模块提供算法评价模型。
模型评价的方法太多了。我们选择适合的就好,掌握几种常见方法即可。
使用ARI评价法adjusted_rand_score:实现原理是下图公式。metrics.adjusted_rand_score(labels_true, labels_pred),值越接近1越好。 #使用ARI指数评价法,值越大越好 from sklearn.metrics import adjusted_rand_score for i in range(2,7): #训练模型 kmeans = KMeans(n_clusters=i, random_state=123).fit(iris_data) #评价 score = adjusted_rand_score(iris_target, kmeans.labels_) print("iris数据聚%d类的adjusted_rand_score指数分值为:%f" %(i, score))结果:可以看书还是聚三类的ARI指数最大
使用FMI评价法lowlkes_mallows_score评价聚类模型:测量一组点的两个聚类的相似性,值越接近1越好。 #使用FMI评价法评价聚类模型(测量一组点的两个聚类之间的相似性) from sklearn.metrics import fowlkes_mallows_score for i in range(2,7):#聚的类数i使得每次的评分变化 #训练模型 kmeans = KMeans(n_clusters = i, random_state=123).fit(iris_data) #评价 score = fowlkes_mallows_score(iris_target, kmeans.labels_)#参数为真实标签值和聚类标签值 print("iris数据聚%d类的FMI评价分值为:%f" %(i, score))结果:可以看出,当参数n_clusters为3的时候,也就是聚成3类的时候,评分最高。
使用calinski_harabasz指数calinski_harabasz_score评价法:计算Calinski和Harabasz分数。,值越大越好。 原理:如公式所示。 其中,n表示聚类的数目 ,k 表示当前的类, trB(k)表示类间离差矩阵的迹, trW(k) 表示类内离差矩阵的迹。有关公式更详细的解释可参考论文“ A dendrite method for cluster analysis ”。可以得出 CH越大代表着类自身越紧密,类与类之间越分散,即更优的聚类结果。 #使用calinski_harabasz指数评价法,值越大越好 from sklearn.metrics import calinski_harabaz_score for i in range(2,7): #训练模型 kmeans = KMeans(n_clusters=i, random_state=123).fit(iris_data) #评价 score = calinski_harabaz_score(iris_data, kmeans.labels_) print("iris数据聚%d类的calinski_harabasz指数分值为:%f" %(i, score))我的calinski_harabaz_score报错了,ImportError: cannot import name 'calinski_harabaz_score',估计又是版本的问题~