-
2021-01-05 19:22:00
层次聚类分析
作者:小明 为啥做这个?我猜是模式识别的课程让我写的。 无私奉献啊哈哈哈哈
本文主要针对层次聚类算法做一个详解,并使用代码进行复述,可供大家理解一下什么是层次聚类分析算法哈!
算法定义:
层次聚类算法的定义为:通过某种可计算方法的相似度测度计算节点(分析对象)之间的相似性,并按相似度由高到低排序,逐步重新连接个节点,得到一个单聚类结果。
简单描述就相当于:三角形的重点、中点、及内心这种点也属于不断地聚类结果。
思考:当一个无限大的多散点聚类之后,结果是什么?
结果是一个点,所有的无限大多散点其实就是一个圆(球),那么得到的最终结果就是按照地球地心形式,聚集于一点。
算法步骤:
- 移除网络中的所有边,得到有n个孤立节点的初始状态;(做离散化)
- 计算网络中每对节点的相似度;(相似度计算);
- 根据相似度从强到弱连接相应节点对,形成树状图;(绘制图像)
- 根据实际需求横切树状图,获得社区结构。(切割图像)
相似度计算方法:在另外一篇博客,自己去看看咯:
实例带你走一遍:
步骤一:导入相关的库:
必要的数据科学库为:pandas numpy使用聚类所需要的的库:scipy.cluster.hierachy
绘图使用的库:matplotlib(我们只用到这个库里面的pyplot模块)#导入相关的库进行使用 import pandas as pd import numpy as np import scipy.cluster.hierarchy as sch import matplotlib.pyplot as plt plt.rc('font', **{'family': 'Microsoft YaHei, SimHei'}) # 设置可以支持中文显示
步骤二:读取相关数据,这里我是使用的处理好的数据文件(简单拿二维数据)
df = pd.read_excel(r'C:\Users\小明\Desktop\层次聚类样本点.xlsx') df.head(10)
步骤三:给每个点做好标注(使用序号)
''' 新建图层 匹配横纵坐标 绘制散点图及图例 做序列解包,标注相对应的点(text文本标注) 绘制均值垂直线 增加网格(true) ''' plt.figure(figsize=(10, 8)) x, y = df['横坐标'], df['纵坐标'] label = df['序号'] plt.scatter(x, y) plt.xlabel('横坐标'); plt.ylabel('纵坐标') for a,b,l in zip(x,y,label): plt.text(a, b+0.1, '%s' % l, ha='center', va='bottom', fontsize=14) plt.vlines(x=df['横坐标'].mean(), ymin=-1.5, ymax=3, colors='red', linewidth=2) plt.hlines(y=df['纵坐标'].mean(), xmin=-4, xmax=6,colors='red', linewidth=2) plt.grid(True)
步骤四:进行层次聚类分析
做相似度分析:使用欧式距离进行聚类,对横纵坐标进行
disMat = sch.distance.pdist(X=df[['横坐标', '纵坐标']], metric='euclidean') # 进行层次聚类: 计算距离的方法使用 ward 法 Z = sch.linkage(disMat,method='ward')
#树状获得结果,显示的好看这不是? P = sch.dendrogram(Z,labels=df.序号.tolist()) plt.savefig('聚类结果.png')
当然啦,最长的,这不就是改一下方法就好咯:
# 进行层次聚类: 计算距离的方法使用 complete 法 Z2 = sch.linkage(disMat,method='complete') P2 = sch.dendrogram(Z2,labels=df.序号.tolist()) plt.savefig('聚类结果2.png')
完结撒花~~~
觉得有帮助点个赞呗!或者有疑问建议评论哦!
更多相关内容 -
基于R语言的层次聚类分析-【案例实操】-基本操作,一看就会
2021-01-12 00:37:20基本思想 每一个样本作为一类 ...**注意:一般聚类前要将数据进行标准化。**消除量纲影响 irisScaled <- scale(iris[, -5])# 数据标准化 具体实验步骤 计算样本之间的距离 d <- dist(irisScaled[, 1:4]) fitH基本思想
- 每一个样本作为一类
- 按照某一种方法进行距离度量,比如“欧氏距离”
- 距离最短划为1类
- 重复步骤2和3,每次减少一类,直至所有样本合成1类
案例
数据
这里用鸢尾花数据集作为实验数据
data(iris)# 载入数据 plot(iris)# 画图
**注意:一般聚类前要将数据进行标准化。**消除量纲影响irisScaled <- scale(iris[, -5])# 数据标准化 # iris[, -5] 去掉第五列的数据,因为第五列的数据是字符型
具体实验步骤
计算样本之间的距离
d <- dist(irisScaled[, 1:4]) fitH <- hclust(d, "ward.D2")
# 数值计算距离 # 注释:在聚类中求两点的距离有: # 1,绝对距离:manhattan # 2,欧氏距离:euclidean 默认 # 3,闵科夫斯基距离:minkowski # 4,切比雪夫距离:chebyshev # 5,马氏距离:mahalanobis # 6,蓝氏距离:canberra # 根据距离聚类 out.hclust=hclust(out.dist,method="complete") # 注释:聚类中集合之间的距离: # 1,类平均法:average # 2,重心法:centroid # 3,中间距离法:median # 4,最长距离法:complete 默认 # 5,最短距离法:single # 6,离差平方和法:ward # 7,密度估计法:density #(1)聚类方法"centroid" 相对应使用的距离为平方欧式距离 squared Euclidean distances. 如:hc1ust.centroid <- hclust(dist(cent)^2, method = "cen") #(2)聚类方法"ward.D2" 相对应使用的距离为欧式距离 "Euclidean" distances. #(3)聚类方法"average"(=UPGMA) 相对应使用的距离为 "bray"(=Bray-Curtis) distances.
生成聚类结果
plot(fitH)
生成3类
rect.hclust(fitH, k = 3, border = "red")
这里红色框框框到的,他就是一类别
切割
切割的方法是具体知道某一个样本属于哪一类
clusters <- cutree(fitH, k = 3)
会返回一组向量,向量所对应的就是该样本所属于的类别。
这里用颜色来区分plot(iris, col = clusters)
讲真这个分类结果还算蛮好的。
结束! -
层次聚类和实例分析
2022-02-16 10:31:29层次聚类 层次聚类(Hierarchical Clustering)是聚类算法的一种,通过计算不同类别数据点间的相似度来创建一棵有层次的嵌套聚类树。在聚类树中,不同类别的原始数据点是树的最低层,树的顶层是一个聚类的根节点。...层次聚类
层次聚类(Hierarchical Clustering)是聚类算法的一种,通过计算不同类别数据点间的相似度来创建一棵有层次的嵌套聚类树。在聚类树中,不同类别的原始数据点是树的最低层,树的顶层是一个聚类的根节点。创建聚类树有自下而上合并和自上而下分裂两种方法。
作为一家公司的人力资源部经理,你可以把所有的雇员组织成较大的簇,如主管、经理和职员;然后你可以进一步划分为较小的簇,例如,职员簇可以进一步划分为子簇:高级职员,一般职员和实习人员。所有的这些簇形成了层次结构,可以很容易地对各层次上的数据进行汇总或者特征化。
如何划分才是合适的呢?
直观来看,上图中展示的数据划分为2个簇或4个簇都是合理的,甚至,如果上面每一个圈的内部包含的是大量数据形成的数据集,那么也许分成16个簇才是所需要的。
论数据集应该聚类成多少个簇,通常是在讨论我们在什么尺度上关注这个数据集。层次聚类算法相比划分聚类算法的优点之一是可以在不同的尺度上(层次)展示数据集的聚类情况。
基于层次的聚类算法(Hierarchical Clustering)可以是凝聚的(Agglomerative)或者分裂的(Divisive),取决于层次的划分是“自底向上”还是“自顶向下”。
自底向上的合并算法
层次聚类的合并算法通过计算两类数据点间的相似性,对所有数据点中最为相似的两个数据点进行组合,并反复迭代这一过程。简单的说层次聚类的合并算法是通过计算每一个类别的数据点与所有数据点之间的距离来确定它们之间的相似性,距离越小,相似度越高。并将距离最近的两个数据点或类别进行组合,生成聚类树。
相似度的计算
层次聚类使用欧式距离来计算不同类别数据点间的距离(相似度)。
实例:数据点如下
分别计算欧式距离值(矩阵)
将数据点B与数据点C进行组合后,重新计算各类别数据点间的距离矩阵。数据点间的距离计算方式与之前的方法一样。这里需要说明的是组合数据点(B,C)与其他数据点间的计算方法。当我们计算(B,C)到A的距离时,需要分别计算B到A和C到A的距离均值。
经过计算数据点D到数据点E的距离在所有的距离值中最小,为1.20。这表示在当前的所有数据点中(包含组合数据点),D和E的相似度最高。因此我们将数据点D和数据点E进行组合。并再次计算其他数据点间的距离。
后面的工作就是不断的重复计算数据点与数据点,数据点与组合数据点间的距离。这个步骤应该由程序来完成。这里由于数据量较小,我们手工计算并列出每一步的距离计算和数据点组合的结果。
两个组合数据点间的距离
计算两个组合数据点间距离的方法有三种,分别为Single Linkage,Complete Linkage和Average Linkage。在开始计算之前,我们先来介绍下这三种计算方法以及各自的优缺点。
-
Single Linkage:方法是将两个组合数据点中距离最近的两个数据点间的距离作为这两个组合数据点的距离。这种方法容易受到极端值的影响。两个很相似的组合数据点可能由于其中的某个极端的数据点距离较近而组合在一起。
-
Complete Linkage:Complete Linkage的计算方法与Single Linkage相反,将两个组合数据点中距离最远的两个数据点间的距离作为这两个组合数据点的距离。Complete Linkage的问题也与Single Linkage相反,两个不相似的组合数据点可能由于其中的极端值距离较远而无法组合在一起。
-
Average Linkage:Average Linkage的计算方法是计算两个组合数据点中的每个数据点与其他所有数据点的距离。将所有距离的均值作为两个组合数据点间的距离。这种方法计算量比较大,但结果比前两种方法更合理。
我们使用Average Linkage计算组合数据点间的距离。下面是计算组合数据点(A,F)到(B,C)的距离,这里分别计算了(A,F)和(B,C)两两间距离的均值。
树状图
层次聚类python
import pandas as pd seeds_df = pd.read_csv('./datasets/seeds-less-rows.csv') seeds_df.head()
seeds_df.grain_variety.value_counts()
Kama wheat 14 Rosa wheat 14 Canadian wheat 14 Name: grain_variety, dtype: int64
varieties = list(seeds_df.pop('grain_variety')) samples = seeds_df.values
samples
array([[14.88 , 14.57 , 0.8811, 5.554 , 3.333 , 1.018 , 4.956 ], [14.69 , 14.49 , 0.8799, 5.563 , 3.259 , 3.586 , 5.219 ], [14.03 , 14.16 , 0.8796, 5.438 , 3.201 , 1.717 , 5.001 ], [13.99 , 13.83 , 0.9183, 5.119 , 3.383 , 5.234 , 4.781 ], [14.11 , 14.26 , 0.8722, 5.52 , 3.168 , 2.688 , 5.219 ], [13.02 , 13.76 , 0.8641, 5.395 , 3.026 , 3.373 , 4.825 ], [15.49 , 14.94 , 0.8724, 5.757 , 3.371 , 3.412 , 5.228 ], [16.2 , 15.27 , 0.8734, 5.826 , 3.464 , 2.823 , 5.527 ], [13.5 , 13.85 , 0.8852, 5.351 , 3.158 , 2.249 , 5.176 ], [15.36 , 14.76 , 0.8861, 5.701 , 3.393 , 1.367 , 5.132 ], [15.78 , 14.91 , 0.8923, 5.674 , 3.434 , 5.593 , 5.136 ], [14.46 , 14.35 , 0.8818, 5.388 , 3.377 , 2.802 , 5.044 ], [11.23 , 12.63 , 0.884 , 4.902 , 2.879 , 2.269 , 4.703 ], [14.34 , 14.37 , 0.8726, 5.63 , 3.19 , 1.313 , 5.15 ], [16.84 , 15.67 , 0.8623, 5.998 , 3.484 , 4.675 , 5.877 ], [17.32 , 15.91 , 0.8599, 6.064 , 3.403 , 3.824 , 5.922 ], [18.72 , 16.19 , 0.8977, 6.006 , 3.857 , 5.324 , 5.879 ], [18.88 , 16.26 , 0.8969, 6.084 , 3.764 , 1.649 , 6.109 ], [18.76 , 16.2 , 0.8984, 6.172 , 3.796 , 3.12 , 6.053 ], [19.31 , 16.59 , 0.8815, 6.341 , 3.81 , 3.477 , 6.238 ], [17.99 , 15.86 , 0.8992, 5.89 , 3.694 , 2.068 , 5.837 ], [18.85 , 16.17 , 0.9056, 6.152 , 3.806 , 2.843 , 6.2 ], [19.38 , 16.72 , 0.8716, 6.303 , 3.791 , 3.678 , 5.965 ], [18.96 , 16.2 , 0.9077, 6.051 , 3.897 , 4.334 , 5.75 ], [18.14 , 16.12 , 0.8772, 6.059 , 3.563 , 3.619 , 6.011 ], [18.65 , 16.41 , 0.8698, 6.285 , 3.594 , 4.391 , 6.102 ], [18.94 , 16.32 , 0.8942, 6.144 , 3.825 , 2.908 , 5.949 ], [17.36 , 15.76 , 0.8785, 6.145 , 3.574 , 3.526 , 5.971 ], [13.32 , 13.94 , 0.8613, 5.541 , 3.073 , 7.035 , 5.44 ], [11.43 , 13.13 , 0.8335, 5.176 , 2.719 , 2.221 , 5.132 ], [12.01 , 13.52 , 0.8249, 5.405 , 2.776 , 6.992 , 5.27 ], [11.34 , 12.87 , 0.8596, 5.053 , 2.849 , 3.347 , 5.003 ], [12.02 , 13.33 , 0.8503, 5.35 , 2.81 , 4.271 , 5.308 ], [12.44 , 13.59 , 0.8462, 5.319 , 2.897 , 4.924 , 5.27 ], [11.55 , 13.1 , 0.8455, 5.167 , 2.845 , 6.715 , 4.956 ], [11.26 , 13.01 , 0.8355, 5.186 , 2.71 , 5.335 , 5.092 ], [12.46 , 13.41 , 0.8706, 5.236 , 3.017 , 4.987 , 5.147 ], [11.81 , 13.45 , 0.8198, 5.413 , 2.716 , 4.898 , 5.352 ], [11.27 , 12.86 , 0.8563, 5.091 , 2.804 , 3.985 , 5.001 ], [12.79 , 13.53 , 0.8786, 5.224 , 3.054 , 5.483 , 4.958 ], [12.67 , 13.32 , 0.8977, 4.984 , 3.135 , 2.3 , 4.745 ], [11.23 , 12.88 , 0.8511, 5.14 , 2.795 , 4.325 , 5.003 ]])
#距离计算的linkage 还有树状图dendrogram from scipy.cluster.hierarchy import linkage, dendrogram import matplotlib.pyplot as plt
#进行层次聚类 mergings = linkage(samples, method='complete')
#树状图结果 fig = plt.figure(figsize=(10,6)) dendrogram(mergings, labels=varieties, leaf_rotation=90, leaf_font_size=6, ) plt.show()
#得到标签结果 #maximum height自己指定 from scipy.cluster.hierarchy import fcluster labels = fcluster(mergings, 6, criterion='distance') df = pd.DataFrame({'labels': labels, 'varieties': varieties}) ct = pd.crosstab(df['labels'], df['varieties']) ct
不同距离的选择会产生不同的结果
import pandas as pd scores_df = pd.read_csv('./datasets/eurovision-2016-televoting.csv', index_col=0) country_names = list(scores_df.index) scores_df.head()
#缺失值填充,没有的就先按满分算吧 scores_df = scores_df.fillna(12)
#归一化 from sklearn.preprocessing import normalize samples = normalize(scores_df.values)
samples
array([[0.09449112, 0.56694671, 0. , ..., 0. , 0.28347335, 0. ], [0.49319696, 0. , 0.16439899, ..., 0. , 0.41099747, 0. ], [0. , 0.49319696, 0.12329924, ..., 0. , 0.32879797, 0.16439899], ..., [0.32879797, 0.20549873, 0.24659848, ..., 0.49319696, 0.28769823, 0. ], [0.28769823, 0.16439899, 0. , ..., 0. , 0.49319696, 0. ], [0. , 0.24659848, 0. , ..., 0. , 0.20549873, 0.49319696]])
from scipy.cluster.hierarchy import linkage, dendrogram import matplotlib.pyplot as plt mergings = linkage(samples, method='single') fig = plt.figure(figsize=(10,6)) dendrogram(mergings, labels=country_names, leaf_rotation=90, leaf_font_size=6, ) plt.show()
mergings = linkage(samples, method='complete') fig = plt.figure(figsize=(10,6)) dendrogram(mergings, labels=country_names, leaf_rotation=90, leaf_font_size=6, ) plt.show()
-
-
聚类分析操作步骤
2020-07-23 17:05:20 -
【数据挖掘】基于层次的聚类方法 ( 聚合层次聚类 | 划分层次聚类...| 平均距离 | 基于层次聚类步骤 | 族半径 )
2020-05-07 10:47:25基于层次的聚类方法 简介 基于层次的聚类方法 概念 聚合层次聚类 图示 划分层次聚类 图示 ...基于层次聚类 ( 聚合层次聚类 ) 步骤 基于层次聚类 ( 聚合层次聚类 ) 算法终止条件 族半径 计算公式 基于层次聚类总结 -
数据挖掘|层次聚类,非层次聚类 ,SOM |样本距离,样本相似度 |情报分析管理论5~7回总结(二)
2021-11-29 20:40:15第5回:关联规则学习(association rule learning),朴素贝叶斯分类器(naive bayes classifier)第6回:层次聚类(hierarchical clustering),非层次聚类(non-hierarchical clustering) ,SOM (self-organizing map)第7... -
多元统计分析——聚类分析——层次聚类
2020-06-28 11:57:39层次聚类 小样本数据 - 可以形成类相似度层次图谱,便于直观的确定类之间的划分。 该方法可以得到较理想的分类 难以处理大量样本 基于划分的聚类 大样本数据 K-means算法 ... -
层次聚类
2020-05-22 05:25:25层次聚类,也称为层次聚类分析,是一种将相似对象分组为聚类的算法。 端点是一组群集,其中每个群集彼此都不相同,并且每个群集内的对象彼此大致相似。 分层聚类技术: 层次聚类是一种流行且易于理解的聚类技术。此... -
聚类分析 之 凝聚层次聚类
2019-12-17 19:46:59两种产生层次聚类的基本方法: 凝聚的: 从点作为个体簇开始,每一步合并两个最近的簇, 需要定义簇的邻近性概念(开始每个点都是一个簇,然后不断合并减少簇的数量)。 分裂的; 从包含所有点的某个簇开始,每... -
层次聚类分析
2017-11-08 00:36:00在层次聚类中,主要的区别是它们对类的定义不同(步骤(b)),五种常见的聚类方法的定义和其中两类之间的距离定义 聚类方法 两类之间的距离定义 单联动 一个类中的点和另一个类中的点的最小距离 ... -
聚类分析常用算法原理:KMeans,DBSCAN, 层次聚类
2018-01-01 10:52:32聚类分析是非监督学习的很重要的领域。所谓非监督学习,就是数据是没有类别标记的,算法要从对原始数据的探索中提取出一定的规律。而聚类分析就是试图将数据集中的样本划分为若干个不相交的子集,每个子集称为一个... -
聚类分析(三) 层次聚类及matlab程序
2021-04-29 00:44:02一、层次聚类介绍1.1 简介层次聚类,主要是对给定的待聚类的数据集进行层次化分解。主要分为两大类:1.从下到上的凝聚聚类2.从上到下的分裂聚类其他算法大部分是对样本之间距离度量或者类间凝聚/分裂依据进行改进。... -
层次聚类分析 - 不愿透露性别的某名宿的个人空间 - OSCHINA - 中文开源技术交流社区
2020-12-14 16:30:27层次聚类中,起初每一个实例或观测值属于一类,聚类就是每一次把两类聚成新的一类,直到所有的类聚成单个类为止,算法如下a、定义每个观测值(行或单元)为一类b、计算每类和其他各类的距离c、把距离最短的两类合并... -
聚类分析:原型K-Means/K-Means++聚类、层次聚类;密度聚类DBSCAN
2021-05-21 17:45:38聚类分析–处理无标签数据 from IPython.display import Image %matplotlib inline 1.使用K-Means方法按照相似度对对象进行分组 1.1使用sklearn实现K-Means聚类 from sklearn.datasets import make_blobs X, y = ... -
聚类分析法-层次聚类
2021-02-12 10:38:05聚类分析法 文章目录聚类分析法1.简介2.基本内容介绍1.数据变换2. 样品间亲疏程度的测度计算常用距离计算1. 闵式(Minkowski)距离2. 马氏(Mahalanobis)距离相似系数的计算1. 夹角余弦2.皮尔逊相关系数3.使用scipy.... -
层次聚类算法分析
2018-12-28 16:00:52层次聚类算法的原理及实现Hierarchical Clustering 2016年4月19日 BY 蓝鲸 5 COMMENTS 层次聚类(Hierarchical Clustering)是聚类算法的一种,通过计算不同类别数据点间的相似度来创建一棵有层次的嵌套聚类树。... -
一文读懂层次聚类(Python代码)
2022-03-17 00:16:07本篇想和大家介绍下层次聚类,先通过一个简单的例子介绍它的基本理论,然后再用一个实战案例Python代码实现聚类效果。首先要说,聚类属于机器学习的无监督学习,而且也分很多种方法,比如大家熟知... -
聚类分析层次聚类及k-means算法
2017-06-25 15:28:531、测试案例: 2、原理分析: 3、源代码示例: 4、运行结果: -
聚类算法之层次聚类和密度聚类(图文并茂,小白必备)
2021-07-17 23:14:50层次聚类方法对给定的数据集进行层次的分解,直到达到某种条件为止。具体又可分为: 凝聚的层次聚类——AGNES算法 采用自底向上的策略,首先将每个对象作为一个簇,然后这些簇根据某些准则被一步步合并,两个簇之间... -
聚类分析1:层次聚类
2016-11-11 15:05:00聚类分析是一种数据归约技术,旨在揭露一个数据集中观测值的子集。它可以把大量的观测值归约为若干个类,而事先并不知道类别的个数与结构。 最常用的两种聚类方法是层次聚类(hierarchical agglomerative clustering... -
一文详解层次聚类(Python代码)
2022-03-15 22:26:31下面我先简单回顾一下K-means的基本原理,然后慢慢引出层次聚类的定义和分层步骤,这样更有助于大家理解。层次聚类和K-means有什么不同?K-means 工作原理可以简要概述为:决定簇数(k)从数据中随机选取 k 个... -
原理+代码|详解层次聚类及Python实现
2021-02-04 00:02:56聚类分析的方法非常多,能够理解经典又最基础的聚类方法 ——层次聚类法(系统聚类)的基本原理并将代码用于实际的业务案例是本文的目标,同时这也会为理解后续与聚类相关的推文如 K-Means 等打下基础是。本文将详细... -
聚类算法及python实现——层次聚类
2022-04-03 17:46:50聚类算法及python实现——层次聚类 构建二叉树 步骤 step1:将每个样品都看作一类 step2:计算每个样品两两之间的距离 step3:合并距离最近的两类变成一个新的类 step4:计算各个类之间的距离,合并,直至只有一类 ... -
机器学习——“物以类聚,人以群分”之聚类分析(层次聚类,K-means)
2019-10-24 13:38:57由浅入深聚类分析·算法原理及核心步骤 -
层次聚类_python层次聚类_层次聚类python - 云+社区 - 腾讯云
2020-11-28 14:38:44广告关闭腾讯云11.11云上盛惠 ,精选... 层次聚类分为两种:合并(自下而上)聚类(agglomerative)分裂(自上而下)聚类(divisive)目前使用较多的是合并聚类 ,本文着重讲解合并聚类的原理。 agens层次聚类原理合并聚... -
原理+代码|详解层次聚类及Python实现/层次树怎么看/如何从层次树中查看聚类过程(附源数据)
2020-12-02 14:36:28聚类分析的方法非常多,能够理解经典又最基础的聚类方法 —— 层次聚类法(系统聚类) 的基本原理并将代码用于实际的业务案例是本文的目标,同时这也会为理解后续与聚类相关的推文如 K-Means 等打下基础。 本文将详细... -
层次聚类算法的原理及实现Hierarchical Clustering
2016-12-07 21:41:48层次聚类算法的原理及实现Hierarchical Clustering 层次聚类(Hierarchical Clustering)是聚类算法的一种,通过计算不同类别数据点间的相似度来创建一棵有层次的嵌套聚类树。在聚类树中,不同类别的原始数据点是树的...