什么是聚类将物理或抽象对象的集合分成由类似的对象组成

什么是聚类
将一组物理或抽象对象划分为相似对象类的过程称为聚类 。聚类产生的簇是数据对象的集合,这些数据对象与同一簇中的对象相似,而与其他簇中的对象不同 。聚类分析,又称组分析,是研究(样本或索引)分类问题的一种统计分析方法 。
什么是聚类将物理或抽象对象的集合分成由类似的对象组成
聚类分析起源于分类学,但聚类不等于分类 。聚类和分类的区别在于聚类所需的类是未知的 。聚类分析的内容非常丰富,包括系统聚类法、有序样本聚类法、动态聚类法、模糊聚类法、图论聚类法、聚类预测法等 。
开始
层次聚类( )是一种聚类算法,它通过计算不同类的相似度来创建层次嵌套的树 。
什么是聚类将物理或抽象对象的集合分成由类似的对象组成
层次聚类算法简介
假设有n个样本需要聚类看层次的术数,对于层次聚类算法,其步骤为:
什么是聚类将物理或抽象对象的集合分成由类似的对象组成
整个过程就是构建一棵树 。在构建过程中,可以在步骤 4 中设置要分类的类别数作为迭代的终止条件 。毕竟,将它们全部分类是不切实际的 。
聚类之间的相似性
集群和集群之间的相似性度量是什么?因为它是空间中的一个点,所以可以用距离来衡量 。一般有以下三种:
也称为 -,是将两个类中距离最近的两个样本之间的距离作为两个集合之间的距离 。这种计算方式容易造成所谓的效果 。两者显然与“大图”相去甚远,但由于个别点比较接近,所以合并了,合并后效果会进一步扩大,最后变得松散一些 。
这完全是相反的极端,取两组中距离最远的两点之间的距离作为两组之间的距离 。效果正好相反,而且限度非常大 。这两种相似度定义方法的共同问题是考虑了某个特征数据,而没有考虑类内数据的整体特征 。
这种方法是将两组中两点的所有距离放在一起计算平均值,相对可以得到一个合适的结果 。有时异常值的存在会影响均值 。普通人和富人的平均收入会提高看层次的术数,对吧?因此,这种计算方法的一种变体是取对之间距离的中位数 。
实现层次聚类
空间中点之间的距离使用欧几里得距离:
import mathimport numpy as npdef euler_distance(point1: np.ndarray, point2: list) -> float: """

计算两点之间的欧拉距离,支持多维
""" distance = 0.0 for a, b in zip(point1, point2): distance += math.pow(a - b, 2) return math.sqrt(distance)
定义集群数量的节点:
class ClusterNode(object): def __init__(self, vec, left=None, right=None, distance=-1, id=None, count=1): """ :param vec: 保存两个数据聚类后形成新的中心 :param left: 左节点 :param right: 右节点 :param distance: 两个节点的距离 :param id: 用来标记哪些节点是计算过的
什么是聚类将物理或抽象对象的集合分成由类似的对象组成
:param count: 这个节点的叶子节点个数 """ self.vec = vec self.left = left self.right = right self.distance = distance self.id = id self.count = count
vec表示合并后的簇中心,是表示整个簇位置的一个点;表示左节点和右节点之间的距离 。
计算层次聚类算法的类:
class Hierarchical(object): def __init__(self, k = 1): assert k > 0 self.k = k self.labels = None def fit(self, x): nodes = [ClusterNode(vec=v, id=i) for i,v in enumerate(x)] distances = {} point_num, future_num = np.shape(x) # 特征的维度 self.labels = [ -1 ] * point_num currentclustid = -1 while len(nodes) > self.k: min_dist = math.inf nodes_len = len(nodes) closest_part = None # 表示最相似的两个聚类 for i in range(nodes_len - 1): for j in range(i + 1, nodes_len): # 为了不重复计算距离,保存在字典内 d_key = (nodes[i].id, nodes[j].id) if d_key not in distances: distances[d_key] = euler_distance(nodes[i].vec, nodes[j].vec) d = distances[d_key] if d


以上关于本文的内容,仅作参考!温馨提示:如遇专业性较强的问题(如:疾病、健康、理财等),还请咨询专业人士给予相关指导!

「辽宁龙网」www.liaoninglong.com小编还为您精选了以下内容,希望对您有所帮助: