KMean 聚类

2024-01-27 04:28
文章标签 聚类 kmean

本文主要是介绍KMean 聚类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

KMean 聚类

  • KMean 聚类
    • 1 解决什么问题
    • 2 java实现计算二维点的聚类案例
    • 输出

KMean 聚类

1 解决什么问题

假设二维坐标轴上有一些点,现在让你把这些点分个类。于是对我们来说,这个分类似乎就是把距离相近的点画到一类中去。

  1. 假设要划分N类,坐标点M
  2. M个坐标点随机选取N个点,作为每个分类的中心点,这N个点的列表记录为centerPointList
  3. 遍历M个坐标点中的每个点
    • 计算当前点和N个中心点的距离,dis1、dis2 ... disN
    • dis1、dis2 ... disN找到最小的距离的下标。下标记录为cluster,那么这个cluster就是这次遍历时候当前点归属的分类。
  4. 步骤3结束后,每个点都会归属到某个分类。计算每个分类中点集合的均值,把这个均值作为新的中心点,替换掉centerPointList
  5. 重复3、4直到重复次数大于约定次数,或者中心点变化较小。此时就可以知道每个点归属的分类。

2 java实现计算二维点的聚类案例

package com.forezp.kmean;import com.google.common.collect.Lists;
import com.google.common.collect.Maps;import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Random;/*** @author yuegang*/
public class KMeanCluster {/*** 表示二维空间中的点*/public static class Point {Integer x = 0;Integer y = 0;public Point() {}public Point(Integer x, Integer y) {this.x = x;this.y = y;}public void incX(Integer x) {this.x += x;}public void incY(int y) {this.y += y;}public Integer getX() {return x;}public void setX(Integer x) {this.x = x;}public Integer getY() {return y;}public void setY(Integer y) {this.y = y;}@Overridepublic String toString() {return "(" + x + ", " + y + ")";}}/*** 表示二维空间中的点* 下标是点的顺序*/private final List<Point> pointIndexDataMap;private final List<List<Point>> centerPointList = Lists.newArrayList(); // 记录每一个分类的中心点private final List<Integer> pointClusterMap = Lists.newArrayList(); // 点所属的分类private int index = 0; // 计算次数private int clusterCount = 0; // 分类个数public KMeanCluster(List<Point> pointIndexDataMap, int clusterCount) {this.pointIndexDataMap = pointIndexDataMap;this.clusterCount = clusterCount;index = 0;initCenterPoint();initCluster(pointIndexDataMap);}private void initCluster(List<Point> pointIndexDataMap) {// 初始化每个点的分类,设置一个没有意义的值for (int j = 0; j < pointIndexDataMap.size(); ++j) {pointClusterMap.add(-1);}}private void initCenterPoint() {List<Point> objects = Lists.newArrayListWithExpectedSize(clusterCount);List<Integer> yList = Lists.newArrayListWithExpectedSize(clusterCount);Random random = new Random();for (int i = 0; i < clusterCount; ++i) { // 注意这个不能相同int i1 = random.nextInt(pointIndexDataMap.size());while (yList.contains(i1)) {i1 = random.nextInt(pointIndexDataMap.size());}yList.add(i1);}for (int i = 0; i < clusterCount; ++i) {objects.add(pointIndexDataMap.get(yList.get(i)));}centerPointList.add(objects);}public void calc() {List<Point> pointIndices = centerPointList.get(index);for (int i = 0; i < pointIndexDataMap.size(); ++i) {Point point = pointIndexDataMap.get(i);// 计算该点和那个簇最近,把把归属到这个簇中。int cluster = 0;double min = Double.MAX_VALUE;for (int inc = 0; inc < pointIndices.size(); ++inc) {Point point1 = pointIndices.get(inc);Integer x = point.getX();Integer y = point.getY();Integer x1 = point1.getX();Integer y1 = point1.getY();int i1 = x - x1;int i2 = y - y1;int total = i1 * i1 + i2 * i2;double sqrt = Math.sqrt(total);if (sqrt < min) {min = sqrt;cluster = inc;}}pointClusterMap.set(i, cluster);}// 计算每个族的中心点;int size = centerPointList.get(0).size();Map<Integer, Point> map = Maps.newTreeMap();Map<Integer, Integer> cluterCount = Maps.newHashMapWithExpectedSize(size);for (int i = 0; i < pointClusterMap.size(); ++i) {int cluster = pointClusterMap.get(i);Point point = map.computeIfAbsent(cluster, sss -> new Point());cluterCount.put(cluster, cluterCount.getOrDefault(cluster, 0) + 1);Point point1 = pointIndexDataMap.get(i);point.incX(point1.getX());point.incY(point1.getY());}for (Map.Entry<Integer, Point> integerPointEntry : map.entrySet()) {Integer key = integerPointEntry.getKey();Point point = integerPointEntry.getValue();Integer integer = cluterCount.get(key);point.setX(point.getX() / integer);point.setY(point.getY() / integer);}++index;Map<Integer, List<Point>> curClassfiyMap = Maps.newTreeMap();for (int i = 0; i < pointClusterMap.size(); ++i) {Point point = pointIndexDataMap.get(i);Integer classfly = pointClusterMap.get(i);List<Point> points = curClassfiyMap.computeIfAbsent(classfly, k -> Lists.newArrayList());points.add(point);}List<Point> curCenterPointList = new ArrayList<>(map.values());centerPointList.add(curCenterPointList);show(curClassfiyMap, curCenterPointList);}private void show(Map<Integer, List<Point>> curClassfiyMap, List<Point> curCenterPointList) {System.out.println("计算次数:" + index);System.out.println("当前分类:" + curClassfiyMap);System.out.println("当前中心点:" + curCenterPointList);}public static void main(String[] args) {Point point = new Point(100, 100);Point point1 = new Point(1, 1);Point point2 = new Point(110, 120);Point point3 = new Point(10, 20);Point point4 = new Point(130, 160);List<Point> pointIndexDataMap = Lists.newArrayList(point, point1, point2, point3, point4);KMeanCluster oneCalc = new KMeanCluster(pointIndexDataMap, 2);for (int i = 0; i < 2; ++i) {oneCalc.calc();}}
}

