k-中心点法的聚类数据挖掘算法的C#实现

本文介绍了一种基于随机选择中心点的聚类算法实现。该算法通过不断迭代,将数据集中的对象分配给最近的中心点所代表的簇,并通过评估随机非中心点来优化簇中心,以提高聚类效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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[i], alldata[(int)centerList[j]]);
                    if (tempPower < minPower)
                    {
                        minCenter = j;
                        minPower = tempPower;
                    }
                }
                cluster = (ArrayList)(pointClusterList[minCenter]);
                cluster.Add(i);

            }
            ///////////////////////////////////////////////////
            ////////////////////针对每个簇提出一个随机的非中心点对象
            //for (int i = 0; i < pointClusterList; i++) {
            //    cluster = (ArrayList)pointClusterList[i];
            //    oRandom = random.Next(alldata.Count);
            //    for (int j = 0; j < cluster; j++) {
 
            //        sumPower += PowerUtil.countPower(alldata((int)(cluster[j])), alldata[(int)centerList[i]]);
            //        randPower += PowerUtil.countPower(alldata((int)(cluster[j])), alldata(oRandom));
            //    }
            //    if (randPower < sumPower)
            //    {
            //        centerList[i] = oRandom;
            //        isChanged = true;
            //    }
 
            //}
            /////////////////////////
            for (int i = 0; i < pointClusterList; i++)
            {

                oRandom = random.Next(alldata.Count);
                if (PowerUtil.countEM(alldata, centerList, pointClusterList, oRandom, i))
                {
                    centerList[i] = 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                for(int j=0;j
                   if (((string)a[i]).Equals((string)b[i]) && !((string)a[i]).Equals(""))
                   {
                       powerA = powerA - 1 / lengthA;
                   }
                   else {
                   if(((string)a[i]).Equals("")){
                       lengthA--;
                 
                   }
                   }
              
               }
           
            }
             for(int i=0;i                for(int j=0;j
                   if (((string)b[i]).Equals((string)a[i]) && !((string)a[i]).Equals(""))
                   {
                       powerB = powerB - 1 / lengthB;
                   }
                   else {
                       if (((string)b[i]).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[position] = 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[i], alldata[(int)newCenterList[j]]);
                    if (tempPower < minPower)
                    {
                        minCenter = j;
                        minPower = tempPower;
                    }
                }
                cluster = (ArrayList)(newPointClusterList[minCenter]);
                cluster.Add(i);

            }
 
 
            //////////////////////////////
            //开始算EM
            for (int i = 0; i < pointClusterList; i++)
            {
                cluster = (ArrayList)pointClusterList[i];
              
                for (int j = 0; j < cluster; j++)
                {
 
                    sumPower += PowerUtil.countPower(alldata((int)(cluster[j])), alldata[(int)centerList[i]]);
                  
                }
             

            }
            for (int i = 0; i < pointClusterList; i++)
            {
                cluster = (ArrayList)newPointClusterList[i];
 
                for (int j = 0; j < cluster; j++)
                {
 
                    randPower += PowerUtil.countPower(alldata((int)(cluster[j])), alldata[(int)newCenterList[i]]);

                }
 

            }
            double s=randPower-sumPower;
            if (s < 0)
            {
                return true;
            }
            else
            {
                return false;
            }

       
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值