1. K-means算法介绍

先放着,日后补上!

2. java实现代码

代码说明:
1. 测试数据的输入维度必须都相等才能运行!
    [1,2,3,3]和[2,3,4,4] 这样维度相同,都是4维,可以运行。
    [1,2,3,3]和[2,3,4] 这样维度不相同,不能运行。
2. 输入数据的点,尽量不要重复!
    输入的数据点[1,2,3]和[1,2,3] 这样的数据点是重复的。可以运行,但是性能会下降。

2.1 分装Point类

public class Point {private float[] localArray;private int id;private int clusterId;  // 标识属于哪个类中心。private float dist;     // 标识和所属类中心的距离。public Point(int id, float[] localArray) {this.id = id;this.localArray = localArray;}public Point(float[] localArray) {this.id = -1; //表示不属于任意一个类this.localArray = localArray;}public float[] getlocalArray() {return localArray;}public int getId() {return id;}public void setClusterId(int clusterId) {this.clusterId = clusterId;}public int getClusterid() {return clusterId;}public float getDist() {return dist;}public void setDist(float dist) {this.dist = dist;}@Overridepublic String toString() {String result = "Point_id=" + id + "  [";for (int i = 0; i < localArray.length; i++) {result += localArray[i] + " ";}return result.trim()+"] clusterId: "+clusterId+" dist: "+dist;}@Overridepublic boolean equals(Object obj) {if (obj == null || getClass() != obj.getClass())return false;Point point = (Point) obj;if (point.localArray.length != localArray.length)return false;for (int i = 0; i < localArray.length; i++) {if (Float.compare(point.localArray[i], localArray[i]) != 0) {return false;}}return true;}@Overridepublic int hashCode() {float x = localArray[0];float y = localArray[localArray.length - 1];long temp = x != +0.0d ? Double.doubleToLongBits(x) : 0L;int result = (int) (temp ^ (temp >>> 32));temp = y != +0.0d ? Double.doubleToLongBits(y) : 0L;result = 31 * result + (int) (temp ^ (temp >>> 32));return result;}
}

2.2 封装Cluster

import java.util.ArrayList;
import java.util.List;public class Cluster {private int id;// 标识private Point center;// 中心private List<Point> members = new ArrayList<Point>();// 成员public Cluster(int id, Point center) {this.id = id;this.center = center;}public Cluster(int id, Point center, List<Point> members) {this.id = id;this.center = center;this.members = members;}public void addPoint(Point newPoint) {if (!members.contains(newPoint)){members.add(newPoint);}else{System.out.println("样本数据点 {"+newPoint.toString()+"} 已经存在!");}}public int getId() {return id;}public Point getCenter() {return center;}public void setCenter(Point center) {this.center = center;}public List<Point> getMembers() {return members;}@Overridepublic String toString() {String toString = "Cluster \n" + "Cluster_id=" + this.id + ", center:{" + this.center.toString()+"}";for (Point point : members) {toString+="\n"+point.toString();}return toString+"\n";}
}

2.3 求两个点的欧式距离

public class DistanceCompute {/*** 求欧式距离*/public double getEuclideanDis(Point p1, Point p2) {double count_dis = 0;float[] p1_local_array = p1.getlocalArray();float[] p2_local_array = p2.getlocalArray();if (p1_local_array.length != p2_local_array.length) {throw new IllegalArgumentException("length of array must be equal!");}for (int i = 0; i < p1_local_array.length; i++) {count_dis += Math.pow(p1_local_array[i] - p2_local_array[i], 2);}return Math.sqrt(count_dis);}
}

