首页 > 编程知识 正文

层次聚类画出树状图python(层次聚类图怎么看)

时间:2023-12-09 23:12:00 阅读:313982 作者:ERRA

本文目录一览:

聚类分析树状图怎么画

如果这个图你看不懂,有个简单的方法,你可以试一下。在进行聚类的过程中点击statistics——cluster

membership——rang

of

solutions

中输入1到28(因为你的树状图中显示有28个变量,所以最多能聚28类,最少是一类),这样就得到一个并类表cluster

membership,这张表分别显示聚为1到28类的情况下,各个变量属于哪一类,非常的简单和直观。

python scipy怎么做层次聚类

Python机器学习包里面的cluster提供了很多聚类算法,其中ward_tree实现了凝聚层次聚类算法。 但是没有看明白ward_tree的返回值代表了什么含义,遂决定寻找别的实现方式。 经过查找,发现scipy.cluster.hierarchy.fclusterdata能够实现层次聚类。

如何绘制和标注在SciPy的/ matplotlib层次聚类树形图

1. 输入到linkage()是一个n×m的数组,表示n个点 间的空间。在你的榜样,mat为3×3,所以你 3 3-D点。是基于这些点之间的距离。 为什么垫和1垫给出相同的吗? 该数组mat和1-mat产生的 是基于所述点之间的距离,并且既不是反射(-mat) 也不翻译(mat + offset)整个数据集的变更相对 点之间的距离。 我怎样才能注释的距离沿着树形图的每个分支,使节点对之间的距离可 在下面的代码中,我 显示如何通过树状返回的数据来标记水平 与相应的距离的示意图。相关联的值 其与按键icoord和dcoord得到x和每个y坐标 三倒U形的身影。在augmented_dendrogram此数据 增加每个水平的距离(即Y值)的标签 行聚类。from scipy.cluster.hierarchy import dendrogram

import matplotlib.pyplot as plt

def augmented_dendrogram(*args, **kwargs):

ddata = dendrogram(*args, **kwargs)

if not kwargs.get('no_plot', False):

for i, d in zip(ddata['icoord'], ddata['dcoord']):

x = 0.5 * sum(i[1:3])

y = d[1]

plt.plot(x, y, 'ro')

plt.annotate("%.3g" % y, (x, y), xytext=(0, -8),

textcoords='offset points',

va='top', ha='center')

return ddata

为了您的mat数组 CodeGo.net,树状图是 有那么点'A'和'c'是1.01个单位分开,并点'b'是1.57个单位 在['A','C']。 似乎show_leaf_counts标志将被忽略,有没有办法将其打开 所以,在每一个类别的对象的数量示出? 该标志show_leaf_counts仅适用于当不是所有的原始数据 点被显示为叶子。例如,当trunc_mode = "lastp", 只有最后p节点是表演。 下面是用100点的例子:import numpy as np

from scipy.cluster.hierarchy import linkage

import matplotlib.pyplot as plt

from augmented_dendrogram import augmented_dendrogram

# Generate a random sample of `n` points in 2-d.

np.random.seed(12312)

n = 100

x = np.random.multivariate_normal([0, 0], np.array([[4.0, 2.5], [2.5, 1.4]]),

size=(n,))

plt.figure(1, figsize=(6, 5))

plt.clf()

plt.scatter(x[:, 0], x[:, 1])

plt.axis('equal')

plt.grid(True)

linkage_matrix = linkage(x, "single")

plt.figure(2, figsize=(10, 4))

plt.clf()

plt.subplot(1, 2, 1)

show_leaf_counts = False

ddata = augmented_dendrogram(linkage_matrix,

color_threshold=1,

p=6,

truncate_mode='lastp',

show_leaf_counts=show_leaf_counts,

)

plt.title("show_leaf_counts = %s" % show_leaf_counts)

plt.subplot(1, 2, 2)

show_leaf_counts = True

ddata = augmented_dendrogram(linkage_matrix,

color_threshold=1,

p=6,

truncate_mode='lastp',

show_leaf_counts=show_leaf_counts,

)

plt.title("show_leaf_counts = %s" % show_leaf_counts)

plt.show()

这些点中的数据集: 同p=6和trunc_mode="lastp",dendrogram仅示出了“顶” 的树状图。下面显示的效果show_leaf_counts。

2. 我认为有几个误解为您所想这里有一个全函数的代码片段,以我的观点的函数:import matplotlib.pyplot as plt

from scipy.cluster.hierarchy import dendrogram, linkage

