k-中心点法的聚类数据挖掘算法的C#实现
using System;using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Data.Odbc;
class ClusterGenerator : IDataWorker
{
#region IDataWorker Members
public void work()
{
throw new Exception("The method or operation is not implemented.");
}
#endregion
private int k = 10;
public int K
{
get { return k; }
set { k = value; }
}
private ArrayList centerList = new ArrayList();
private ArrayList pointClusterList = new ArrayList();
private ArrayList cluster = new ArrayList();
private bool isChanged = false;
private int minCenter = 0;
private double minPower = 0;
private double tempPower = 1;
private double sumPower = 0;
private double randPower = 0;
private int oRandom = 0;
private void genCluster(ArrayList alldata)
{
centerList.Clear();
//初始化clusterList
Random random = new Random();
for (int i = 0; i < k; i++)
{
centerList.Add(random.Next(alldata.Count));
pointClusterList.Add(new ArrayList());
}
do
{
isChanged = false;
/////////////////////////////指派每个剩余的对象给离它最近的中心点所代表的簇
for (int i = 0; i < alldata.Count; i++)
{
for (int j = 0; j < centerList.Count; j++)
{
tempPower = PowerUtil.countPower(alldata, alldata[(int)centerList]);
if (tempPower < minPower)
{
minCenter = j;
minPower = tempPower;
}
}
cluster = (ArrayList)(pointClusterList);
cluster.Add(i);
}
///////////////////////////////////////////////////
////////////////////针对每个簇提出一个随机的非中心点对象
//for (int i = 0; i < pointClusterList; i++) {
// cluster = (ArrayList)pointClusterList;
// oRandom = random.Next(alldata.Count);
// for (int j = 0; j < cluster; j++) {
// sumPower += PowerUtil.countPower(alldata((int)(cluster)), alldata[(int)centerList]);
// randPower += PowerUtil.countPower(alldata((int)(cluster)), alldata(oRandom));
// }
// if (randPower < sumPower)
// {
// centerList = oRandom;
// isChanged = true;
// }
//}
/////////////////////////
for (int i = 0; i < pointClusterList; i++)
{
oRandom = random.Next(alldata.Count);
if (PowerUtil.countEM(alldata, centerList, pointClusterList, oRandom, i))
{
centerList = oRandom;
isChanged = true;
break;//?
}
}
///////////////////////////
/////////////////////////////////
} while (!isChanged);
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
class PowerUtil
{
public static double countPower(ArrayList a,ArrayList b) {
double powerA=1.0;
double powerB=1.0;
double power=0;
int lengthA = a.Count;
int lengthB = b.Count;
for(int i=0;i<a.Count;i++){
for(int j=0;j<b.Count;j++){
if (((string)a).Equals((string)b) && !((string)a).Equals(""))
{
powerA = powerA - 1 / lengthA;
}
else {
if(((string)a).Equals("")){
lengthA--;
}
}
}
}
for(int i=0;i<b.Count;i++){
for(int j=0;j<a.Count;j++){
if (((string)b).Equals((string)a) && !((string)a).Equals(""))
{
powerB = powerB - 1 / lengthB;
}
else {
if (((string)b).Equals(""))
{
lengthB--;
}
}
}
}
return (powerA + powerB) / 2;
}
public static bool countEM(ArrayList alldata, ArrayList centerList, ArrayList pointClusterList,int oRandom,int position)
{
int minCenter = 0;
double minPower = 0;
double tempPower = 1;
double sumPower = 0;
double randPower = 0;
ArrayList cluster = new ArrayList();
ArrayList newCenterList = centerList.Clone();
newCenterList = oRandom;
ArrayList newPointClusterList = new ArrayList();
for (int i = 0; i < pointClusterList.Count; i++)
{
newPointClusterList.Add(new ArrayList());
}
for (int i = 0; i < alldata.Count; i++)
{
for (int j = 0; j < centerList.Count; j++)
{
tempPower = PowerUtil.countPower(alldata, alldata[(int)newCenterList]);
if (tempPower < minPower)
{
minCenter = j;
minPower = tempPower;
}
}
cluster = (ArrayList)(newPointClusterList);
cluster.Add(i);
}
//////////////////////////////
//开始算EM
for (int i = 0; i < pointClusterList; i++)
{
cluster = (ArrayList)pointClusterList;
for (int j = 0; j < cluster; j++)
{
sumPower += PowerUtil.countPower(alldata((int)(cluster)), alldata[(int)centerList]);
}
}
for (int i = 0; i < pointClusterList; i++)
{
cluster = (ArrayList)newPointClusterList;
for (int j = 0; j < cluster; j++)
{
randPower += PowerUtil.countPower(alldata((int)(cluster)), alldata[(int)newCenterList]);
}
}
double s=randPower-sumPower;
if (s < 0)
{
return true;
}
else
{
return false;
}
}
}
页:
[1]