配置

配置请看我的其他文章 点击跳转

spark官方文档

点击跳转官方文档

数据

训练数据


实体类

用了swagger和lombok 不需要的可以删掉


import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;/*** k means聚类** @author teler*/
@Data
public class KMeansEntity {/*** 数据集路径*/@ApiModelProperty("数据源路径")@NotEmpty(message = "数据源路径不能为空")private String dataFilePath;/*** 簇数*/@ApiModelProperty("簇数")@NotNull(message = "簇数必填")@Min(value = 1, message = "簇数最小为1")private int k;/*** 迭代次数*/@ApiModelProperty("迭代次数")@NotNull(message = "迭代次数必填")@Min(value = 0, message = "迭代次数最小为0")private int iter;}

算法实现

里面有些方法是为了保留小数 不需要的自己改


@Resource
private transient SparkSession sparkSession;@Overridepublic Map<String, Object> kmeans(KMeansEntity record) {log.info("========== k均值聚类算法开始 ==========");Dataset<Row> dataset = getDataSetByHdfs(record.getDataFilePath());//设置聚类算法参数KMeans kmeans = new KMeans().setK(record.getK()).setSeed(1L).setMaxIter(record.getIter());KMeansModel model = kmeans.fit(dataset);Dataset<Row> predictions = model.transform(dataset);ClusteringEvaluator evaluator = new ClusteringEvaluator();Map<String, Object> map = new HashMap<>();List<Map<String, String>> centers = new ArrayList<>();Vector[] clusterArray = model.clusterCenters();for (Vector center : clusterArray) {log.info("中心值:{}", center.toString());Map<String, String> centerMap = new HashMap<>();centerMap.put("center", ArrayUtil.join(Arrays.stream(center.toArray()).map(val -> NumberUtil.roundDown(val, 3).doubleValue()).toArray(), ","));centers.add(centerMap);}// 簇中心点map.put("clusterCenters", centers);// 误差 Silhouette with squared euclidean distancemap.put("sse", NumberUtil.roundDown(evaluator.evaluate(predictions), 3));// 区分样本数据所属簇List<Row> rows = predictions.collectAsList();List<Map<String, Object>> data = new ArrayList<>();for (int i = 0; i < rows.size(); i++) {Map<String, Object> dataMap = new HashMap<>();dataMap.put("index", i);Vector vector = rows.get(i).getAs("features");dataMap.put("features", vector.toArray());int belong = model.predict(vector);dataMap.put("belong", belong);dataMap.put("center", ArrayUtil.join(Arrays.stream(clusterArray[belong].toArray()).map(val -> NumberUtil.roundDown(val, 3).doubleValue()).toArray(), ","));data.add(dataMap);}map.put("data", data);log.info("========== k均值聚类算法结束 ==========");return map;}

getDataSetByHdfs方法

这个方法我与上面的方法放在一个类中,所以sparkSession没重复写

/*** 从hdfs中取数据** @param dataFilePath 数据路径* @return 数据集合*/private Dataset<Row> getDataSetByHdfs(String dataFilePath) {//屏蔽日志Logger.getLogger("org.apache.spark").setLevel(Level.WARN);Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF);Dataset<Row> dataset;try {//我这里的数据是libsvm格式的 如果是其他格式请自行更改dataset = sparkSession.read().format("libsvm").load(dataFilePath);log.info("获取数据结束 ");} catch (Exception e) {log.info("读取失败:{} ", e.getMessage());}return dataset;}

toList

/*** dataset数据转化为list数据** @param record 数据* @return 数据集合*/private List<Map<String, String>> toList(Dataset<Row> record) {log.info("格式化结果数据集===============================");List<Map<String, String>> list = new ArrayList<>();String[] columns = record.columns();List<Row> rows = record.collectAsList();for (Row row : rows) {Map<String, String> obj = new HashMap<>(16);for (int j = 0; j < columns.length; j++) {String col = columns[j];Object rowAs = row.getAs(col);String val = "";//如果是数组 //这一段不需要的可以只留下else的内容if (rowAs instanceof DenseVector) {if (((DenseVector) rowAs).values() instanceof double[]) {val = ArrayUtil.join(Arrays.stream(((DenseVector) rowAs).values()).map(rowVal -> NumberUtil.roundDown(rowVal, 3).doubleValue()).toArray(), ",");} else {val = rowAs.toString();}} else {val = rowAs.toString();}obj.put(col, val);log.info("列:{},名:{},值:{}", j, col, val);}list.add(obj);}return list;}

java spark k-means算法相关推荐

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

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

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

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

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

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

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

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

  5. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  6. K means 图片压缩

    k-means的基本原理较为清晰,这里不多赘述,本次博客主要通过基础的k means算法进行图像的压缩处理. 原理分析 在彩色图像中,每个像素的大小为3字节(RGB),可以表示的颜色总数为256 * ...

  7. spark Bisecting k-means(二分K均值算法)

    Bisecting k-means(二分K均值算法) 二分k均值(bisecting k-means)是一种层次聚类方法,算法的主要思想是:首先将所有点作为一个簇,然后将该簇一分为二.之后选择能最大程 ...

  8. java培训:Java的十大算法

    想要学好java语言,就要打好基础,java要学习的东西有很多,今天小编就来和大家说下java的十大算法. 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个 ...

  9. 一文搞懂K近邻算法(KNN),附带多个实现案例

    简介:本文作者为 CSDN 博客作者董安勇,江苏泰州人,现就读于昆明理工大学电子与通信工程专业硕士,目前主要学习机器学习,深度学习以及大数据,主要使用python.Java编程语言.平时喜欢看书,打篮 ...

最新文章

  1. nginx 添加自定义头部信息
  2. python3.6.5安装教程-Centos7安装python3.6.5
  3. 【数字信号处理】线性常系数差分方程 ( 卷积 与 “ 线性常系数差分方程 “ | 使用 matlab 求解 “ 线性常系数差分方程 “ )
  4. Linux查找文件命令find .
  5. hutool 取前12个月_Excel – 创建 12 个月的工资表模板,我只要 20 秒
  6. Bailian2723 不吉利日期(POJ NOI0113-02)【日期计算】
  7. 【PAT乙】1002 写出这个数 (20分)
  8. Access数据库的查询
  9. JAVA实训心得体会(精选4篇)
  10. datetime处理日期时间
  11. 如何将多个Execl表格中的数据汇总到一个表中?
  12. 推荐一个开源电子白板,教学专用。
  13. 数据库的几种重要作用
  14. 职称计算机word模块,职称计算机考试WORD模块考试共四套
  15. [已迁移]数据结构-霍夫曼编码
  16. 工商银行顾欣:分布式全链路灰度发布的探索与实践
  17. 慕课java工程师2020版_2020智慧树慕课Java 程序设计答案最新最全课后作业答案
  18. 2017 码云最火爆开源项目 TOP 50,你都用过哪些 – 坏~牧羊人 – 博客园
  19. 【Python】元组与集合
  20. 真正的RISC-V开发板——VEGA织女星开发板开箱评测

热门文章

  1. 最新ThinkPHP福娃源码交易网站源码+功能很强大
  2. 电子计算机在电法勘探中的应用,期末作业—测控技术与仪器专业论文模板.doc...
  3. 矩阵论笔记(四)——酉空间与酉变换
  4. android 换 苹果,第一次从安卓手机换到苹果,会有哪些特别不适应的地方?
  5. linux mint安装金山快盘
  6. Java300基础超适合零基础童鞋学习
  7. Share Buttons
  8. Java基础语法(九)——String类
  9. 使用html5+javascript+css实现单机版五子棋---跟电脑打没赢过
  10. 有源淹没分析arcgis_洪涝有源淹没算法及淹没结果分析