from numpy import array

import numpy as np

mat = array([184, 222, 177, 216, 231,

45, 123, 128, 200,

129, 121, 203,

46, 83,

83])

dist_mat = mat

linkage_matrix = linkage(dist_mat, 'single')

print linkage_matrix

plt.figure(101)

plt.subplot(1, 2, 1)

plt.title("ascending")

dendrogram(linkage_matrix,

color_threshold=1,

truncate_mode='lastp',

labels=array(['a', 'b', 'c', 'd', 'e', 'f']),

distance_sort='ascending')

plt.subplot(1, 2, 2)

plt.title("descending")

dendrogram(linkage_matrix,

color_threshold=1,

truncate_mode='lastp',

labels=array(['a', 'b', 'c', 'd', 'e', 'f']),

distance_sort='descending')

def make_fake_data():

amp = 1000.

x = []

y = []

for i in range(0, 10):

s = 20

x.append(np.random.normal(30, s))

y.append(np.random.normal(30, s))

for i in range(0, 20):

s = 2

x.append(np.random.normal(150, s))

y.append(np.random.normal(150, s))

for i in range(0, 10):

s = 5

x.append(np.random.normal(-20, s))

y.append(np.random.normal(50, s))

plt.figure(1)

plt.title('fake data')

plt.scatter(x, y)

d = []

for i in range(len(x) - 1):

for j in range(i+1, len(x) - 1):

d.append(np.sqrt(((x[i]-x[j])**2 + (y[i]-y[j])**2)))

return d

mat = make_fake_data()

plt.figure(102)

plt.title("Three Clusters")

linkage_matrix = linkage(mat, 'single')

print "three clusters"

print linkage_matrix

dendrogram(linkage_matrix,

truncate_mode='lastp',

color_threshold=1,

show_leaf_counts=True)

plt.show()

建议收藏!10 种 Python 聚类算法完整操作示例

聚类或聚类分析是无监督学习问题。它通常被用作数据分析技术,用于发现数据中的有趣模式,例如基于其行为的客户群。有许多聚类算法可供选择,对于所有情况,没有单一的最佳聚类算法。相反,最好探索一系列聚类算法以及每种算法的不同配置。在本教程中,你将发现如何在 python 中安装和使用顶级聚类算法。完成本教程后,你将知道:

聚类分析,即聚类,是一项无监督的机器学习任务。它包括自动发现数据中的自然分组。与监督学习(类似预测建模)不同,聚类算法只解释输入数据,并在特征空间中找到自然组或群集。

群集通常是特征空间中的密度区域,其中来自域的示例(观测或数据行)比其他群集更接近群集。群集可以具有作为样本或点特征空间的中心(质心),并且可以具有边界或范围。

聚类可以作为数据分析活动提供帮助,以便了解更多关于问题域的信息,即所谓的模式发现或知识发现。例如:

聚类还可用作特征工程的类型,其中现有的和新的示例可被映射并标记为属于数据中所标识的群集之一。虽然确实存在许多特定于群集的定量措施,但是对所识别的群集的评估是主观的,并且可能需要领域专家。通常,聚类算法在人工合成数据集上与预先定义的群集进行学术比较,预计算法会发现这些群集。

有许多类型的聚类算法。许多算法在特征空间中的示例之间使用相似度或距离度量,以发现密集的观测区域。因此,在使用聚类算法之前,扩展数据通常是良好的实践。

一些聚类算法要求您指定或猜测数据中要发现的群集的数量,而另一些算法要求指定观测之间的最小距离,其中示例可以被视为“关闭”或“连接”。因此,聚类分析是一个迭代过程,在该过程中,对所识别的群集的主观评估被反馈回算法配置的改变中,直到达到期望的或适当的结果。scikit-learn 库提供了一套不同的聚类算法供选择。下面列出了10种比较流行的算法:

每个算法都提供了一种不同的方法来应对数据中发现自然组的挑战。没有最好的聚类算法,也没有简单的方法来找到最好的算法为您的数据没有使用控制实验。在本教程中,我们将回顾如何使用来自 scikit-learn 库的这10个流行的聚类算法中的每一个。这些示例将为您复制粘贴示例并在自己的数据上测试方法提供基础。我们不会深入研究算法如何工作的理论,也不会直接比较它们。让我们深入研究一下。

在本节中,我们将回顾如何在 scikit-learn 中使用10个流行的聚类算法。这包括一个拟合模型的例子和可视化结果的例子。这些示例用于将粘贴复制到您自己的项目中,并将方法应用于您自己的数据。

