使用DeepLearning4J进行K-Means聚类

本文通过一个具体的示例展示了如何使用 KMeans 算法进行数据聚类。包括了初始化 KMeans 对象、生成随机数据点并将其转换为点对象、执行聚类过程以及对特定点进行分类。此外,还提供了如何设置随机种子以确保实验结果的一致性和可重复性的方法。
官网示例路径https://github.com/deeplearning4j/deeplearning4j/blob/bca1df607f6e58ae73baa8e684130bfa7ad8c2e3/deeplearning4j-nearestneighbors-parent/nearestneighbor-core/src/test/java/org/deeplearning4j/clustering/kmeans/KMeansTest.java

代码

    @Test
    public void testKMeans() {
        //设置一个底层生成数值,后面的方法产生的数相等
        //如Nd4j.randn(5, 5),产生5行5列的矩阵,不管运行多少次该test用例,均生成相等的5行5列矩阵
        Nd4j.getRandom().setSeed(7);
        //声明一个KMeans聚类对象,参数分别是 最终聚类的类别数量,迭代次数,距离函数  距离函数的取值为(sum,max,min,norm1,norm2,prod,std,var,euclidean,cosine,cosinesimilarity,manhattan,mmul,tensorMmul)具体可参照org.nd4j.linalg.api.ops.factory.DefaultOpFactory
        KMeansClustering kMeansClustering = KMeansClustering.setup(5, 5, "euclidean");
        //张量矩阵生成KMeans的点对象
        List<Point> points = Point.toPoints(Nd4j.randn(5, 5));
        ClusterSet clusterSet = kMeansClustering.applyTo(points);
        //将第一个点对象带入进行分类,可得到对象pointClassification,该对象getCenter得到该点所属的类别
        PointClassification pointClassification = clusterSet.classifyPoint(points.get(0)); //可以使用classifyPoint(points.get(0),false)使center中心店不进行更新移动
        System.out.println(pointClassification);
    }
使用 Deeplearning4j 进行向量生成时,通常涉及到嵌入(embedding)的概念。这种技术可以将离散的数据(如文本中的单词、图像的类别等)映射到连续的向量空间中,从而便于神经网络模型进行处理。 Deeplearning4j 提供了多种方法来生成向量,其中一种常见的方式是利用 Word2Vec 模型对文本数据进行训练并生成词向量。以下是一个基于 Deeplearning4j 的 Word2Vec 示例代码片段: ```java import org.deeplearning4j.models.word2vec.Word2Vec; import org.deeplearning4j.text.sentenceiterator.BasicLineIterator; import org.deeplearning4j.text.sentenceiterator.SentenceIterator; import org.deeplearning4j.text.tokenization.tokenizer.preprocessor.CommonPreprocessor; import org.deeplearning4j.text.tokenization.tokenizerfactory.DefaultTokenizerFactory; import org.deeplearning4j.text.tokenization.tokenizerfactory.TokenizerFactory; import java.util.List; public class Word2VecExample { public static void main(String[] args) { // 加载文本语料 String filePath = "path/to/your/text/file.txt"; SentenceIterator iter = new BasicLineIterator(filePath); // 预处理和分词配置 TokenizerFactory tokenizerFactory = new DefaultTokenizerFactory(); tokenizerFactory.setTokenPreProcessor(new CommonPreprocessor()); // 构建 Word2Vec 模型 Word2Vec vec = new Word2Vec.Builder() .minWordFrequency(5) .iterations(5) .layerSize(100) // 向量维度 .seed(42) .windowSize(5) .iterate(iter) .tokenizerFactory(tokenizerFactory) .build(); // 训练模型 vec.fit(); // 获取某个词的向量表示 String word = "example"; if (vec.hasWord(word)) { List<Double> vector = vec.getWordVector(word); System.out.println("Vector for '" + word + "': " + vector); } else { System.out.println("Word '" + word + "' not found in the vocabulary."); } } } ``` ### 说明: - **SentenceIterator**:用于迭代读取输入文件中的每一行。 - **TokenizerFactory**:负责将句子拆分为词语,并对它们进行预处理(如小写化)。 - **Word2Vec.Builder**:通过配置参数构建 Word2Vec 模型,包括向量维度 (`layerSize`)、窗口大小 (`windowSize`) 和最小词频 (`minWordFrequency`) 等。 - **vec.fit()**:启动训练过程。 - **vec.getWordVector(word)**:获取指定单词的向量表示。 此外,如果目标不是文本而是其他类型的数据(例如图像),则可以通过卷积神经网络(CNN)或全连接层(Fully Connected Layers)提取特征向量[^4]。这些向量能够捕捉数据的高层抽象信息,并可作为后续任务(如分类或聚类)的输入。 ### 可选方法: 1. 利用 `SameDiff` API 实现自定义模型以生成特定领域的向量。 2. 使用预训练模型(如 ResNet、VGG)结合特征提取技术生成图像向量。 3. 在自然语言处理之外的场景中,也可以应用类似的思想(如 Node2Vec 处理图结构数据)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值