Java 打印简单K表示簇内实例的数量(计数)或百分比

Java 打印简单K表示簇内实例的数量(计数)或百分比,java,weka,k-means,Java,Weka,K Means,尝试以计数或百分比的形式获取每个集群中的实例数。我已经为一个简单的K-Means-WEKA循环的结果编写了一个集群成员资格 System.out.println("\n\nCluster membership:"); for (int i = 0; i < m_instances.numInstances(); i++) { try { int id = (int) m_instances.instance(i).index(i);

尝试以计数或百分比的形式获取每个集群中的实例数。我已经为一个简单的K-Means-WEKA循环的结果编写了一个集群成员资格

System.out.println("\n\nCluster membership:");
    for (int i = 0; i < m_instances.numInstances(); i++) { 
        try {
            int id = (int) m_instances.instance(i).index(i);
            temp.append("\nCluster " + clusterInstance(m_instances.instance(i)) + " contains Instance: " + id);

            } catch (Exception e) {
                e.printStackTrace();
                } 
    }
。。。等等

有没有一种方法可以像上面我的代码那样使用for循环来获取每个集群内的实例数,以输出类似这样的内容,例如

Cluster 0 contains 5 Instances (71%)
Cluster 1 contains 2 Instances (28%)

您可以使用映射跟踪每个群集的实例数量,然后计算每个群集的百分比:

Map<Integer, Integer> map = new HashMap<>();
int amountOfInstances = m_instances.numInstances();
for (int i = 0; i < amountOfInstances; i++) {
  try {
    // A merge to either add a new cluster with count=1,
    // or increase the count by 1 for an already existing cluster in the map
    map.merge(clusterInstance(m_instances.instance(i)), 1, Integer::sum);
  } catch (Exception e) {
    e.printStackTrace();
  }
}

for(Map.Entry<Integer, Integer> keyValuePair : map.entrySet()){
  int cluster = keyValuePair.getKey();
  int count = keyValuePair.getValue();
  int percentage = (int)(100d / amountOfInstances * count);
  System.out.println("Cluster " + cluster + " contains " + count + " Instances (" + percentage + "%)");
}

您的百分比不正确。7人中有5人约占71%,7人中有2人约占28%。您的67/33百分比是6分之4,而不是6分之2。@KevinCruijssen我知道我的百分比。为了最小化这个问题,我只包含了一些聚类结果。但是,我会根据您的百分比编辑问题中的百分比。非常感谢您的帮助:)
Map<Integer, Integer> map = new HashMap<>();
int amountOfInstances = m_instances.numInstances();
for (int i = 0; i < amountOfInstances; i++) {
  try {
    // A merge to either add a new cluster with count=1,
    // or increase the count by 1 for an already existing cluster in the map
    map.merge(clusterInstance(m_instances.instance(i)), 1, Integer::sum);
  } catch (Exception e) {
    e.printStackTrace();
  }
}

for(Map.Entry<Integer, Integer> keyValuePair : map.entrySet()){
  int cluster = keyValuePair.getKey();
  int count = keyValuePair.getValue();
  int percentage = (int)(100d / amountOfInstances * count);
  System.out.println("Cluster " + cluster + " contains " + count + " Instances (" + percentage + "%)");
}
Cluster 0 contains 5 Instances (71%)
Cluster 1 contains 2 Instances (28%)