层次聚类和Kmeans

文章目录层次聚类层次聚类流程层次聚类优缺点Kmeans聚类Kmeans聚类流程K-Means的优缺点层次聚类层次聚类流程(1) 计算两两样本之间的距离;(2) 将距离最小的两个类合并成一个新类;(3) 重新计算新类与所有类之间的距离;(4) 重复(2)、(3),直到所有类最后合并成一类。import scipyimport scipy.cluster.hierarchy as sc...
摘要由CSDN通过智能技术生成

层次聚类

层次聚类流程

(1) 计算两两样本之间的距离;
(2) 将距离最小的两个类合并成一个新类;
(3) 重新计算新类与所有类之间的距离;
(4) 重复(2)、(3),直到所有类最后合并成一类。
层次聚类例子

import scipy
import scipy.cluster.hierarchy as sch
from scipy.cluster.vq import vq,kmeans,whiten
import numpy as np
import matplotlib.pylab as plt
 
#生成待聚类的数据点,这里生成了20个点,每个点4维:
points=scipy.randn(20,4)  
#加一个标签进行区分
A=[chr(i+ord('A')) for i in range(20)]

#层次聚类
#生成点与点之间的距离矩阵,这里用的欧氏距离:
disMat = sch.distance.pdist(points,'euclidean') 
#进行层次聚类,method='average'用平均数来计算新合成类别的坐标:
Z=sch.linkage(disMat,method='average') 
#将层级聚类结果以树状图表示出来并保存为plot_dendrogram.png
P=sch.dendrogram(Z,labels=A)

在这里插入图片描述

层次聚类优缺点

优点
1、距离和规则的相似度容易定义,限制少;
2、不需要预先制定聚类数;
3、可以发现类的层次关系。
缺点
1、计算复杂度太高。

Kmeans聚类

Kmeans聚类流程

(1) 首先确定一个k值;
(2) 随机给定k个质心;
(3) 对数据集中每一个点,计算其与每一个质心的距离(如欧式距离),离哪个质心近,就划分到那个质心所属的集合;
(4) 把所有数据归好集合后,一共有k个集合。然后重新计算每个集合的新的质心;
(5) 重复(3) (4) ;
(6) 如果新计算出来的质心和原来的质心之间的距离小于某一个设置的阈值,算法终止。

def Kmeans_analysis(X,k,train=True):
    y_pred=None
    if train==True:
        if X.shape[1]==2:
            silhouette = []
            sse = []
            for n_clusters in k:
                n_clusters = n_clusters
                fig, (ax1, ax2) = plt.subplots(1, 2)
                fig.set_size_inches(18, 7)
                ax1.set_xlim([-0.1, 1])
                ax1.set_ylim([0, X.shape[0] + (n_clusters + 1) * 10])
                clusterer = KMeans(n_clusters=n_clusters, random_state=10).fit(X)
                cluster_labels = clusterer.labels_
                silhouette_avg = silhouette_score(X, cluster_labels)
                silhouette.append(silhouette_avg)#计算轮廓系数
                #meanDispersions.append(sum(np.min(cdist(X, clusterer.cluster_centers_, 'euclidean'), axis=1)) / X.shape[0])#计算平均畸变程度,跟SSE同一原理
                sse.append(clusterer.inertia_)#计算SSE
                print("当 k =", n_clusters,"平均轮廓系数为:", silhouette_avg)
                sample_silhouette_values = silhouette_samples(X, cluster_labels)
                y_lower = 10
                for i in range(n_clusters):
                    ith_cluster_silhouette_values = sample_silhouette_values[cluster_labels == i]
                    ith_cluster_silhouette_values.sort()
                    size_cluster_i = ith_cluster_silhouette_values.shape[0]
                    y_upper = y_lower + size_cluster_i
                    color = cm.nipy_spectral(float(i)/n_clusters)
                    ax1.fill_betweenx(np.arange(y_lower,
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值