广告
返回顶部
首页 > 资讯 > 精选 >K均值聚类算法的Java版实现代码示例
  • 814
分享到

K均值聚类算法的Java版实现代码示例

javak均值聚类算法 2023-05-30 18:05:19 814人浏览 泡泡鱼
摘要

1.简介K均值聚类算法是先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。一旦全部对象都被分配了,每个聚类的聚类中心会根据聚

1.简介

K均值聚类算法是先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。一旦全部对象都被分配了,每个聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。

2.什么是聚类

聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程,聚类就是一种发现这种内在结构的技术,聚类技术经常被称为无监督学习

3.什么是k均值聚类

k均值聚类是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使用的。给定一个数据点集合和需要的聚类数目k,k由用户指定,k均值算法根据某个距离函数反复把数据分入k个聚类中。

4.实现

Java代码如下:

package org.alGorithm;import java.util.ArrayList;import java.util.Random;public class Kmeans {private int k;// 分成多少簇 private int m;// 迭代次数 private int dataSetLength;// 数据集元素个数,即数据集的长度 private ArrayList<float[]> dataSet;// 数据集链表 private ArrayList<float[]> center;// 中心链表 private ArrayList<ArrayList<float[]>> cluster;// 簇 private ArrayList<float> jc;// 误差平方和,k越接近dataSetLength,误差越小 private Random random;public void setDataSet(ArrayList<float[]> dataSet) {this.dataSet = dataSet;}public ArrayList<ArrayList<float[]>> getCluster() {return cluster;}public Kmeans(int k) {if (k <= 0) {k = 1;}this.k = k;}private void init() {m = 0;random = new Random();if (dataSet == null || dataSet.size() == 0) {initDataSet();}dataSetLength = dataSet.size();if (k > dataSetLength) {k = dataSetLength;}center = initCenters();cluster = initCluster();jc = new ArrayList<float>();}private void initDataSet() {dataSet = new ArrayList<float[]>();// 其中{6,3}是一样的,所以长度为15的数据集分成14簇和15簇的误差都为0 float[][] dataSetArray = new float[][] { { 8, 2 }, { 3, 4 }, { 2, 5 },         { 4, 2 }, { 7, 3 }, { 6, 2 }, { 4, 7 }, { 6, 3 }, { 5, 3 },         { 6, 3 }, { 6, 9 }, { 1, 6 }, { 3, 9 }, { 4, 1 }, { 8, 6 } };for (int i = 0; i < dataSetArray.length; i++) {dataSet.add(dataSetArray[i]);}}private ArrayList<float[]> initCenters() {ArrayList<float[]> center = new ArrayList<float[]>();int[] randoms = new int[k];Boolean flag;int temp = random.nextint(dataSetLength);randoms[0] = temp;for (int i = 1; i < k; i++) {flag = true;while (flag) {temp = random.nextint(dataSetLength);int j = 0;// 不清楚for循环导致j无法加1 // for(j=0;j<i;++j) // { // if(temp==randoms[j]); // { // break; // } // } while (j < i) {if (temp == randoms[j]) {break;}j++;}if (j == i) {flag = false;}}randoms[i] = temp;}// 测试随机数生成情况 // for(int i=0;i<k;i++) // { // System.out.println("test1:randoms["+i+"]="+randoms[i]); // } // System.out.println(); for (int i = 0; i < k; i++) {center.add(dataSet.get(randoms[i]));// 生成初始化中心链表}return center;}private ArrayList<ArrayList<float[]>> initCluster() {ArrayList<ArrayList<float[]>> cluster = new ArrayList<ArrayList<float[]>>();for (int i = 0; i < k; i++) {cluster.add(new ArrayList<float[]>());}return cluster;}private float distance(float[] element, float[] center) {float distance = 0.0f;float x = element[0] - center[0];float y = element[1] - center[1];float z = x * x + y * y;distance = (float) Math.sqrt(z);return distance;}private int minDistance(float[] distance) {float minDistance = distance[0];int minLocation = 0;for (int i = 1; i < distance.length; i++) {if (distance[i] < minDistance) {minDistance = distance[i];minLocation = i;} else if (distance[i] == minDistance) // 如果相等,随机返回一个位置 {if (random.nextint(10) < 5) {minLocation = i;}}}return minLocation;}private void clusterSet() {float[] distance = new float[k];for (int i = 0; i < dataSetLength; i++) {for (int j = 0; j < k; j++) {distance[j] = distance(dataSet.get(i), center.get(j));// System.out.println("test2:"+"dataSet["+i+"],center["+j+"],distance="+distance[j]);}int minLocation = minDistance(distance);// System.out.println("test3:"+"dataSet["+i+"],minLocation="+minLocation); // System.out.println(); cluster.get(minLocation).add(dataSet.get(i));// 核心,将当前元素放到最小距离中心相关的簇中}}private float errorSquare(float[] element, float[] center) {float x = element[0] - center[0];float y = element[1] - center[1];float errSquare = x * x + y * y;return errSquare;}private void countRule() {float jcF = 0;for (int i = 0; i < cluster.size(); i++) {for (int j = 0; j < cluster.get(i).size(); j++) {jcF += errorSquare(cluster.get(i).get(j), center.get(i));}}jc.add(jcF);}private void setNewCenter() {for (int i = 0; i < k; i++) {int n = cluster.get(i).size();if (n != 0) {float[] newCenter = { 0, 0 };for (int j = 0; j < n; j++) {newCenter[0] += cluster.get(i).get(j)[0];newCenter[1] += cluster.get(i).get(j)[1];}// 设置一个平均值 newCenter[0] = newCenter[0] / n;newCenter[1] = newCenter[1] / n;center.set(i, newCenter);}}}public void printDataArray(ArrayList<float[]> dataArray,       String dataArrayName) {for (int i = 0; i < dataArray.size(); i++) {System.out.println("print:" + dataArrayName + "[" + i + "]={"           + dataArray.get(i)[0] + "," + dataArray.get(i)[1] + "}");}System.out.println("===================================");}private void kmeans() {init();// printDataArray(dataSet,"initDataSet"); // printDataArray(center,"initCenter"); // 循环分组,直到误差不变为止 while (true) {clusterSet();// for(int i=0;i<cluster.size();i++) // { // printDataArray(cluster.get(i),"cluster["+i+"]"); // } countRule();// System.out.println("count:"+"jc["+m+"]="+jc.get(m)); // System.out.println(); // 误差不变了,分组完成 if (m != 0) {if (jc.get(m) - jc.get(m - 1) == 0) {break;}}setNewCenter();// printDataArray(center,"newCenter"); m++;cluster.clear();cluster = initCluster();}// System.out.println("note:the times of repeat:m="+m);//输出迭代次数}public void execute() {long startTime = System.currentTimeMillis();System.out.println("kmeans begins");kmeans();long endTime = System.currentTimeMillis();System.out.println("kmeans running time=" + (endTime - startTime)         + "ms");System.out.println("kmeans ends");System.out.println();}}

--结束END--

本文标题: K均值聚类算法的Java版实现代码示例

本文链接: https://www.lsjlt.com/news/220404.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • K均值聚类算法的Java版实现代码示例
    1.简介K均值聚类算法是先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。一旦全部对象都被分配了,每个聚类的聚类中心会根据聚...
    99+
    2023-05-30
    java k均值聚类 算法
  • Python聚类算法之基本K均值实例详解
    本文实例讲述了Python聚类算法之基本K均值运算技巧。分享给大家供大家参考,具体如下: 基本K均值 :选择 K 个初始质心,其中 K 是用户指定的参数,即所期望的簇的个数。每次循环中,每个点被指派到最近的...
    99+
    2022-06-04
    算法 详解 实例
  • K-means聚类算法介绍与利用python实现的代码示例
    聚类 今天说K-means聚类算法,但是必须要先理解聚类和分类的区别,很多业务人员在日常分析时候不是很严谨,混为一谈,其实二者有本质的区别。 分类其实是从特定的数据中挖掘模式,作出判断的过程。比如Gmail...
    99+
    2022-06-04
    示例 算法 代码
  • Python 中怎么实现一个k-means 均值聚类算法
    Python 中怎么实现一个k-means 均值聚类算法,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。scikti-learn 将机器学习分为4个领域,分别是分...
    99+
    2023-06-02
  • Python K-means实现简单图像聚类的示例代码
    这里直接给出第一个版本的直接实现: import os import numpy as np from sklearn.cluster import KMeans import ...
    99+
    2022-11-12
  • python中opencvK均值聚类的实现示例
    目录K均值聚类K均值聚类的基本步骤K均值聚类模块简单例子K均值聚类 预测的是一个离散值时,做的工作就是“分类”。预测的是一个连续值时,做的工作就是&ldquo...
    99+
    2022-11-11
  • Python实现K-近邻算法的示例代码
    目录一、介绍二、k-近邻算法的步骤三、Python 实现四、约会网站配对效果判定五、手写数字识别六、算法优缺点优点缺点一、介绍 k-近邻算法(K-Nearest Neighbour ...
    99+
    2022-11-11
  • K-Means聚类算法及其python实现(已附上代码至本博客)
    目录 一、算法公式讲解二、算法流程三、算法实现代码四、代码结果分析五、K-Means库函数六、K-Means算法时间复杂度 一、算法公式讲解 对于 n代表了x有n维,x上标j表示第j维的特...
    99+
    2023-10-27
    聚类 算法 kmeans
  • Pandas实现聚合运算agg()的示例代码
    目录前言1. 创建DataFrame对象2. 单列聚合3. 多列聚合4. 多种聚合运算5. 多种聚合运算并更改列名6. 不同的列运用不同的聚合函数7. 使用自定义的聚合函数8. 方便...
    99+
    2022-11-12
  • Spectral clustering谱聚类算法的实现代码
    目录1.作者介绍2.关于谱聚类的介绍2.1 谱聚类概述2.2 无向权重图2.3 邻接矩阵2.4 相似矩阵2.5 度矩阵2.6 拉普拉斯矩阵2.7 K-Means3.Spectral ...
    99+
    2022-11-10
  • Java实现Kruskal算法的示例代码
    目录介绍一、构建后的图二、代码三、测试介绍 构造最小生成树还有一种算法,即 Kruskal 算法:设图 G=(V,E)是无向连通带权图,V={1,2,...n};设最小生成树 T=(...
    99+
    2022-11-13
  • Java实现Floyd算法的示例代码
    目录一 问题描述二 代码三 实现一 问题描述 求节点0到节点2的最短路径。 二 代码 package graph.floyd; ...
    99+
    2022-11-13
  • Java实现Dijkstra算法的示例代码
    目录一 问题描述二 实现三 测试一 问题描述 小明为位置1,求他到其他各顶点的距离。 二 实现 package graph.dij...
    99+
    2022-11-13
  • python利用K-Means算法实现对数据的聚类案例详解
    目的是为了检测出采集数据中的异常值。所以很明确,这种情况下的簇为2:正常数据和异常数据两大类 1、安装相应的库 import matplotlib.pyplot as plt # 用于可视化 from skle...
    99+
    2022-06-02
    python K-Means算法聚类 python K-Means算法
  • Java实现雪花算法的示例代码
    一、介绍 SnowFlow算法是Twitter推出的分布式id生成算法,主要核心思想就是利用64bit的long类型的数字作为全局的id。在分布式系统中经常应用到,并且,在id中加入...
    99+
    2022-11-13
  • Java实现抽奖算法的示例代码
    目录一、题目描述二、解题思路三、代码详解四、优化抽奖算法解题思路代码详解一、题目描述 题目: 小虚竹为了给粉丝送福利,决定在参与学习打卡活动的粉丝中抽一位幸运粉丝,送份小礼物。为了公...
    99+
    2022-11-13
  • OpenCV 图像分割实现Kmean聚类的示例代码
    目录1 Kmean图像分割2 流程3 实现1 Kmean图像分割 按照Kmean原理,对图像像素进行聚类。优点:此方法原理简单,效果显著。缺点:实践发现对于前景和背景颜色相近或者颜色...
    99+
    2022-11-13
  • Java 实现LZ78压缩算法的示例代码
    LZ78 压缩算法的 Java 实现 1、压缩算法的实现 通过多路搜索树提高检索速度 package com.wretchant.lz78; import java.util....
    99+
    2022-11-12
  • 如何用K-means算法的Java实现聚类分析681个三国武将
    如何用K-means算法的Java实现聚类分析681个三国武将,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一,k-means算法介绍:k-means算法接受输入量 k ;然后...
    99+
    2023-06-17
  • Java实现拓扑排序算法的示例代码
    目录拓扑排序原理1.点睛2.拓扑排序3.算法步骤4.图解拓扑排序算法实现1.拓扑图2.实现代码3.测试拓扑排序原理 1.点睛 一个无环的有向图被称为有向无环图。有向无环图是描述一个工...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作