Java K-均值算法

Java K-均值算法,java,algorithm,machine-learning,grouping,unsupervised-learning,Java,Algorithm,Machine Learning,Grouping,Unsupervised Learning,我正试图用Java编写一个k-means算法。我计算了许多数组,每个数组都包含一些系数。我需要使用k-means算法来对所有这些数据进行分组。你知道这个算法的任何实现吗 谢谢在中有一个非常好的K-means集群Python实现。我极力推荐 我意识到您必须转换为Java,但这看起来并不太难。我自己没有研究过代码,但中给出的多线程K-means实现看起来很有启发性。分类、集群和分组是IR的成熟领域。有一个非常好的(Java)库/软件(开源),叫做WEKA。这里有几种聚类算法。虽然有一个学习曲线,但当

我正试图用Java编写一个k-means算法。我计算了许多数组,每个数组都包含一些系数。我需要使用k-means算法来对所有这些数据进行分组。你知道这个算法的任何实现吗


谢谢

在中有一个非常好的K-means集群Python实现。我极力推荐


我意识到您必须转换为Java,但这看起来并不太难。

我自己没有研究过代码,但中给出的多线程K-means实现看起来很有启发性。

分类、集群和分组是IR的成熟领域。有一个非常好的(Java)库/软件(开源),叫做WEKA。这里有几种聚类算法。虽然有一个学习曲线,但当你遇到更难的问题时,它可能会很有用