1.库安装

首先,让我们安装库。不要跳过此步骤,因为你需要确保安装了最新版本。你可以使用 pip Python 安装程序安装 scikit-learn 存储库,如下所示:

接下来,让我们确认已经安装了库,并且您正在使用一个现代版本。运行以下脚本以输出库版本号。

运行该示例时,您应该看到以下版本号或更高版本。

2.聚类数据集

我们将使用 make _ classification ()函数创建一个测试二分类数据集。数据集将有1000个示例,每个类有两个输入要素和一个群集。这些群集在两个维度上是可见的,因此我们可以用散点图绘制数据,并通过指定的群集对图中的点进行颜色绘制。这将有助于了解,至少在测试问题上,群集的识别能力如何。该测试问题中的群集基于多变量高斯,并非所有聚类算法都能有效地识别这些类型的群集。因此,本教程中的结果不应用作比较一般方法的基础。下面列出了创建和汇总合成聚类数据集的示例。

运行该示例将创建合成的聚类数据集,然后创建输入数据的散点图,其中点由类标签(理想化的群集)着色。我们可以清楚地看到两个不同的数据组在两个维度,并希望一个自动的聚类算法可以检测这些分组。

已知聚类着色点的合成聚类数据集的散点图接下来,我们可以开始查看应用于此数据集的聚类算法的示例。我已经做了一些最小的尝试来调整每个方法到数据集。3.亲和力传播亲和力传播包括找到一组最能概括数据的范例。

它是通过 AffinityPropagation 类实现的,要调整的主要配置是将“ 阻尼 ”设置为0.5到1,甚至可能是“首选项”。下面列出了完整的示例。

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,我无法取得良好的结果。

数据集的散点图,具有使用亲和力传播识别的聚类

4.聚合聚类

聚合聚类涉及合并示例,直到达到所需的群集数量为止。它是层次聚类方法的更广泛类的一部分,通过 AgglomerationClustering 类实现的,主要配置是“ n _ clusters ”集,这是对数据中的群集数量的估计,例如2。下面列出了完整的示例。

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以找到一个合理的分组。

使用聚集聚类识别出具有聚类的数据集的散点图

5.BIRCHBIRCH

聚类( BIRCH 是平衡迭代减少的缩写,聚类使用层次结构)包括构造一个树状结构,从中提取聚类质心。

它是通过 Birch 类实现的,主要配置是“ threshold ”和“ n _ clusters ”超参数,后者提供了群集数量的估计。下面列出了完整的示例。

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以找到一个很好的分组。

使用BIRCH聚类确定具有聚类的数据集的散点图

6.DBSCANDBSCAN

聚类(其中 DBSCAN 是基于密度的空间聚类的噪声应用程序)涉及在域中寻找高密度区域,并将其周围的特征空间区域扩展为群集。

它是通过 DBSCAN 类实现的,主要配置是“ eps ”和“ min _ samples ”超参数。下面列出了完整的示例。

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,尽管需要更多的调整,但是找到了合理的分组。

使用DBSCAN集群识别出具有集群的数据集的散点图

7.K均值

K-均值聚类可以是最常见的聚类算法,并涉及向群集分配示例,以尽量减少每个群集内的方差。

它是通过 K-均值类实现的,要优化的主要配置是“ n _ clusters ”超参数设置为数据中估计的群集数量。下面列出了完整的示例。

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以找到一个合理的分组,尽管每个维度中的不等等方差使得该方法不太适合该数据集。

使用K均值聚类识别出具有聚类的数据集的散点图

8.Mini-Batch

K-均值Mini-Batch K-均值是 K-均值的修改版本,它使用小批量的样本而不是整个数据集对群集质心进行更新,这可以使大数据集的更新速度更快,并且可能对统计噪声更健壮。

它是通过 MiniBatchKMeans 类实现的,要优化的主配置是“ n _ clusters ”超参数,设置为数据中估计的群集数量。下面列出了完整的示例。

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,会找到与标准 K-均值算法相当的结果。

带有最小批次K均值聚类的聚类数据集的散点图

9.均值漂移聚类

均值漂移聚类涉及到根据特征空间中的实例密度来寻找和调整质心。

它是通过 MeanShift 类实现的,主要配置是“带宽”超参数。下面列出了完整的示例。

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以在数据中找到一组合理的群集。

具有均值漂移聚类的聚类数据集散点图

10.OPTICSOPTICS

聚类( OPTICS 短于订购点数以标识聚类结构)是上述 DBSCAN 的修改版本。