2.4 核心运行类

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;public class KMeansRun {  private int kNum;                             //簇的个数private int iterNum = 10;                     //迭代次数private int iterMaxTimes = 100000;            //单次迭代最大运行次数private int iterRunTimes = 0;                 //单次迭代实际运行次数private float disDiff = (float) 0.01;         //单次迭代终止条件,两次运行中类中心的距离差private List<float[]> original_data =null;    //用于存放,原始数据集  private static List<Point> pointList = null;  //用于存放,原始数据集所构建的点集private DistanceCompute disC = new DistanceCompute();private int len = 0;                          //用于记录每个数据点的维度public KMeansRun(int k, List<float[]> original_data) {this.kNum = k;this.original_data = original_data;this.len = original_data.get(0).length; //检查规范check();//初始化点集。init();}/*** 检查规范*/private void check() {if (kNum == 0){throw new IllegalArgumentException("k must be the number > 0");  }if (original_data == null){throw new IllegalArgumentException("program can't get real data");}} /** * 初始化数据集,把数组转化为Point类型。*/private void init() {pointList = new ArrayList<Point>();for (int i = 0, j = original_data.size(); i < j; i++){pointList.add(new Point(i, original_data.get(i)));}}/** * 随机选取中心点,构建成中心类。*/  private Set<Cluster> chooseCenterCluster() {Set<Cluster> clusterSet = new HashSet<Cluster>();Random random = new Random();for (int id = 0; id < kNum; ) {Point point = pointList.get(random.nextInt(pointList.size()));// 用于标记是否已经选择过该数据。boolean flag =true;for (Cluster cluster : clusterSet) {if (cluster.getCenter().equals(point)) {flag = false;}}// 如果随机选取的点没有被选中过,则生成一个clusterif (flag) {Cluster cluster =new Cluster(id, point);clusterSet.add(cluster);id++;}}return clusterSet;  }/*** 为每个点分配一个类!*/public void cluster(Set<Cluster> clusterSet){// 计算每个点到K个中心的距离,并且为每个点标记类别号for (Point point : pointList) {float min_dis = Integer.MAX_VALUE;for (Cluster cluster : clusterSet) {float tmp_dis = (float) Math.min(disC.getEuclideanDis(point, cluster.getCenter()), min_dis);if (tmp_dis != min_dis) {min_dis = tmp_dis;point.setClusterId(cluster.getId());point.setDist(min_dis);}}}// 新清除原来所有的类中成员。把所有的点,分别加入每个类别for (Cluster cluster : clusterSet) {cluster.getMembers().clear();for (Point point : pointList) {if (point.getClusterid()==cluster.getId()) {cluster.addPoint(point);}}}}/*** 计算每个类的中心位置!*/public boolean calculateCenter(Set<Cluster> clusterSet) {boolean ifNeedIter = false; for (Cluster cluster : clusterSet) {List<Point> point_list = cluster.getMembers();float[] sumAll =new float[len];// 所有点,对应各个维度进行求和for (int i = 0; i < len; i++) {for (int j = 0; j < point_list.size(); j++) {sumAll[i] += point_list.get(j).getlocalArray()[i];}}// 计算平均值for (int i = 0; i < sumAll.length; i++) {sumAll[i] = (float) sumAll[i]/point_list.size();}// 计算两个新、旧中心的距离,如果任意一个类中心移动的距离大于dis_diff则继续迭代。if(disC.getEuclideanDis(cluster.getCenter(), new Point(sumAll)) > disDiff){ifNeedIter = true;}// 设置新的类中心位置cluster.setCenter(new Point(sumAll));}return ifNeedIter;}/*** 运行 k-means*/public Set<Cluster> run() {Set<Cluster> clusterSet= chooseCenterCluster();boolean ifNeedIter = true; while (ifNeedIter) {cluster(clusterSet);ifNeedIter = calculateCenter(clusterSet);iterRunTimes ++ ;}return clusterSet;}/*** 返回实际运行次数*/public int getIterTimes() {return iterRunTimes;}
}

2.5 测试类

import java.util.ArrayList;
import java.util.Set;public class Main {public static void main(String[] args) {ArrayList<float[]> dataSet = new ArrayList<float[]>();dataSet.add(new float[] { 1, 2, 3 });dataSet.add(new float[] { 3, 3, 3 });dataSet.add(new float[] { 3, 4, 4});dataSet.add(new float[] { 5, 6, 5});dataSet.add(new float[] { 8, 9, 6});dataSet.add(new float[] { 4, 5, 4});dataSet.add(new float[] { 6, 4, 2});dataSet.add(new float[] { 3, 9, 7});dataSet.add(new float[] { 5, 9, 8});dataSet.add(new float[] { 4, 2, 10});dataSet.add(new float[] { 1, 9, 12});dataSet.add(new float[] { 7, 8, 112});dataSet.add(new float[] { 7, 8, 4});KMeansRun kRun =new KMeansRun(3, dataSet);Set<Cluster> clusterSet = kRun.run();System.out.println("单次迭代运行次数:"+kRun.getIterTimes());for (Cluster cluster : clusterSet) {System.out.println(cluster);}}
}

3. 关于输入数据和运行结果

这里故意加入了一个异常点[7 , 8 ,112]进行测试,果然独自分为一类:

个人分类:数据分析

