代码如下:
package com.winning.dm.pathway;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import com.winning.dm.test.util.StringUtils;
public class NewKmeans {
// 存储聚类之后的数据
public ArrayList<ArrayList<String>> groupby;
// 存储中心
public ArrayList<String> alcenter;
// 迭代后的中心
public ArrayList<String> alnewcenter;
// 计算几个类的轮廓系数
public ArrayList<Double> adoutline;
private static Logger logger = Logger.getLogger(NewKmeans.class);
/**
*
* @作者: liusen
* @时间: 2017-1-6 下午4:35:55
* @描述: 计算数据的汉明距离
* @param x
* 字符串x
* @param y
* 字符串y
* @return
* @备注:
*/
public int distance(String x, String y) {
int distance;
if (x.length() != y.length()) {
distance = -1;
} else {
distance = 0;
for (int i = 0; i < x.length(); i++) {
if (x.charAt(i) != y.charAt(i)) {
distance++;
}
}
}
return distance;
}
/**
*
* @作者: liusen
* @时间: 2017-1-6 下午4:43:43
* @描述: 聚类中心的迭代方法
* @param list
* @return
* @备注:
*/
public String centerIteration(ArrayList<String> list) {
int size = list.size();
int[] array = new int[size];
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
array[i] = array[i] + distance(list.get(i), list.get(j));
}
}
return list.get(findMinIndex(array));
}
/**
*
* @作者: liusen
* @时间: 2017-1-6 下午5:04:49
* @描述: 找到数组中的最小值对应的下标
* @param array
* 数组
* @return 下标
* @备注:
*/
public int findMinIndex(int[] array) {
int index = 0;
int size = array.length;
int min = array[0];
for (int i = 0; i < size; i++) {
if (min > array[i]) {
min = array[i];
index = i;
}
}
return index;
}
/**
*
* @作者: liusen
* @时间: 2017-1-11 上午11:13:00
* @描述: 计算最小值的下标
* @param array
* 目标数组
* @return 下标
* @备注:
*/
public int findMinIndex(ArrayList<Double> array) {
int index = 0;
int size = array.size();