我找了一些资料 发现 聚类的运用 一般有三种: 数值聚类(例如成绩聚类) 文本的聚类 坐标点的聚类
数值聚类:
数值聚类是比较简单的 因为它们能直接求均值而不用做其他的一些处理
步骤是:
一: 随机产生是三个不重复的数值 作为 质心
二:计算每一个数值到质心的距离 公式 : Math.Sqrt((x-质心)*(x-质心)) 数值减去质心平方后开方
三:把数值归入到距离最小的 质心所代表的类中
四:计算每个类的均值作为质心,跟旧的质心做对比,如果不相等,则从步骤二开始 迭代。 直到质心值不再变化,这样类就分好了。
下面记录几段比较重要的代码;
1.生成不重复的随机数值
/// <summary>
/// get different random
/// </summary>
/// <param name="arrNum"></param>
/// <param name="tmp"></param>
/// <param name="minValue"></param>
/// <param name="maxValue"></param>
/// <param name="ra"></param>
/// <returns></returns>
public int[] getNum(int count, int total)
{
int[] index = new int[total];
for (int i = 0; i < total; i++)
{
index[i] = i;
}
Random r = new Random();
//用来保存随机生成的不重复的count个数
int[] result = new int[count];
//int site = total;//设置下限
int id;
for (int j = 0; j < count; j++)
{
id = r.Next(0, total - 1);
//在随机位置取出一个数,保存到结果数组
result[j] = index[id];
//最后一个数复制到当前位置
index[id] = index[total - 1];
//位置的下限减少一
total--;
}
return result;
}
判断新旧质心是否相等
/// <summary>
/// judge the value of center
/// </summary>
/// <param name="center"></param>
/// <param name="newcenter"></param>
/// <param name="ok"></param>
/// <returns></returns>
private static bool judge(double[] center, double[] newcenter, bool ok)
{
int count = 0;
for (int i = 0; i < newcenter.Length; i++)
{
if (center[i] == newcenter[i])
{ count++; }
}
if (count == newcenter.Length)
{
ok = true;
}
return ok;
} |