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聚类算法。 首先,K-Means算法的基本思想是通过迭代寻找最优的K个聚类中心,使得每个数据点到其所属簇中心的距离最小。这个过程包括两个主要步骤:初始化...
1. **K-Means算法原理**:K-Means的目标是将n个数据点划分为k个不同的簇(类别),每个数据点被分配到与其最近的质心(中心点)所属的簇。算法包括两个主要步骤:初始化质心和迭代调整。 2. **初始化质心**:通常,...
通过上述代码片段可以看出,C# 实现的 K-means 聚类算法主要包括初始化、分配数据点到最近的簇、更新簇中心以及判断是否收敛等几个关键步骤。这种算法广泛应用于数据挖掘、图像处理等领域,具有较高的实用价值。理解...
总结,C#实现的K均值聚类算法提供了强大的数据分组能力,尤其在处理大量文本数据时。通过理解和实现这个算法,开发者可以提升在数据分析和机器学习项目中的技能,为企业决策提供有价值的信息。在提供的压缩包中,...
数据挖掘是一种从海量数据中提取有价值信息的过程,而K-means聚类算法是其中一种广泛应用的无监督学习方法。在本资源中,我们关注的是如何使用Matlab实现K-means算法进行聚类分析。 K-means算法的核心思想是将数据...
本项目重点介绍了两种常见的聚类算法:DBSCAN(Density-Based Spatial Clustering of Applications with Noise)和KMeans,并提供了C#语言的实现,包括一个图形用户界面(GUI)以直观展示聚类结果。 **DBSCAN(密度...
在"经典聚类算法——K-Means算法实现(C#,适用于初学者)"中,提供的C#源码应该是一个控制台应用程序,它通过读取数据、执行上述步骤并输出结果来展示K-Means算法的工作原理。初学者可以通过这个程序理解K-Means...
K-means聚类算法是一种广泛应用的数据挖掘方法,用于无监督学习中的分类问题。它通过将数据集中的对象分配到预定义数量的类别中,使得同一类内的对象相似度尽可能高,而不同类之间的对象相似度尽可能低。在这个场景...
综上所述,k-means聚类算法是一种强大的数据分析工具,尤其对于初学者,通过实例学习能够更好地理解其工作原理和应用场景。在实战中,我们需要关注数据的预处理、k值选择以及算法的优化,以确保获得有价值的聚类结果...
k-means算法是一种广泛应用的无监督机器学习方法,主要用于数据聚类。它的核心思想是将数据...通过实际编写和调试代码,你可以进一步巩固对这个经典聚类算法的理解,并将其应用到.NET环境下的数据挖掘和分析任务中。
k-means算法是一种广泛应用的数据挖掘聚类方法,用于将数据集分成不同的群组或类别,使得同一群组内的数据相似度高,而不同群组间的数据相似度低。在这个场景中,我们关注的是一个实现了k-means算法的C#源代码。C#是...
责任表示一个数据点作为其他数据点聚类中心的可能性,可及性表示一个数据点成为其他数据点聚类中心的可能性。 2. **信息传递**:在每一轮迭代中,更新所有数据点的责任和可及性。这一步通常涉及矩阵运算,因为数据...
在C#中实现K-Means算法,首先需要准备数据结构,包括数据点的二维数组和聚类中心的列表。以下是一些关键步骤: 1. **数据准备**:将输入数据存储为二维数组,每一行代表一个数据点,每一列代表一个特征。 2. **初始...
接着,K-Means是最为流行的聚类算法之一,它通过迭代优化过程寻找簇中心,使得簇内点的平方误差和最小。K-Means算法的弱点在于对初始簇中心的选择敏感,这可能导致不同的聚类结果。在kmeans.py文件中,可以看到...
K-Means算法是一种广泛应用的无监督...理解以上知识点后,你便能根据需求在C#中实现K-Means算法,对数据进行有效的聚类分析。记得在实际项目中,根据数据特性和业务需求调整K值和距离度量方式,以获取最佳的聚类效果。
k 均值聚类算法是模式识别的聚分类问题,该算法的主要思想是将数据集分为 k 个簇,每个簇的中心点称为簇心。该算法的主要步骤是:首先,随机选择 k 个初始聚类中心,然后计算每个数据点到 k 个聚类中心的距离,将每...
本资料集主要探讨了聚类算法和遗传算法的实现,这两种算法在C#、ASP.NET以及SQLDBA等领域有着广泛应用。让我们深入探讨这些重要算法的原理和实践。 聚类算法是一种无监督学习方法,主要用于将数据集中的对象根据其...
1. 初始化:选择k个初始质心(中心点),通常是随机选取数据集中的k个点。 2. 分配:计算数据点与所有质心的距离,将每个数据点分配到最近的质心所在的簇。 3. 更新:重新计算每个簇内所有数据点的平均值,作为新的...
K-Means聚类是最常用的聚类算法,最初起源于信号处理,其目标是将数据点划分为K个类簇,找到每个簇的中心并使其度量最小化。该算法的最大优点是简单、便于理解,运算速度较快,缺点是只能应用于连续型数据,并且要在...
这篇论文探讨了如何实现基于K中心点的聚类算法,并提供了C#编程语言的实现细节。 算法描述如下: 1. **初始化阶段**:首先,从数据集中随机选择k个对象作为初始的中心点。这k个对象将代表k个不同的簇。 2. **分配...