kmeans聚类算法中的MultiDimensional ArrayList

时间:2014-04-23 17:21:05

标签: java eclipse arraylist multidimensional-array k-means

我正在尝试用Java中的某个音乐推荐系统实现kmeans算法 我已经生成了2个数组playsFinal[](数据集中所有用户的艺术家的总播放次数)和artFinal[](整个数据集中的唯一艺术家)。每个artFinal[i]的游戏次数为playsFinal[i]。对于k,我选择了kclusters=Math.sqrt(playsFinal.length)/2
我有一个数组clusters[kclusters][playsFinal.length],每个clusters[i][0]的第一个位置0<i<kclusters都填充了一定的值,这基本上是kmeans算法中的初始均值。

int j = 0;
for (int i = 0; i < n && j < kclusters; i += kclusters) {
    clusters[j][0] = weighty[j];//initial means
    System.out.println(clusters[j][0]);
    j++;
}  

在此,weight[]是给予每位艺术家的特定分数 现在,在以下函数中,我将返回索引,即应添加plays[i]的集群。

public static int smallestdistance(double a, double[][] clusters) {
    a = (double) a;
    double smallest = 0;
    double d[] = new double[kclusters];
    for (int i = 0; i < kclusters; i++) {
        d[i] = a - clusters[i][0];

    }
    int index = -1;
    double d1 = Double.POSITIVE_INFINITY;
    for (int i = 0; i < d.length; i++)
        if (d[i] < d1) {
            d1 = d[i];
            index = i;
        }
    return index;
}

如果不明显,我发现playsFinal[i]与每个clusters[j][0]中的初始元素之间的最小距离和最小的那个,我返回其索引(kfound)。现在在clusters[kfound][]的索引处我想添加playsFinal[i],但这里是我被卡住的地方。我不能像在ArrayList中那样使用.add()函数。我想使用ArrayList会更好。我已经浏览了关于ArrayList的大部分文章,但没有找到任何可以帮助我的内容。
如何使用多维ArrayList实现这一点? 提前致谢。 我的代码汇总如下:

int j = 0;
for (int i = 0; i < n && j < kclusters; i += kclusters) {
    clusters[j][0] = weighty[j];//initial means
    System.out.println(clusters[j][0]);
    j++;
}


    double[] weighty = new double[artFinal.length];
    for (int i = 0; i < artFinal.length; i++) {
        weighty[i] = (playsFinal[i] * 10000 / playsFinal.length);

    }
    n = playsFinal.length;

    kclusters = (int) (Math.sqrt(n) / 2);
    double[][] clusters = new double[kclusters][playsFinal.length];

    int j = 0;
    for (int i = 0; i < n && j < kclusters; i += kclusters) {
        clusters[j][0] = weighty[j];//initial means
        System.out.println(clusters[j][0]);
        j++;
    }

    int kfound;

    for (int i = 0; i < playsFinal.length; i++) {
        kfound = smallestdistance(playsFinal[i], clusters);
        //HERE IS WHERE I AM STUCK. I want to add playsFinal[i] to the corresponding clusters[kfound][]

    }

}


public static int smallestdistance(double a, double[][] clusters) {
    a = (double) a;
    double smallest = 0;
    double d[] = new double[kclusters];
    for (int i = 0; i < kclusters; i++) {
        d[i] = a - clusters[i][0];

    }
    int index = -1;
    double d1 = Double.POSITIVE_INFINITY;
    for (int i = 0; i < d.length; i++)
        if (d[i] < d1) {
            d1 = d[i];
            index = i;
        }
    return index;
}

1 个答案:

答案 0 :(得分:0)

Java&#34;多维数组&#34;实际上只是数组,其元素本身(引用)数组。 ArrayList等价物是创建一个包含其他列表的列表:

List<List<Foo>> l = new ArrayList<>(); //create outer ArrayList
for (int i = 0; i < 10; i++) //create 10 inner ArrayLists
    l.add(new ArrayList<Foo>());
l.get(5).add(foo1); //add an element to the sixth inner list
l.get(5).set(0, foo2); //set that element to a different value

与数组不同,列表是空的(如任何列表),而不是指定数量的插槽;如果要将它们视为多维数组的插入式替换,则必须手动填充它们。这意味着您的内部列表可以具有不同的长度。 (实际上你可以通过仅指定外部维度(int[][] x = new int[10][];)获得&#34;参差不齐的多维数组,然后手动初始化插槽(for (int i = 0; i < x.length; ++i) x[i] = new int[i];以获得&#34;三角形&#34;数组),但多维数组创建的特殊语法强烈倾向于使大多数程序员只考虑&#34;矩形&#34;数组。)