`
hermitte
  • 浏览: 30314 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

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[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;
            }

       
        }
    }
分享到:
评论

相关推荐

    利用C#语言开发K-Means聚类算法

    在这个项目中,我们将深入探讨如何利用C#语言来实现K-Means聚类算法。 首先,K-Means算法的基本思想是通过迭代寻找最优的K个聚类中心,使得每个数据点到其所属簇中心的距离最小。这个过程包括两个主要步骤:初始化...

    K-Means聚类算法C#实现

    1. **K-Means算法原理**:K-Means的目标是将n个数据点划分为k个不同的簇(类别),每个数据点被分配到与其最近的质心(中心点)所属的簇。算法包括两个主要步骤:初始化质心和迭代调整。 2. **初始化质心**:通常,...

    C#实现简单的K-means聚类算法

    通过上述代码片段可以看出,C# 实现的 K-means 聚类算法主要包括初始化、分配数据点到最近的簇、更新簇中心以及判断是否收敛等几个关键步骤。这种算法广泛应用于数据挖掘、图像处理等领域,具有较高的实用价值。理解...

    C#实现k均值聚类算法(调试通过)

    总结,C#实现的K均值聚类算法提供了强大的数据分组能力,尤其在处理大量文本数据时。通过理解和实现这个算法,开发者可以提升在数据分析和机器学习项目中的技能,为企业决策提供有价值的信息。在提供的压缩包中,...

    数据挖掘算法,K-means聚类算法源代码,用于聚类分析-Matlab.zip

    数据挖掘是一种从海量数据中提取有价值信息的过程,而K-means聚类算法是其中一种广泛应用的无监督学习方法。在本资源中,我们关注的是如何使用Matlab实现K-means算法进行聚类分析。 K-means算法的核心思想是将数据...

    聚类算法DBSCAN和KMeans的C#实现

    本项目重点介绍了两种常见的聚类算法:DBSCAN(Density-Based Spatial Clustering of Applications with Noise)和KMeans,并提供了C#语言的实现,包括一个图形用户界面(GUI)以直观展示聚类结果。 **DBSCAN(密度...

    经典聚类算法——K-Means算法实现(C#,适用于初学者)

    在"经典聚类算法——K-Means算法实现(C#,适用于初学者)"中,提供的C#源码应该是一个控制台应用程序,它通过读取数据、执行上述步骤并输出结果来展示K-Means算法的工作原理。初学者可以通过这个程序理解K-Means...

    K-means聚类算法源代码

    K-means聚类算法是一种广泛应用的数据挖掘方法,用于无监督学习中的分类问题。它通过将数据集中的对象分配到预定义数量的类别中,使得同一类内的对象相似度尽可能高,而不同类之间的对象相似度尽可能低。在这个场景...

    k-means_kmeans案例_k-means聚类算法_k-means实战_K._

    综上所述,k-means聚类算法是一种强大的数据分析工具,尤其对于初学者,通过实例学习能够更好地理解其工作原理和应用场景。在实战中,我们需要关注数据的预处理、k值选择以及算法的优化,以确保获得有价值的聚类结果...

    k-means算法C#实现

    k-means算法是一种广泛应用的无监督机器学习方法,主要用于数据聚类。它的核心思想是将数据...通过实际编写和调试代码,你可以进一步巩固对这个经典聚类算法的理解,并将其应用到.NET环境下的数据挖掘和分析任务中。

    k-means算法的C#代码

    k-means算法是一种广泛应用的数据挖掘聚类方法,用于将数据集分成不同的群组或类别,使得同一群组内的数据相似度高,而不同群组间的数据相似度低。在这个场景中,我们关注的是一个实现了k-means算法的C#源代码。C#是...

    ap聚类算法 c#实现

    责任表示一个数据点作为其他数据点聚类中心的可能性,可及性表示一个数据点成为其他数据点聚类中心的可能性。 2. **信息传递**:在每一轮迭代中,更新所有数据点的责任和可及性。这一步通常涉及矩阵运算,因为数据...

    C# 实现 k means 均值 聚类

    在C#中实现K-Means算法,首先需要准备数据结构,包括数据点的二维数组和聚类中心的列表。以下是一些关键步骤: 1. **数据准备**:将输入数据存储为二维数组,每一行代表一个数据点,每一列代表一个特征。 2. **初始...

    聚类算法对同一个二维坐标数据集进行聚类分析

    接着,K-Means是最为流行的聚类算法之一,它通过迭代优化过程寻找簇中心,使得簇内点的平方误差和最小。K-Means算法的弱点在于对初始簇中心的选择敏感,这可能导致不同的聚类结果。在kmeans.py文件中,可以看到...

    K-Means算法C#

    K-Means算法是一种广泛应用的无监督...理解以上知识点后,你便能根据需求在C#中实现K-Means算法,对数据进行有效的聚类分析。记得在实际项目中,根据数据特性和业务需求调整K值和距离度量方式,以获取最佳的聚类效果。

    用C#实现k均值聚类算法.docx

    k 均值聚类算法是模式识别的聚分类问题,该算法的主要思想是将数据集分为 k 个簇,每个簇的中心点称为簇心。该算法的主要步骤是:首先,随机选择 k 个初始聚类中心,然后计算每个数据点到 k 个聚类中心的距离,将每...

    算法总结 聚类 遗传算法等的实现

    本资料集主要探讨了聚类算法和遗传算法的实现,这两种算法在C#、ASP.NET以及SQLDBA等领域有着广泛应用。让我们深入探讨这些重要算法的原理和实践。 聚类算法是一种无监督学习方法,主要用于将数据集中的对象根据其...

    k-mean算法源代码C#版

    1. 初始化:选择k个初始质心(中心点),通常是随机选取数据集中的k个点。 2. 分配:计算数据点与所有质心的距离,将每个数据点分配到最近的质心所在的簇。 3. 更新:重新计算每个簇内所有数据点的平均值,作为新的...

    聚类算法:K-means聚类图像分割

    K-Means聚类是最常用的聚类算法,最初起源于信号处理,其目标是将数据点划分为K个类簇,找到每个簇的中心并使其度量最小化。该算法的最大优点是简单、便于理解,运算速度较快,缺点是只能应用于连续型数据,并且要在...

    基于K中心点数据挖掘课程设计论文(原创)

    这篇论文探讨了如何实现基于K中心点的聚类算法,并提供了C#编程语言的实现细节。 算法描述如下: 1. **初始化阶段**:首先,从数据集中随机选择k个对象作为初始的中心点。这k个对象将代表k个不同的簇。 2. **分配...

Global site tag (gtag.js) - Google Analytics