m_NumClusters);//聚类中心
int[] clusterAssignments = new int [instances.numInstances()];
for (int i = 0; i < instances.numInstances(); i++) {
updateMinMax(instances.instance(i));//更新最大最小值
}
Random RandomO = new Random(getSeed());//随机数
int instIndex;
HashMap initC = new HashMap();
DecisionTableHashKey hk = null;
for (int j = instances.numInstances() - 1; j >= 0; j--) {
instIndex = RandomO.nextInt(j+1);
hk = new
DecisionTableHashKey(instances.instance(instIndex),
instances.numAttributes(), true);
if (!initC.containsKey(hk)) {
m_ClusterCentroids.add(instances.instance(instIndex));
initC.put(hk, null);
}
instances.swap(j, instIndex);
if (m_ClusterCentroids.numInstances() == m_NumClusters)
{
break;
}
}
m_NumClusters = m_ClusterCentroids.numInstances();//聚类个数=
聚类中心个数
D = new Matrix(solveD(instances).getArray());//求聚类中心到每个
实例的距离
int i, j;
int n = instances.numInstances();
Instances [] tempI = new Instances[m_NumClusters];
m_squaredErrors = new double [m_NumClusters];
m_ClusterNominalCounts = new int
[m_NumClusters][instances.numAttributes()][0];
Matrix U = new Matrix(solveU(instances).getArray());//初始化隶
属矩阵U
double q = 0;//初始化价值函数值
while (true) {
m_Iterations++;
for (i = 0; i < instances.numInstances(); i++) {
Instance toCluster = instances.instance(i);
int newC = clusterProcessedInstance(toCluster, true);
clusterAssignments[i] = newC;
}
m_ClusterCentroids = new Instances(instances, m_NumClusters);
for (i = 0; i < m_NumClusters; i++) {
tempI[i] = new Instances(instances, 0);
}
for (i = 0; i < instances.numInstances(); i++) {
tempI[clusterAssignments[i]].add(instances.instance(i));
}
for (i = 0; i < m_NumClusters; i++) {
double[] vals = new
double[instances.numAttributes()];
for (j = 0; j < instances.numAttributes(); j++) {
double sum1 = 0, sum2 = 0;
for (int k = 0; k < n; k++) {
sum1 += U.get(i, k) * U.get(i, k) *