基于Java实现K-means算法相关推荐

  1. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  2. 基于改进的k最近邻算法的单体型重建问题An Improved KNN Algorithm for Haplotype Reconstruction Problem

    基于改进的k最近邻算法的单体型重建问题 An Improved KNN Algorithm for Haplotype Reconstruction Problem DOI: 10.12677/csa ...

  3. 基于SPSS的K均值算法

    文章目录 前言 一.K均值算法是什么? 二.动画演示 1.网站 2.示例 三.缺点解决(K-means++算法) 四.SPSS实现 总结 前言 菜鸡学习数学建模 一.K均值算法是什么? K-means ...

  4. java实现k 近邻算法_K近邻算法哪家强?KDTree、Annoy、HNSW原理和使用方法介绍

    1.什么是K近邻算法 K近邻算法(KNN)是一种常用的分类和回归方法,它的基本思想是从训练集中寻找和输入样本最相似的k个样本,如果这k个样本中的大多数属于某一个类别,则输入的样本也属于这个类别. 关于 ...

  5. 基于Python的K近邻算法实现

    模式识别 K近邻法 目录 模式识别 K近邻法 1 一.最近邻.k近邻算法介绍 2 1.1 介绍 2 1.2 近邻法的形式化表示 2 (1)最近邻 2 (2)k近邻 3 二.实验数据集介绍 3 2.1 ...

  6. k means算法C语言伪代码,K均值算法(K-Means)

    1. K-Means算法步骤 算法步骤 收敛性定义,畸变函数(distortion function): 伪代码: 1) 创建k个点作为K个簇的起始质心(经常随机选择) 2) 当任意一个点的蔟分配结果 ...

  7. java实现 k nn算法_数据挖掘(二)——Knn算法的java实现

    本文接数据挖掘-基于Kmeans算法.MBSAS算法及DBSCAN算法的newsgroup18828文本聚类器的JAVA实现(上). (update 2012.12.28 关于本项目下载及运行的常见问 ...

  8. 基于java注册登录MD5算法加盐加密颁发 Token身份令牌使用各种邮箱发送验证码详解雪花算法

    目的作用 == 在项目中,为了防止别人窥视我们的密码通常我们会采取一些加密方式.这里简单介绍一下MD5 加盐加密方法,MD5叫做信息-摘要算法,严格来说不是加密方式,而是信息摘要. 对于可以接触到数据 ...

  9. 基于Java实现的MD5算法实现

    MD5 算法实现 一.算法原理概述 MD5 即 MD5 Message-Digest Algorithm(MD5 消息摘要算法). MD4 (1990).MD5(1992, RFC 1321) 由 R ...

  10. 基于JAVA实现的排序算法总结

    常用的排序方法有:冒泡排序.快速排序.选择排序.插入排序.归并排序,除此之外,还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.希尔排序等,这里着重介绍下前半段列举的几种常见方法的实现. 1. 冒泡排序法: ...

最新文章

  1. JSTL fmt:formatNumber 数字、货币格式化
  2. spring boot 打包jar,jar没有主目录清单
  3. 王者服务器维修2019年四月份,2019王者荣耀4周年庆版本更新时间介绍[图]
  4. ps2020的antlib文件在哪_ant design pro 新增页面
  5. 【ssh从零单排】eclipse和tomcat整合配置
  6. java 代码造假_老板居然让我在Java项目中“造假”
  7. PHP递归删除目录面试题,PHP 递归删除目录中文件
  8. 浅析tornado协程运行原理
  9. HttpContext.Current.Session.SessionID相关问题及备忘
  10. Win8 开发者训练营第一天的过程,感受和收获
  11. 关于表数据同步使用update_time时的注意事项
  12. QT设置画笔/画刷颜色
  13. 「ds」网络操作系统和分布式操作系统之间的区别
  14. Transforming Cooling Optimization for Green Data Center via Deep Reinforcement Learning 笔记
  15. MEM专业学位论文选题与研究设计
  16. 换个角度理解正则表达式
  17. javascript实现单例模式
  18. SQL SERVER之填充因子
  19. FFA 2021 专场解读 - 平台建设
  20. “如果有借鉴意义的话” —— 从上帝视角复盘Offer选择

热门文章

  1. Wavemaker和 apache cordova混合开发之圖片上傳
  2. Kubernetes K8S在IPVS代理模式下Service服务的ClusterIP类型访问失败处理
  3. 计算机毕业设计Java车牌信息管理系统(源码+系统+mysql数据库+lw文档)
  4. AX200网卡优先级问题
  5. OTSU(大津算法)
  6. GitLab安装,基于清华大学镜像
  7. 水布垭水电站溢洪道闸门电气控制系统改造项目顺利验收
  8. python——一个投票器
  9. 如何计算我的“五险一金”
  10. 用VB代码在SQL SERVER 中创建数据库,表,列.以及对数据库的操作