我正在尝试用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;
}
答案 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;数组。)