Java 实现多维多类型数据的距离函数

Java 实现多维多类型数据的距离函数,java,twitter,cluster-analysis,elki,Java,Twitter,Cluster Analysis,Elki,我在java中使用ELKI在kmeans算法中对tweet的文本进行聚类。在聚类之前,我用tf-idf度量值计算推特文本的相似性,tf-idf度量值用于聚类 public void clustering(String file) throws FileNotFoundException { //Distance.calSim("after sorting.txt"); similarity = MainElki.getSimilarity(); PrintWriter

我在java中使用ELKI在kmeans算法中对tweet的文本进行聚类。在聚类之前,我用tf-idf度量值计算推特文本的相似性,tf-idf度量值用于聚类

 public void clustering(String file) throws FileNotFoundException {
    //Distance.calSim("after sorting.txt");
    similarity = MainElki.getSimilarity();
    PrintWriter writer = new PrintWriter(new File(file));
    StringBuilder strBuilder = new StringBuilder();

    for (int k = 0; k < numCorpus; k = k + 20) {
        double[][] subArray = new double[20][20];
        subArray = getSubArray(k, k);

        DatabaseConnection dbc = new ArrayAdapterDatabaseConnection(subArray);
        Database db = new StaticArrayDatabase(dbc, null);
        db.initialize();
        SquaredEuclideanDistanceFunction dist = SquaredEuclideanDistanceFunction.STATIC;
        RandomlyGeneratedInitialMeans init = new RandomlyGeneratedInitialMeans(RandomFactory.DEFAULT);

        KMeansLloyd<NumberVector> km = new KMeansLloyd<>(dist, 3, 0, init);
        Clustering<KMeansModel> c = km.run(db);

        Relation<NumberVector> rel = db.getRelation(TypeUtil.NUMBER_VECTOR_FIELD);
        DBIDRange ids = (DBIDRange) rel.getDBIDs();
        strBuilder.append("\n******** subArray[" + k + "]" + "[" + k + "]");
        int i = 2;
        for (Cluster<KMeansModel> clu : c.getAllClusters()) {
            // K-means will name all clusters "Cluster" in lack of noise support:
            strBuilder.append("\n    #" + i + ": " + clu.getNameAutomatic() + "\n");
            strBuilder.append("    Size: " + clu.size() + "\n");
            strBuilder.append("    Center: " + clu.getModel().getPrototype().toString() + "\n");

            strBuilder.append("  Objects: ");
            for (DBIDIter it = clu.getIDs().iter(); it.valid(); it.advance()) {
                // To get the vector use:
                NumberVector v = rel.get(it);

                // Offset within our DBID range: "line number"
                final int offset = ids.getOffset(it);
                strBuilder.append(" " + (offset + k));
                // Do NOT rely on using "internalGetIndex()" directly!
            }
            i++;
        }
    }//end of for subArray
    writer.write(strBuilder.toString());
    writer.close();
}//end of clustering function

是否有任何方法可以编写自定义的距离函数来计算tweet文本的距离,然后使用其他功能(如相似数)来计算最终距离?

KMeans,顾名思义,需要计算平均值

此算法只能用于R^d中的向量


因此,无论如何,如果你真的想这样做(kmeans在不同比例的属性上工作不好!),你必须将所有属性转换成数字。或者使用不同的算法。

KMeans,顾名思义,需要计算平均值

此算法只能用于R^d中的向量


因此,无论如何,如果你真的想这样做(kmeans在不同比例的属性上工作不好!),你必须将所有属性转换成数字。或者使用不同的算法。

K-means只能在
NumberVector
s上工作,没有办法解决这个问题

对于许多其他算法,这是可能的。您需要:

  • 使用多种数据类型实现新的数据类型
    YourDataType
  • 实现一个解析器来加载数据
  • 执行
    距离功能
  • 但正如Anony Mousse的回答所指出的,k-means只能支持
    NumberVector
    。它将不接受
    您的数据类型
    。因为它不能计算这个数据的平均值


    我想在埃尔基得到支持,但我自己没有这个必要;对于这样的数据,我看不到任何好的距离函数(有Goor的;但是它不是我认为的“好”-有用的,它将需要大量的手动缩放、加权以及对每个数据集的这种修改),并且不清楚如何优化这种场景的实现。因此,我的优先级太低,无法自己实现,但我很欣赏精心设计的pull请求。

    K-means只能在
    NumberVector
    s上工作,这是无法避免的

    对于许多其他算法,这是可能的。您需要:

  • 使用多种数据类型实现新的数据类型
    YourDataType
  • 实现一个解析器来加载数据
  • 执行
    距离功能
  • 但正如Anony Mousse的回答所指出的,k-means只能支持
    NumberVector
    。它将不接受
    您的数据类型
    。因为它不能计算这个数据的平均值


    我想在埃尔基得到支持,但我自己没有这个必要;对于这样的数据,我看不到任何好的距离函数(有Goor的;但是它不是我认为的“好”-有用的,它将需要大量的手动缩放、加权以及对每个数据集的这种修改),并且不清楚如何优化这种场景的实现。因此,我的优先级列表太低,无法自行实现,但我很欣赏精心设计的pull请求。

    您有任何例子可以在支持多类型属性的elki中使用它吗?没有,我只使用数字数据。我试图研究“多类型”数据的统计原因,但它似乎非常薄弱。因此,似乎没有一种“合理”的处理方法,只有“黑魔法”,结果并不比随机好。由于我的研究,我需要测试使用其他功能是否可以改善结果。似乎使用tweets的所有功能都有助于对tweets进行聚类。我不认为你能以任何有用的方式将tweet聚集在一起。但是如果你想使用k-means,你必须满足它的研发要求。当你需要实数来计算均值时,别指望我能让k-means神奇地在字符上工作……不,我不需要使用kmeans。我想从在我的数据集中有更好的聚类或主题检测算法的库开始。你们有任何例子,我可以在elki中使用它,支持多类型属性吗?不,我只使用数字数据。我试图研究“多类型”数据的统计原因,但它似乎非常薄弱。因此,似乎没有一种“合理”的处理方法,只有“黑魔法”,结果并不比随机好。由于我的研究,我需要测试使用其他功能是否可以改善结果。似乎使用tweets的所有功能都有助于对tweets进行聚类。我不认为你能以任何有用的方式将tweet聚集在一起。但是如果你想使用k-means,你必须满足它的研发要求。当你需要实数来计算均值时,别指望我能让k-means神奇地在字符上工作……不,我不需要使用kmeans。我想从我的数据集中有更好的聚类或主题检测算法的库开始。谢谢你们的指导。你是建议我实现一个新的数据类型并使用ELKI的其他算法还是我编写我的算法?即使你编写自己的算法,你也必须首先实现一个数据类型来管理数据。所以我会先这样做,然后尝试一些现有的算法,如果有必要的话,最后添加你自己的算法。谢谢你的指导。你是建议我实现一个新的数据类型并使用ELKI的其他算法还是我编写我的算法?即使你编写自己的算法,你也必须首先实现一个数据类型来管理数据。所以我会先这样做,然后尝试一些现有的算法,如果需要的话,最终添加您自己的算法。
     public class CustomizedDistance extends AbstractNumberVectorDistanceFunction    {
     @Override
    public double distance(NumberVector arg0, NumberVector arg1) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    
    }