似乎每个发帖子的人都忘了提到事实上的图像处理库:OpenCV。您必须围绕C OpenCV代码编写一个JNI包装器才能让KMeans工作,但额外的好处是

  • 您会知道KMeans算法经过了大量优化
  • OpenCV广泛使用GPU,因此运行速度非常快
    主要的缺点是您必须编写一个JNI包装器。我曾经需要一个模板匹配例程,并面临许多备选方案,但我发现OpenCV是迄今为止最好的,尽管我被迫为它编写了一个JNI包装器。

    OpenCV是我使用过的最糟糕的库之一。 另一方面,Matlab做得非常巧妙

    如果你必须自己编写代码,这个算法就其效率而言非常简单

  • 拾取簇数(k)
  • 做k点(它们将成为质心)
  • 随机化所有这些点的位置
  • 计算从每个点到所有质心的欧几里德距离
  • 将每个点的“成员资格”指定给最近的质心
  • 通过平均属于给定簇的所有点的位置来建立新的质心
  • 转到4,直到实现收敛,或者所做的更改无关紧要

  • 实际上,KMeans是一个非常简单的算法。有什么好的理由不自己动手编码吗?我在Qt中完成了这项工作,然后将代码移植到普通的STL中,没有太多问题

    我开始喜欢Joel的想法:没有外部依赖,所以请随意告诉我一个你无法控制的大型软件有什么好处,这个问题上的其他人已经提到它不是一个好的软件/

    Talk很便宜,真正的男人向世界展示他们的代码:


    我应该清理一下代码,使其更通用,并且当前版本没有移植到STL,但这只是一个开始

    这是一个很老的问题,但我注意到并没有提到哪个有它的实现,包括它的用法

    该项目不是很活跃,但最新版本相对较新(2012年7月)

    //目标:实现Kmeans聚类算法。
    //节目
    导入java.util.*;
    k_类的意思是
    {
    静态整数count1、count2、count3;
    静态int d[];
    静态int k[][];
    静态int tempk[]];
    静态双m[];
    静态双差[];
    静态int n,p;
    static int cal_diff(int a)//此方法将确定元素在特定步骤中所处的集群。
    {
    int temp1=0;
    for(int i=0;im[i])
    diff[i]=a-m[i];
    其他的
    diff[i]=m[i]-a;
    }
    int-val=0;
    双温=diff[0];
    
    对于(inti=0;i+1-很好的发现),“PCI”仍然是推荐的,因为它除了K-means之外还有很多很棒的东西。将OpenCV用于KMeans可能有些过分,但我不知道OpenCV是如何“糟糕”编写的。它可能不像matlab那么容易使用(matlab是一种专用的、速度慢的、使用matlab中已有的大量算法来测试算法的简单方法)但是它肯定比matlab快很多,这仅仅是因为它是用C编写的。如果你没有正确地用C编写matlab,那么它的速度会很慢。如果你在matlab中编写了一个“for”循环,那么你就错了。嗨,elcuco,我自己编写了它,但我想交叉检查初始化部分。我想看看其他实现是如何分配初始CLU的我也认为使用一个你无法控制的代码不是一个好主意。我会继续挖掘,谢谢大家!谢谢。我一直在寻找一个我(老)的实用伴侣机器学习教科书已经有一段时间了。我不会将这个包用于集群。Java ML中的k-means实现速度慢得离谱。目前,OpenCV正式支持Java。因此,不需要手工编写JNI。
    //Aim:To implement Kmeans clustering algorithm.
    //Program
    import java.util.*;
    class k_means
    {
    static int count1,count2,count3;
    static int d[];
    static int k[][];
    static int tempk[][];
    static double m[];
    static double diff[];
    static int n,p;
    
    static int cal_diff(int a) // This method will determine the cluster in which an element go at a particular step.
    {
    int temp1=0;
    for(int i=0;i<p;++i)
    {
    if(a>m[i])
    diff[i]=a-m[i];
    else
    diff[i]=m[i]-a;
    }
    int val=0;
    double temp=diff[0];
    for(int i=0;i<p;++i)
    {
    if(diff[i]<temp)
    {
    temp=diff[i];
    val=i;
    }
    }//end of for loop
    return val;
    }
    
    static void cal_mean() // This method will determine intermediate mean values
    {
    for(int i=0;i<p;++i)
    m[i]=0; // initializing means to 0
    int cnt=0;
    for(int i=0;i<p;++i)
    {
    cnt=0;
    for(int j=0;j<n-1;++j)
    {
    if(k[i][j]!=-1)
    {
    m[i]+=k[i][j];
    ++cnt;
    }}
    m[i]=m[i]/cnt;
    }
    }
    
    static int check1() // This checks if previous k ie. tempk and current k are same.Used as terminating case.
    {
    for(int i=0;i<p;++i)
    for(int j=0;j<n;++j)
    if(tempk[i][j]!=k[i][j])
    {
    return 0;
    }
    return 1;
    }
    
    public static void main(String args[])
    {
    Scanner scr=new Scanner(System.in);
    /* Accepting number of elements */
    System.out.println("Enter the number of elements ");
    n=scr.nextInt();
    d=new int[n];
    /* Accepting elements */
    System.out.println("Enter "+n+" elements: ");
    for(int i=0;i<n;++i)
    d[i]=scr.nextInt();
    /* Accepting num of clusters */
    System.out.println("Enter the number of clusters: ");
    p=scr.nextInt();
    /* Initialising arrays */
    k=new int[p][n];
    tempk=new int[p][n];
    m=new double[p];
    diff=new double[p];
    /* Initializing m */
    for(int i=0;i<p;++i)
    m[i]=d[i];
    
    int temp=0;
    int flag=0;
    do
    {
    for(int i=0;i<p;++i)
    for(int j=0;j<n;++j)
    {
    k[i][j]=-1;
    }
    for(int i=0;i<n;++i) // for loop will cal cal_diff(int) for every element.
    {
    temp=cal_diff(d[i]);
    if(temp==0)
    k[temp][count1++]=d[i];
    else
    if(temp==1)
    k[temp][count2++]=d[i];
    else
    if(temp==2)
    k[temp][count3++]=d[i]; 
    }
    cal_mean(); // call to method which will calculate mean at this step.
    flag=check1(); // check if terminating condition is satisfied.
    if(flag!=1)
    /*Take backup of k in tempk so that you can check for equivalence in next step*/
    for(int i=0;i<p;++i)
    for(int j=0;j<n;++j)
    tempk[i][j]=k[i][j];
    
    System.out.println("\n\nAt this step");
    System.out.println("\nValue of clusters");
    for(int i=0;i<p;++i)
    {
    System.out.print("K"+(i+1)+"{ ");
    for(int j=0;k[i][j]!=-1 && j<n-1;++j)
    System.out.print(k[i][j]+" ");
    System.out.println("}");
    }//end of for loop
    System.out.println("\nValue of m ");
    for(int i=0;i<p;++i)
    System.out.print("m"+(i+1)+"="+m[i]+"  ");
    
    count1=0;count2=0;count3=0;
    }
    while(flag==0);
    
    System.out.println("\n\n\nThe Final Clusters By Kmeans are as follows: ");
    for(int i=0;i<p;++i)
    {
    System.out.print("K"+(i+1)+"{ ");
    for(int j=0;k[i][j]!=-1 && j<n-1;++j)
    System.out.print(k[i][j]+" ");
    System.out.println("}");
    }
    }
    }
    /*
    Enter the number of elements
    8
    Enter 8 elements:
    2 3 6 8 12 15 18 22
    Enter the number of clusters:
    3
    
    At this step
    Value of clusters
    K1{ 2 }
    K2{ 3 }
    K3{ 6 8 12 15 18 22 }
    Value of m
    m1=2.0  m2=3.0  m3=13.5
    
    At this step
    Value of clusters
    K1{ 2 }
    K2{ 3 6 8 }
    K3{ 12 15 18 22 }
    Value of m
    m1=2.0  m2=5.666666666666667  m3=16.75
    
    At this step
    Value of clusters
    K1{ 2 3 }
    K2{ 6 8 }
    K3{ 12 15 18 22 }
    Value of m
    m1=2.5  m2=7.0  m3=16.75
    
    At this step
    Value of clusters
    K1{ 2 3 }
    K2{ 6 8 }
    K3{ 12 15 18 22 }
    Value of m
    m1=2.5  m2=7.0  m3=16.75
    
    The Final Clusters By Kmeans are as follows:
    K1{ 2 3 }
    K2{ 6 8 }
    K3{ 12 15 18 22 } */