输出

计算次数:1
当前分类:{0=[(110, 120), (130, 160)], 1=[(100, 100), (1, 1), (10, 20)]}
当前中心点:[(120, 140), (37, 40)]
计算次数:2
当前分类:{0=[(100, 100), (110, 120), (130, 160)], 1=[(1, 1), (10, 20)]}
当前中心点:[(113, 126), (5, 10)]

这篇关于KMean 聚类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/649050

相关文章

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering)

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering) Power Iteration Clustering (PIC) 是一种基于图的聚类算法,用于在大规模数据集上进行高效的社区检测。PIC 算法的核心思想是通过迭代图的幂运算来发现数据中的潜在簇。该算法适用于处理大规模图数据,特别是在社交网络分析、推荐系统和生物信息学等领域具有广泛应用。Spa

用Pytho解决分类问题_DBSCAN聚类算法模板

一:DBSCAN聚类算法的介绍 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,DBSCAN算法的核心思想是将具有足够高密度的区域划分为簇,并能够在具有噪声的空间数据库中发现任意形状的簇。 DBSCAN算法的主要特点包括: 1. 基于密度的聚类:DBSCAN算法通过识别被低密

Spark2.x 入门: KMeans 聚类算法

一 KMeans简介 KMeans 是一个迭代求解的聚类算法,其属于 划分(Partitioning) 型的聚类方法,即首先创建K个划分,然后迭代地将样本从一个划分转移到另一个划分来改善最终聚类的质量。 ML包下的KMeans方法位于org.apache.spark.ml.clustering包下,其过程大致如下: 1.根据给定的k值,选取k个样本点作为初始划分中心;2.计算所有样本点到每

【ML--13】聚类--层次聚类

一、基本概念 层次聚类不需要指定聚类的数目,首先它是将数据中的每个实例看作一个类,然后将最相似的两个类合并,该过程迭代计算只到剩下一个类为止,类由两个子类构成,每个子类又由更小的两个子类构成。 层次聚类方法对给定的数据集进行层次的分解,直到某种条件满足或者达到最大迭代次数。具体又可分为: 凝聚的层次聚类(AGNES算法):一种自底向上的策略,首先将每个对象作为一个簇,然后合并这些原子簇为越来

第L8周:机器学习|K-means聚类算法

本文为🔗365天深度学习训练营中的学习记录博客 🍖 原作者:K同学啊 | 接辅导、项目定制 🚀 文章来源:K同学的学习圈子深度学习 聚类算法的定义: 聚类就是将一个庞杂数据集中具有相似特征的数据自动归类到一起,称为一个簇,簇内的对象越相似,聚类的效果越好。“相似”这一概念,是利用距离标准来衡量的,我们通过计算对象与对象之间的距离远近来判断它们是否属于同一类别,即是否是同一个簇。 聚类是

自然语言处理系列五十三》文本聚类算法》文本聚类介绍及相关算法

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列五十三文本聚类算法》文本聚类介绍及相关算法K-means文本聚类算法原理 总结 自然语言处理系列五十三 文本聚类算法》文本聚类介绍及相关算法 分类和聚类都是文本挖掘中常使用的方法,他们的目的都是将相

Python计算机视觉编程——第六章 图像聚类

目录 1 K-means聚类1.1 Scipy聚类包1.2 图像聚类1.3 在主成分上可视化图像1.4 像素聚类 2 层次聚类3 谱聚类 聚类可以用于识别,划分图像数据集,组织与导航。 1 K-means聚类 K-means是一种将输入数据划分为k个簇的简单的聚类算法。步骤如下: (1) 以随机或猜测的方式初始化类中心 u i , i = 1 ⋯ k ; u_i,i=1\cd

Python计算机视觉第六章-图像聚类

目录 6.1 K-means聚类 6.1.1 SciPy聚类包 6.1.2 图像聚类 6.1.3 在主成分上可视化图像 6.1.4 像素聚类 6.2 层次聚类 6.3 谱聚类 6.1 K-means聚类         K-means 是一种将输入数据划分成 k 个簇的简单的聚类算法。K-means 反复提炼初 始评估的类中心,步骤如下: (1) 以随机或猜测

基于Python的机器学习系列(20):Mini-Batch K均值聚类

简介         K均值聚类(K-Means Clustering)是一种经典的无监督学习算法,但在处理大规模数据集时,计算成本较高。为了解决这一问题,Mini-Batch K均值聚类应运而生。Mini-Batch K均值聚类通过使用数据的子集(mini-batch)来更新簇中心,从而减少了计算量,加快了处理速度。 Mini-Batch K均值算法         Mini-Batch