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

< min_dist: min_dist = d closest_part = (i, j) # 合并两个聚类 part1, part2 = closest_part
什么是聚类将物理或抽象对象的集合分成由类似的对象组成
node1, node2 = nodes[part1], nodes[part2] new_vec = [ (node1.vec[i] * node1.count + node2.vec[i] * node2.count ) / (node1.count + node2.count) for i in range(future_num)] new_node = ClusterNode(vec=new_vec, left=node1, right=node2, distance=min_dist, id=currentclustid, count=node1.count + node2.count) currentclustid -= 1 del nodes[part2], nodes[part1] # 一定要先del索引较大的 nodes.append(new_node) self.nodes = nodes self.calc_label() def calc_label(self): """ 调取聚类的结果 """ for i, node in enumerate(self.nodes): # 将节点的所有叶子节点都分类 self.leaf_traversal(node, i) def leaf_traversal(self, node: ClusterNode, label): """ 递归遍历叶子节点 """ if node.left == None and node.right == None: self.labels[node.id] = label if node.left: self.leaf_traversal(node.left, label) if node.right: self.leaf_traversal(node.right, label)
最后,集群的列表标签保存在 .
测试
与之比较:
iris = datasets.load_iris()my = Hierarchical(4)my.fit(iris.data)
什么是聚类将物理或抽象对象的集合分成由类似的对象组成
print(np.array(my.labels))sk = cluster.AgglomerativeClustering(4)sk.fit(iris.data)print(sk.labels_)
获得输出:
[3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 0 1 1 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 0 1 1 1 1 0 1 2 1 2 2 2 2 1 2 2 2 2
2 2 1 1 2 2 2 2 1 2 1 2 1 2 2 1 1 2 2 2 2 2 1 2 2 2 2 1 2 2 2 1 2 2 2 1 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 1 2 2 2 3 2 3 2 3 2 3 3 2 3 2 3 2 3 3 2 3 2 2 2 2
2 2 2 0 2 3 3 3 3 2 3 2 2 2 3 3 3 2 3 3 3 3 3 2 3 3 0 2 0 0 0 0 3 0 0 0 0
0 0 2 2 0 0 0 0 2 0 2 0 2 0 0 2 2 0 0 0 0 0 2 2 0 0 0 2 0 0 0 2 0 0 0 2 0
0 2]
结果还是很理想的 。
层次聚类的优缺点
优势:
缺点:
计算复杂度高,不适合大数据量;该算法很可能形成一条链 。
【什么是聚类将物理或抽象对象的集合分成由类似的对象组成】这篇文章到此结束 。如果您喜欢这篇文章或者认为这篇文章对您有帮助,您可以按需关注或转发 。
最后
小编精心推荐了一个学习的好地方 。想来的可以私信小编PT 。这里有免费的学习资料!
实验源码附在文末:
# coding: utf-8# 层次聚类import mathimport numpy as npfrom sklearn import datasetsfrom sklearn import clusterdef 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 = countclass 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 dfor i in range(future_num)] new_node = ClusterNode(vec=new_vec, left=node1, right=node2, distance=min_dist, id=currentclustid, count=node1.count + node2.count) currentclustid -= 1 del nodes[part2], nodes[part1] # 一定要先del索引较大的 nodes.append(new_node) self.nodes = nodes self.calc_label() def calc_label(self): """ 调取聚类的结果 """ for i, node in enumerate(self.nodes): # 将节点的所有叶子节点都分类 self.leaf_traversal(node, i) def leaf_traversal(self, node: ClusterNode, label): """ 递归遍历叶子节点 """ if node.left == None and node.right == None: self.labels[node.id] = label if node.left: self.leaf_traversal(node.left, label) if node.right: self.leaf_traversal(node.right, label)iris = datasets.load_iris()my = Hierarchical(4)my.fit(iris.data)print(np.array(my.labels))sk = cluster.AgglomerativeClustering(4)sk.fit(iris.data)print(sk.labels_)


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

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