1.4 凝聚聚类(agglomerative)
1.4.1原理
凝聚聚类(agglomerative clustering)指的是许多基于相同原则构建的聚类算法,这一原则是:算法首先声明每个点是自己的簇,然后合并两个最相似的簇,直到满足某种停止准则为止
度量相似值,Sklearn有四种选项:linkage : {"ward", "complete", "average", "single"}, optional (默认="ward")
- ward链接:默认选项,挑选两个簇来合并,是的所有簇中的方差增加最小。这通常会得到大小差不多相等的簇。
- average链接:也称为均链接,将簇中所有点之间"平均距离" 最小的两个簇合并。
- complete链接:也称为最大链接,将簇中点之间"最大距离"最小的两个簇合并。
- single链接:也称单链接,将簇中所有点之间"最小距离"最小的两个簇合并
ward适用于大多数数据集。如果簇中的成员个数非常不同(比如其中一个比其他所有都大得多),那么average或complete可能效果更好。
1.4.2类参数、属性和方法
类
class sklearn.cluster.AgglomerativeClustering(n_clusters=2, *, affinity='euclidean', memory=None, connectivity=None, compute_full_tree='auto', linkage='ward', distance_threshold=None, compute_distances=False
属性
属性 |
类别 |
介绍 |
n_clusters_ |
int |
算法找到的聚类数。如果距离阈值=无,它将等于给定的n个聚类。 |
labels_ |
ndarray of shape (n_samples) |
每个点的聚类标签 |
n_leaves_ |
int |
分层树中的树叶数量 |
n_connected_components_ |
int |
图中连接组件的估计数量 |
children_ |
array-like of shape (n_samples-1, 2) |
每个非叶节点的子节点。小于n_samples的值对应于作为原始样本的树叶。大于或等于n_samples的节点I是非叶节点,并且具有子代子代_[i - n_samples]。或者,在第I次迭代中,子[i][0]和子[i][1]被合并以形成节点n_samples + i |
distances_ |
array-like of shape (n_nodes-1,) |
children_中相应位置的节点之间的距离。仅当使用距离阈值或计算距离设置为真时才计算。 |
方法
fit(X[, y, sample_weight]) |
根据特征或距离矩阵执行DBSCAN聚类。 |
fit_predict(X[, y, sample_weight]) |
从要素或距离矩阵执行DBSCAN聚类,并返回聚类标签。 |
get_params([deep]) |
获取此估计器的参数。 |
set_params(**params) |
设置此估计器的参数。 |
1.4.3对make_blobs数据进行凝聚聚类算法分析
#凝聚算法 from scipy.cluster.hierarchy import dendrogram,ward def agglomerative_algorithm(): mglearn.plots.plot_agglomerative_algorithm() plt.show() blobs = make_blobs(random_state=1,centers=1) x_blobs = blobs[0] #使用连线方式进行可视化 linkage =ward(x_blobs) dendrogram(linkage) ax = plt.gca() # gca:Get Current Axes #设定横纵轴标签 plt.xlabel("sample index") plt.ylabel("Cluster distance") plt.show()
from sklearn.cluster import AgglomerativeClustering def AgglomerativeClustering_for_blobs (): blobs = make_blobs(random_state=1,centers=1) X = blobs[0] y = blobs[1] #设置簇个数为3 AC = AgglomerativeClustering(n_clusters=3) result = AC.fit_predict(X) print("训练集数据集分配簇标签为:\n{}".format(AC.labels_)) print("对训练集数据集预测结果为:\n{}".format(result)) #画出聚类后的数据集图像 mglearn.discrete_scatter(X[:,0], X[:,1],AC.labels_,markers='o') plt.show()
输出
训练集数据集分配簇标签为: [1 1 0 2 1 2 2 1 0 2 1 2 0 0 1 2 2 0 0 0 2 0 2 2 0 1 2 2 1 1 2 0 0 0 2 0 2 0 0 0 2 1 0 0 2 2 2 1 0 0 0 1 2 2 2 2 2 2 2 2 2 2 2 0 0 1 0 0 0 2 2 1 2 2 2 1 2 0 0 0 2 0 2 2 0 1 2 1 2 0 2 0 2 2 2 2 0 2 2 1] 对训练集数据集预测结果为: [1 1 0 2 1 2 2 1 0 2 1 2 0 0 1 2 2 0 0 0 2 0 2 2 0 1 2 2 1 1 2 0 0 0 2 0 2 0 0 0 2 1 0 0 2 2 2 1 0 0 0 1 2 2 2 2 2 2 2 2 2 2 2 0 0 1 0 0 0 2 2 1 2 2 2 1 2 0 0 0 2 0 2 2 0 1 2 1 2 0 2 0 2 2 2 2 0 2 2 1]
1.4.4 凝聚聚类分析鸢尾花数据
def AgglomerativeClustering_for_iris(): myutil = util() X,y = datasets.load_iris().data,datasets.load_iris().target AC = AgglomerativeClustering(n_clusters=3) AC.fit(X) result = AC.fit_predict(X) title = "鸢尾花" myutil.draw_scatter_for_Clustering(X,y,result,title,"凝聚算法")
输出
鸢尾花原始数据集分配簇标签为: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2] 鸢尾花 凝聚算法 训练簇标签为: [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 2 2 2 0 2 2 2 2 2 2 0 0 2 2 2 2 0 2 0 2 0 2 2 0 0 2 2 2 2 2 0 0 2 2 2 0 2 2 2 0 2 2 2 0 2 2 0]
1.4.5 凝聚聚类分析红酒数据
def AgglomerativeClustering_for_wine(): myutil = util() X,y = datasets.load_wine().data,datasets.load_wine().target AC = AgglomerativeClustering(n_clusters=3) AC.fit(X) result = AC.fit_predict(X) title = "红酒" myutil.draw_scatter_for_Clustering(X,y,result,title,"凝聚算法")
输出
红酒原始数据集分配簇标签为: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2] 红酒 凝聚算法 训练簇标签为: [0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 0 0 2 2 0 0 2 0 0 0 0 0 0 2 2 0 0 2 2 0 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 1 2 1 1 2 1 1 2 2 2 1 1 0 2 1 1 1 2 1 1 2 2 1 1 1 1 1 2 2 1 1 1 1 1 0 2 1 2 1 2 1 1 1 2 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 2 2 2 1 1 1 1 2 1 1 2 2 1 2 2 1 1 1 1 2 2 2 1 2 2 2 1 2 1 2 2 1 2 2 2 2 1 1 2 2 2 2 2 1]
1.4.6 凝聚聚类分析乳腺癌数据
def AgglomerativeClustering_for_breast_cancer(): myutil = util() X,y = datasets.load_breast_cancer().data,datasets.load_breast_cancer().target AC = AgglomerativeClustering(n_clusters=2) AC.fit(X) result = AC.fit_predict(X) title = "乳腺癌" myutil.draw_scatter_for_Clustering(X,y,result,title,"凝聚算法")
输出
乳腺癌原始数据集分配簇标签为: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 … 1 1 1 1 1 1 1 0 0 0 0 0 0 1] 乳腺癌 凝聚算法 训练簇标签为: [1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 … 0 0 0 0 0 0 0 0 1 1 1 0 1 0]
1.4.7 凝聚聚类分析两个月亮数据
#两个月亮 def KMeans_for_two_moon(): myutil = util() X, y = datasets.make_moons(n_samples=200,noise=0.05, random_state=0) scaler = StandardScaler() scaler.fit(X) X_scaled = scaler.transform(X) # 打印处理后的数据形态 print("处理后的数据形态:",X_scaled.shape) # 处理后的数据形态: (200, 2) 200个样本 2类 Kmeans = KMeans(n_clusters=2) result=Kmeans.fit_predict(X_scaled) title = "两个月亮" #绘制簇分配结果 myutil.draw_scatter_for_Clustering(X,y,result,title,"KMeans")
输出
处理后的数据形态: (200, 2) 两个月亮原始数据集分配簇标签为: [0 1 1 0 1 1 0 1 0 1 0 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 0 0 0 1 1 0 1 1 0 0 1 1 0 0 1 1 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1 0 0 0 1 1 0 0 1 0 1 1 1 1 0 1 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 0 0 1 1 0 1 1 1 0 0 1 0 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 1 1 1 0 0 0 1 0 1 1 1 0 0 1 0 0 0 0 0 0 1 0 1 1 0 1] 两个月亮 凝聚算法 训练簇标签为: [0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 1 1 0 0 1 0 1 0 0 1 0 0 1 0 1 1 0 1 1 0 1 0 0 0 1 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 1 0 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 1 1 1 0 0 0 1 1 1 0 1 0 0 0
1 1 0 1 1 1 1 0 0 0 1 0 0 1 0]