2026/2/16 17:44:10
网站建设
项目流程
linux做网站服务器吗,今天北京发生的重大新闻,网站改进建议有哪些,深圳全网推互联科技有限公司23-动态聚类或迭代自组织数据分析算法#xff08;isodata#xff09;ISODATA聚类算法是k-means算法的改进。
与k-means均值算法有两点不同#xff1a;第一#xff0c;它不是每调整一个样本的类别就重新计算一次各类样本的均值。
而是在每次把全部样本都调整完毕之后才重新计…23-动态聚类或迭代自组织数据分析算法isodata ISODATA聚类算法是k-means算法的改进。 与k-means均值算法有两点不同第一它不是每调整一个样本的类别就重新计算一次各类样本的均值。 而是在每次把全部样本都调整完毕之后才重新计算一次样本的均值前者一般称为逐个样本修正法后者称为成批样本修正法。 第二ISODATA算法不仅能通过调整样本所属类别完成聚类分析而且还能自动地进行类的“合并”和“分裂”从而得到类数较为合理的各个聚类。在机器学习领域聚类算法就像个永远充满惊喜的盲盒。今天咱们来扒一扒ISODATA这个既熟悉又陌生的算法——它就像是k-means的pro max版本不仅继承了老大哥的衣钵还偷偷进化出了自己的必杀技。先看段直观的对比实验代码感受下两者的差异def update_centers_kmeans(data, labels): new_centers [] for cluster_id in np.unique(labels): new_centers.append(np.mean(data[labels cluster_id], axis0)) return np.array(new_centers) # ISODATA的均值更新 def update_centers_isodata(data, labels): # 等所有样本都完成类别调整后才计算 return update_centers_kmeans(data, labels) # 这里表面相同实际触发时机不同看起来是不是像双胞胎但魔鬼藏在执行顺序里。k-means像急性子的外卖小哥每次送完一单就急着更新位置而ISODATA更像稳重的老司机等所有乘客都上车后才调整路线。真正让ISODATA封神的是它的动态分合绝技。咱们用代码模拟下这个机制class Cluster: def __init__(self, points): self.points np.array(points) self.center self.points.mean(axis0) self.variance self.points.var() def split_check(self, max_variance0.5): if self.variance max_variance: # 分裂成两个新簇 split_vector np.random.randn(*self.center.shape) * 0.1 return [Cluster(self.points split_vector), Cluster(self.points - split_vector)] return [self] staticmethod def merge_check(clusters, min_distance1.0): merged [] used set() for i, c1 in enumerate(clusters): if i in used: continue for j, c2 in enumerate(clusters[i1:], i1): if np.linalg.norm(c1.center - c2.center) min_distance: merged.append(Cluster(np.vstack([c1.points, c2.points]))) used.update([i,j]) break else: merged.append(c1) return merged这段代码藏着三个彩蛋方差检测器当簇内数据波动过大时自动裂变距离感应器亲密过度的簇会触发融合反应自适应的迭代策略整个过程像细胞分裂一样自主演进来个实战案例用ISODATA处理月球表面陨石坑数据def isodata_flow(data, initial_k3, max_iters10): clusters [Cluster(data[np.random.choice(len(data), 10)]) for _ in range(initial_k)] for _ in range(max_iters): # 分配阶段 labels np.argmin([[np.linalg.norm(x-c.center)] for x in data], axis1) # 动态调整 new_clusters [] for c in clusters: new_clusters.extend(c.split_check()) clusters Cluster.merge_check(new_clusters) # 均值更新 for c in clusters: c.center np.mean(c.points, axis0) return clusters运行时会看到这样的场景初始的3个簇在迭代中不断分裂融合就像智能生物在寻找最佳群落结构。有个有趣的发现——当处理环形分布数据时ISODATA的表现完胜k-means因为它能通过分裂产生足够多的子类再通过合并形成自然边界。不过要注意几个参数陷阱方差阈值设太低会导致过度分裂合并距离设太大会让不同类过早融合初始样本量不足会影响分裂效果这个算法的聪明之处在于它把人类处理模糊问题的直觉编码成了数学规则。就像经验丰富的园丁修剪盆栽既不会让枝叶过于稀疏也不会让它们纠缠不清。下次遇到形状怪异的数据分布时不妨试试这个会自我进化的聚类算法说不定会有意外惊喜。