它是通过 OPTICS 类实现的,主要配置是“ eps ”和“ min _ samples ”超参数。下面列出了完整的示例。

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,我无法在此数据集上获得合理的结果。

使用OPTICS聚类确定具有聚类的数据集的散点图

11.光谱聚类

光谱聚类是一类通用的聚类方法,取自线性线性代数。

它是通过 Spectral 聚类类实现的,而主要的 Spectral 聚类是一个由聚类方法组成的通用类,取自线性线性代数。要优化的是“ n _ clusters ”超参数,用于指定数据中的估计群集数量。下面列出了完整的示例。

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,找到了合理的集群。

使用光谱聚类聚类识别出具有聚类的数据集的散点图

12.高斯混合模型

高斯混合模型总结了一个多变量概率密度函数,顾名思义就是混合了高斯概率分布。它是通过 Gaussian Mixture 类实现的,要优化的主要配置是“ n _ clusters ”超参数,用于指定数据中估计的群集数量。下面列出了完整的示例。

运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,我们可以看到群集被完美地识别。这并不奇怪,因为数据集是作为 Gaussian 的混合生成的。

使用高斯混合聚类识别出具有聚类的数据集的散点图

在本文中,你发现了如何在 python 中安装和使用顶级聚类算法。具体来说,你学到了:

python怎么做聚类树状图

 #-*- coding:utf-8 -*-import mathimport pylab as pl#数据集:每三个是一组分别是西瓜的编号,密度,含糖量data = """

1,0.697,0.46,2,0.774,0.376,3,0.634,0.264,4,0.608,0.318,5,0.556,0.215,

6,0.403,0.237,7,0.481,0.149,8,0.437,0.211,9,0.666,0.091,10,0.243,0.267,

11,0.245,0.057,12,0.343,0.099,13,0.639,0.161,14,0.657,0.198,15,0.36,0.37,

16,0.593,0.042,17,0.719,0.103,18,0.359,0.188,19,0.339,0.241,20,0.282,0.257,

21,0.748,0.232,22,0.714,0.346,23,0.483,0.312,24,0.478,0.437,25,0.525,0.369,

26,0.751,0.489,27,0.532,0.472,28,0.473,0.376,29,0.725,0.445,30,0.446,0.459"""#数据处理 dataset是30个样本(密度,含糖量)的列表a = data.split(',')

dataset = [(float(a[i]), float(a[i+1])) for i in range(1, len(a)-1, 3)]#计算欧几里得距离,a,b分别为两个元组def dist(a, b):

    return math.sqrt(math.pow(a[0]-b[0], 2)+math.pow(a[1]-b[1], 2))#dist_mindef dist_min(Ci, Cj):

    return min(dist(i, j) for i in Ci for j in Cj)#dist_maxdef dist_max(Ci, Cj):

    return max(dist(i, j) for i in Ci for j in Cj)#dist_avgdef dist_avg(Ci, Cj):

    return sum(dist(i, j) for i in Ci for j in Cj)/(len(Ci)*len(Cj))#找到距离最小的下标def find_Min(M):

    min = 1000

    x = 0; y = 0

    for i in range(len(M)):        for j in range(len(M[i])):            if i != j and M[i][j]  min:

                min = M[i][j];x = i; y = j    return (x, y, min)#算法模型:def AGNES(dataset, dist, k):

    #初始化C和M

    C = [];M = []    for i in dataset:

        Ci = []

        Ci.append(i)

        C.append(Ci)    for i in C:

        Mi = []        for j in C:

            Mi.append(dist(i, j))

        M.append(Mi)

    q = len(dataset)    #合并更新

    while q  k:

        x, y, min = find_Min(M)

        C[x].extend(C[y])

        C.remove(C[y])

        M = []        for i in C:

            Mi = []            for j in C:

                Mi.append(dist(i, j))

            M.append(Mi)

        q -= 1

    return C#画图def draw(C):

    colValue = ['r', 'y', 'g', 'b', 'c', 'k', 'm']    for i in range(len(C)):

        coo_X = []    #x坐标列表

        coo_Y = []    #y坐标列表

        for j in range(len(C[i])):

            coo_X.append(C[i][j][0])

            coo_Y.append(C[i][j][1])

        pl.scatter(coo_X, coo_Y, marker='x', color=colValue[i%len(colValue)], label=i)

    pl.legend(loc='upper right')

    pl.show()

C = AGNES(dataset, dist_avg, 3)

draw(C)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。