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

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

示例

java 复制代码
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个类别

java 复制代码
==== 聚类结果 ====
发现簇数量: 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]
java 复制代码
// 多少距离内归纳为同一个簇(两个向量之间的距离)
double eps = 0.24;

// 需要几个点形成簇
int minPts = 0;

关键在于这两个参数,eps,比如设置成1,所有的都是同一类,也就只有一个簇,
当minPts设置为1的时候,这里不会出现簇2 簇3,因为小于等于1不认为是一个簇(分类),
所以具体根据数据调整参数即可

文本分类如何应用

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

相关推荐
80530单词突击赢1 分钟前
云原生时代:.NET与Java的K8s进化论
java
Faker66363aaa1 分钟前
鲶鱼目标检测与识别:基于fovea_r50_fpn_gn-head-align模型的COCO数据集训练_1
人工智能·目标检测·计算机视觉
【赫兹威客】浩哥3 分钟前
交通违章识别数据集与YOLO系列模型训练成果
人工智能·深度学习·机器学习
hhy_smile3 分钟前
Special method in class
java·开发语言
B站计算机毕业设计超人3 分钟前
计算机毕业设计hadoop+spark+hive在线教育可视化 课程推荐系统 大数据毕业设计(源码+LW文档+PPT+讲解)
大数据·人工智能·hive·hadoop·scrapy·spark·课程设计
B站计算机毕业设计超人4 分钟前
计算机毕业设计PySpark+Hive+Django小红书评论情感分析 小红书笔记可视化 小红书舆情分析预测系统 大数据毕业设计(源码+LW+PPT+讲解)
大数据·人工智能·hive·爬虫·python·spark·课程设计
我命由我123457 分钟前
Android 开发 Room 数据库升级问题:A migration from 6 to 7 was required but not found.
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
roamingcode7 分钟前
我是如何 Vibe Coding,将 AI CLI 工具从 Node.js 迁移到 Rust 并成功发布的
人工智能·rust·node.js·github·claude·github copilot
黄筱筱筱筱筱筱筱9 分钟前
7.适合新手小白学习Python的异常处理(Exception)
java·前端·数据库·python
下午写HelloWorld10 分钟前
生成对抗网络GAN的简要理解
人工智能·神经网络·生成对抗网络