当前位置: 首页 > news >正文

Java使用apache.commons.math3的DBSCAN实现自动聚类

K-Means: 如果你能大致估计出类别的数量,K-Means通常也是一个高效的选择。但它对异常值敏感,且要求簇是球状的。对于一些不知道数据可能会有多少类别的时候,可用试试DBSCAN算法,因为你通常无法预先知道文章会自动分成多少类(K值未知),用DBSCAN是非常不错的,能自动判断拿出类别数量,这里讲解一下java的math3里面自带方法

示例

package com.data;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;import org.apache.commons.math3.ml.clustering.Cluster;
import org.apache.commons.math3.ml.clustering.DBSCANClusterer;
import org.apache.commons.math3.ml.clustering.DoublePoint;public class TestDBSCAN {public static void main(String[] args) {List<DoublePoint> rawPoints = new ArrayList<>();rawPoints.add(new DoublePoint(new double[] { 0.1, 0.2, 0.3 }));rawPoints.add(new DoublePoint(new double[] { 0.2, 0.14, 0.22 }));// 此处故意设置两个比较大点的值,和小点的值rawPoints.add(new DoublePoint(new double[] { 0.3, 0.4, 0.43 }));rawPoints.add(new DoublePoint(new double[] { 0.88, 0.8, 0.8 }));rawPoints.add(new DoublePoint(new double[] { 0.02, 0.112, 0.08 }));// 多少距离内归纳为同一个簇(两个向量之间的距离)double eps = 0.24;// 需要几个点形成簇int minPts = 0;// 执行聚类DBSCANClusterer<DoublePoint> clusterer = new DBSCANClusterer<>(eps, minPts);List<Cluster<DoublePoint>> clusters = clusterer.cluster(rawPoints);System.out.println("==== 聚类结果 ====");System.out.println("发现簇数量: " + clusters.size());// 打印每个簇for (int i = 0; i < clusters.size(); i++) {System.out.println("\n簇 #" + (i + 1) + ":");for (DoublePoint p : clusters.get(i).getPoints()) {System.out.println("  " + Arrays.toString(p.getPoint()));}}}}

打印结果,很明显的自动区分了3个类别

==== 聚类结果 ====
发现簇数量: 3簇 #1:[0.1, 0.2, 0.3][0.2, 0.14, 0.22][0.02, 0.112, 0.08]簇 #2:[0.3, 0.4, 0.43]簇 #3:[0.88, 0.8, 0.8]
// 多少距离内归纳为同一个簇(两个向量之间的距离)
double eps = 0.24;// 需要几个点形成簇
int minPts = 0;关键在于这两个参数,eps,比如设置成1,所有的都是同一类,也就只有一个簇,
当minPts设置为1的时候,这里不会出现簇23,因为小于等于1不认为是一个簇(分类),
所以具体根据数据调整参数即可

文本分类如何应用

既然上面讲述了算法,文本无非就是提取向量,扔进去计算,一般文本向量分为两种,词频向量(TF),语义向量(bert,word2vec,大模型经常用到的那种),只要拿到向量扔进去就能自动归类,这样知道其中某一段文本的类别,其他自然都知道了,应用完全能根据自己需求实现,思路大致都是一样的

http://www.dtcms.com/a/356386.html

相关文章:

  • 【Docker/Redis】服务端高并发分布式结构演进之路
  • 构建免费的音视频转文字工具:支持多语言的语音识别项目
  • OpenTenBase实战:从MySQL迁移到分布式HTAP的那些坑与收获
  • mysql双机热备(主主模式)
  • 桌面GIS软件添加第三方图层
  • 【web3】十分钟了解web3是什么?
  • Java 将HTML文件、HTML字符串转换为图片
  • 交叉编译 手动安装 libzip 库 移植ARM 需要 zlib的
  • R ggplot2学习Nature子刊一张图,换数据即可用!
  • [机器学习]基于K-means聚类算法的鸢尾花数据及分类
  • 把 AI 塞进「智能跳绳」——基于 MEMS 传感器的零样本卡路里估算器
  • 机器学习回顾——线性回归
  • GitHub 宕机自救指南:打造韧性开发体系
  • 基于站点、模式、遥感多源降水数据融合与评估;Python驱动下,从基础处理、机器学习建模到气候态产品生成的全流程解析
  • Consul 操作命令汇总 - Prometheus服务注册
  • 选华为实验工具:eNSP Pro 和社区在线实验哪个更适合?
  • 腾讯位置商业授权微信小程序距离计算
  • OpenAI GPT-realtime 实时语音 API 完整指南:2025年语音AI的革命性突破
  • STM32的RTC模块及其应用场景
  • MTK Linux DRM分析(二十三)- MTK mtk_drm_crtc.c(Part2)
  • 嵌入式Linux驱动开发 - GPIO LED驱动
  • 税务岗位能力提升培训课程推荐
  • 嵌入式Linux驱动开发:定时器驱动
  • 解析DB-GPT项目中三个 get_all_model_instances 方法的区别
  • 【WebRTC】从入门到忘记
  • 解密 Vue 3 shallowRef:浅层响应式 vs 深度响应式的性能对决
  • 园区智慧水电管理系统:让能源管理从“成本黑洞”变“利润引擎”
  • 【GM3568JHF】FPGA+ARM异构开发板 使用指南:以太网
  • nginx 怎么将 https 请求转为 http
  • AR巡检系统:数字化传统工作流程SOP的第一步