使用K-Means 算法进行聚类分析程序

编程对以下数据(150 个样本)使用K-Means 算法进行聚类分析。
(4.8,3.1,1.6,0.2),
(5.4,3.4,1.5,0.4),
(5.2,4.1,1.5,0.1),
(5.5,4.2,1.4,0.2),
(4.9,3.1,1.5,0.2),
(5.0,3.2,1.2,0.2),
(5.5,3.5,1.3,0.2),
(4.9,3.6,1.4,0.1),
(4.4,3.0,1.3,0.2),
(5.1,3.4,1.5,0.2),
(5.0,3.5,1.3,0.3),
(4.5,2.3,1.3,0.3),
(4.4,3.2,1.3,0.2),
(5.0,3.5,1.6,0.6),
(5.1,3.8,1.9,0.4),
(4.8,3.0,1.4,0.3),
(5.1,3.8,1.6,0.2),
(4.6,3.2,1.4,0.2),
(5.3,3.7,1.5,0.2),
(5.0,3.3,1.4,0.2),
(7.0,3.2,4.7,1.4),
(6.4,3.2,4.5,1.5),
(6.9,3.1,4.9,1.5),
(5.5,2.3,4.0,1.3),
(6.5,2.8,4.6,1.5),
(5.7,2.8,4.5,1.3),
(6.3,3.3,4.7,1.6),
(4.9,2.4,3.3,1.0),
(6.6,2.9,4.6,1.3),
(5.2,2.7,3.9,1.4),
(5.0,2.0,3.5,1.0),
(5.9,3.0,4.2,1.5),
(6.0,2.2,4.0,1.0),
(6.1,2.9,4.7,1.4),
(5.6,2.9,3.9,1.3),
(6.7,3.1,4.4,1.4),
(5.6,3.0,4.5,1.5),
(5.8,2.7,4.1,1.0),
(6.2,2.2,4.5,1.5),
(5.6,2.5,3.9,1.1),
(5.9,3.2,4.8,1.8),
(6.1,2.8,4.0,1.3),
(6.3,2.5,4.9,1.5),
(6.1,2.8,4.7,1.2),
(6.4,2.9,4.3,1.3),
(6.6,3.0,4.4,1.4),
(6.8,2.8,4.8,1.4),
(6.7,3.0,5.0,1.7),
(6.0,2.9,4.5,1.5),
(5.7,2.6,3.5,1.0),
(5.5,2.4,3.8,1.1),
(5.5,2.4,3.7,1.0),
(5.8,2.7,3.9,1.2),
(6.0,2.7,5.1,1.6),
(5.4,3.0,4.5,1.5),
(6.0,3.4,4.5,1.6),
(6.7,3.1,4.7,1.5),
(6.3,2.3,4.4,1.3),
(5.6,3.0,4.1,1.3),
(5.5,2.5,5.0,1.3),
(5.5,2.6,4.4,1.2),
(6.1,3.0,4.6,1.4),
(5.8,2.6,4.0,1.2),
(5.0,2.3,3.3,1.0),
(5.6,2.7,4.2,1.3),
(5.7,3.0,4.2,1.2),
(5.7,2.9,4.2,1.3),
(6.2,2.9,4.3,1.3),
(5.1,2.5,3.0,1.1),
(5.7,2.8,4.1,1.3),
(6.3,3.3,6.0,2.5),
(5.8,2.7,5.1,1.9),
(7.1,3.0,5.9,2.1),
(6.3,2.9,5.6,1.8),
(6.5,3.0,5.8,2.2),
(7.6,3.0,6.6,2.1),
(4.9,2.5,4.5,1.7),
(7.3,2.9,6.3,1.8),
(6.7,2.5,5.8,1.8),
(7.2,3.6,6.1,2.5),
(6.5,3.2,5.1,2.0),
(6.4,2.7,5.3,1.9),
(6.8,3.0,5.5,2.1),
(5.7,2.5,5.0,2.0),
(5.8,2.8,5.1,2.4),
(6.4,3.2,5.3,2.3),
(6.5,3.0,5.5,1.8),
(7.7,3.8,6.7,2.2),
(7.7,2.6,6.9,2.3),
(6.0,2.2,5.0,1.5),
(6.9,3.2,5.7,2.3),
(5.6,2.8,4.9,2.0),
(7.7,2.8,6.7,2.0),
(6.3,2.7,4.9,1.8),
(6.7,3.3,5.7,2.1),
(7.2,3.2,6.0,1.8),
(6.2,2.8,4.8,1.8),
(6.1,3.0,4.9,1.8),
(6.4,2.8,5.6,2.1),
(7.2,3.0,5.8,1.6),
(7.4,2.8,6.1,1.9),
(7.9,3.8,6.4,2.0),
(6.4,2.8,5.6,2.2),
(6.3,2.8,5.1,1.5),
(6.1,2.6,5.6,1.4),
(7.7,3.0,6.1,2.3),
(6.3,3.4,5.6,2.4),
(6.4,3.1,5.5,1.8),
(6.0,3.0,4.8,1.8),
(6.9,3.1,5.4,2.1),
(6.7,3.1,5.6,2.4),
(6.9,3.1,5.1,2.3),
(5.8,2.7,5.1,1.9),
(6.8,3.2,5.9,2.3),
(6.7,3.3,5.7,2.5),
(6.7,3.0,5.2,2.3),
(6.3,2.5,5.0,1.9),
(6.5,3.0,5.2,2.0),
(6.2,3.4,5.4,2.3),
(5.9,3.0,5.1,1.8)

你这是四维数据,我这是一维数据kmeans,你试试吧

#include<iostream>
#include<math.h>
#include<stdlib.h>
#include<stdio.h>
using namespace std;

int N; //数据个数
int K; //集合个数

int *CenterIndex; //质心索引集合,即属于第几个参考点
double *Center; //质心集合
double *CenterCopy;
double *DataSet;
double **Cluster;
int *Top;

/*算法描述:
C-Fuzzy均值聚类算法采用的是给定类的个数K,将N个元素(对象)分配到K个类中去使得类内对象之间的相似性最大,而类之间的相似性最小 */

//函数声明部分
void InitData();
void InitCenter();
void CreateRandomArray(int n,int k,int *centerIndex);
void CopyCenter();
void UpdateCluster();
void UpdateCenter();
int GetIndex(double value,double *centerIndex);
void AddtoCluster(int index,double value);
void print();
bool IsEqual(double *center,double *centercopy);

int main()
{
int Flag=1;
InitData();
while(Flag)//无限次循环
{
UpdateCluster();
UpdateCenter();
if(IsEqual(Center,CenterCopy))
{
Flag=0;
}
else
{
CopyCenter();
}
}
print();
getchar();
system("pause");
}

void InitData()
{
int i=0;
int a;
cout<<"请输入数据元素的个数: ";
cin>>N;
cout<<"请输入分类数: ";
cin>>K;
if(K>N)
{
return;
}

CenterIndex =new int [sizeof(int)];
Center =new double [sizeof(double)*K];
CenterCopy =new double [sizeof(double)*K];
DataSet =new double [sizeof(double)*N];
Cluster =new double* [sizeof(double*)*K];
Top =new int [sizeof(int)*K];

//初始化K个类的集合
for(i=0;i<K;i++)
{
Cluster[i]=new double [sizeof(double)*N];
Top[i]=0;
}

cout<<"请输入数据"<<endl;
for(i=0;i<N;i++)
{
cin>>a;
DataSet[i]=a;
}

//初始化质心集合
InitCenter();
UpdateCluster();
}

void InitCenter()//初始化中心点(参照点)
{
int i=0;
//产生随即的K个<N的不同的序列
CreateRandomArray(N,K,CenterIndex);
for(i=0;i<K;i++)
{
Center[i]=DataSet[CenterIndex[i]];
}
CopyCenter();

}

void CreateRandomArray(int n,int k,int *centerIndex)//产生可以随输出控制的 k与n (可舍弃)
{
int i=0,j=0;
for(i=0;i<K;i++)
{
int a=rand()%n;
for(j=0;j<i;j++)
{
if(centerIndex[j]==a)
break;
}

if(j>=i)
{
centerIndex[i]=a;
}
else
{
i--;
}
}
}

void CopyCenter()//将旧的中心点保留以作比较
{
int i=0;
for(i=0;i<K;i++)
{
CenterCopy[i]=Center[i];
}
}

void UpdateCluster()//
{
int i=0;
int tindex;

for(;i<K;i++)
{
Top[i]=0;
}

for(i=0;i<N;i++)
{
tindex=GetIndex(DataSet[i],Center);
AddtoCluster(tindex,DataSet[i]);
}
}

int GetIndex(double value,double *center)//判断属于哪个参照点
{
int i=0;
int index=i;
double min=fabs(value-center[i]);
for(i=0;i<K;i++)
{
if(fabs(value-center[i])<min)
{
index=i;
min=fabs(value-center[i]);
}
}

return index;
}

void AddtoCluster(int index,double value)//统计每组个数(用于均值法求新的参照点)
{
Cluster[index][Top[index]]=value;
Top[index]++;
}

void UpdateCenter()//更新参照点
{
int i=0,j=0;
double sum;
for(i=0;i<K;i++)
{
sum=0.0;
for(j=0;j<Top[i];j++)
{
sum+=Cluster[i][j];
}

if(Top[i]>0)
{
Center[i]=sum/Top[i];
}
}
}

bool IsEqual(double *center,double*centercopy)//
{
int i;
for(i=0;i<K;i++)
{
if(fabs(center[i]!=centercopy[i]))
return 0;
}
return 1;
}

void print()//
{
int i,j;
cout<<"===================================="<<endl;
for(i=0;i<K;i++)
{
cout<<"第"<<i<<"组:质心为:"<<Center[i]<<endl;
cout<<"数据元素为:\n";
for(j=0;j<Top[i];j++)
{
cout<<Cluster[i][j]<<'\t';
}
cout<<endl;
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-12-24
高维求距离呗。自己定义一个距离的概念,一般都用和2维一样的2-norm.
第2个回答  2019-06-04
你这是四维数据,我这是一维数据kmeans,你试试吧
#include<iostream>
#include<math.h>
#include<stdlib.h>
#include<stdio.h>
using
namespace
std;
int
N;
//数据个数
int
K;
//集合个数
int
*CenterIndex;
//质心索引集合,即属于第几个参考点
double
*Center;
//质心集合
double
*CenterCopy;
double
*DataSet;
double
**Cluster;
int
*Top;
/*算法描述:
C-Fuzzy均值聚类算法采用的是给定类的个数K,将N个元素(对象)分配到K个类中去使得类内对象之间的相似性最大,而类之间的相似性最小
*/
//函数声明部分
void
InitData();
void
InitCenter();
void
CreateRandomArray(int
n,int
k,int
*centerIndex);
void
CopyCenter();
void
UpdateCluster();
void
UpdateCenter();
int
GetIndex(double
value,double
*centerIndex);
void
AddtoCluster(int
index,double
value);
void
print();
bool
IsEqual(double
*center,double
*centercopy);
int
main()
{
int
Flag=1;
InitData();
while(Flag)//无限次循环
{
UpdateCluster();
UpdateCenter();
if(IsEqual(Center,CenterCopy))
{
Flag=0;
}
else
{
CopyCenter();
}
}
print();
getchar();
system("pause");
}
void
InitData()
{
int
i=0;
int
a;
cout<<"请输入数据元素的个数:
";
cin>>N;
cout<<"请输入分类数:
";
cin>>K;
if(K>N)
{
return;
}
CenterIndex
=new
int
[sizeof(int)];
Center
=new
double
[sizeof(double)*K];
CenterCopy
=new
double
[sizeof(double)*K];
DataSet
=new
double
[sizeof(double)*N];
Cluster
=new
double*
[sizeof(double*)*K];
Top
=new
int
[sizeof(int)*K];
//初始化K个类的集合
for(i=0;i<K;i++)
{
Cluster[i]=new
double
[sizeof(double)*N];
Top[i]=0;
}
cout<<"请输入数据"<<endl;
for(i=0;i<N;i++)
{
cin>>a;
DataSet[i]=a;
}
//初始化质心集合
InitCenter();
UpdateCluster();
}
void
InitCenter()//初始化中心点(参照点)
{
int
i=0;
//产生随即的K个<N的不同的序列
CreateRandomArray(N,K,CenterIndex);
for(i=0;i<K;i++)
{
Center[i]=DataSet[CenterIndex[i]];
}
CopyCenter();
}
void
CreateRandomArray(int
n,int
k,int
*centerIndex)//产生可以随输出控制的
k与n
(可舍弃)
{
int
i=0,j=0;
for(i=0;i<K;i++)
{
int
a=rand()%n;
for(j=0;j<i;j++)
{
if(centerIndex[j]==a)
break;
}
if(j>=i)
{
centerIndex[i]=a;
}
else
{
i--;
}
}
}
void
CopyCenter()//将旧的中心点保留以作比较
{
int
i=0;
for(i=0;i<K;i++)
{
CenterCopy[i]=Center[i];
}
}
void
UpdateCluster()//
{
int
i=0;
int
tindex;
for(;i<K;i++)
{
Top[i]=0;
}
for(i=0;i<N;i++)
{
tindex=GetIndex(DataSet[i],Center);
AddtoCluster(tindex,DataSet[i]);
}
}
int
GetIndex(double
value,double
*center)//判断属于哪个参照点
{
int
i=0;
int
index=i;
double
min=fabs(value-center[i]);
for(i=0;i<K;i++)
{
if(fabs(value-center[i])<min)
{
index=i;
min=fabs(value-center[i]);
}
}
return
index;
}
void
AddtoCluster(int
index,double
value)//统计每组个数(用于均值法求新的参照点)
{
Cluster[index][Top[index]]=value;
Top[index]++;
}
void
UpdateCenter()//更新参照点
{
int
i=0,j=0;
double
sum;
for(i=0;i<K;i++)
{
sum=0.0;
for(j=0;j<Top[i];j++)
{
sum+=Cluster[i][j];
}
if(Top[i]>0)
{
Center[i]=sum/Top[i];
}
}
}
bool
IsEqual(double
*center,double*centercopy)//
{
int
i;
for(i=0;i<K;i++)
{
if(fabs(center[i]!=centercopy[i]))
return
0;
}
return
1;
}
void
print()//
{
int
i,j;
cout<<"===================================="<<endl;
for(i=0;i<K;i++)
{
cout<<"第"<<i<<"组:质心为:"<<Center[i]<<endl;
cout<<"数据元素为:\n";
for(j=0;j<Top[i];j++)
{
cout<<Cluster[i][j]<<'\t';
}
cout<<endl;
}
}

MATLAB实现kmeans聚类实例加程序
K-means算法是聚类分析中应用广泛的一种迭代求解方法,它将数据划分为K个组,随机选择K个对象作为初始中心点,计算每个对象与其他中心点之间的距离,将对象分配给最近的中心点,以此实现数据的分类。在当前的分类应用中,K-means聚类算法被广泛应用。MATLAB自带的kmeans函数能够实现这一功能,其具体语法如下...

使用K-Means 算法进行聚类分析程序
C-Fuzzy均值聚类算法采用的是给定类的个数K,将N个元素(对象)分配到K个类中去使得类内对象之间的相似性最大,而类之间的相似性最小 *\/ \/\/函数声明部分 void InitData();void InitCenter();void CreateRandomArray(int n,int k,int *centerIndex);void CopyCenter();void UpdateCluster();void ...

(Matlab实现)K-means算法及最佳聚类数目的确定
K-means算法的计算步骤包括初始化聚类中心、计算数据点到聚类中心的距离、将数据点分配到最近的聚类、更新聚类中心,然后重复以上步骤直到满足终止条件。卡林斯基-哈拉巴斯准则(CH值)是基于簇间方差与簇内方差的比例来衡量聚类效果。定义良好的簇会具有较大的簇间方差和较小的簇内方差,通过最大化关于K的...

聚类算法K-Means原理及实现
使用sklearn.cluster库中的KMeans算法进行聚类,参数包括n_clusters(聚类中心数量),方法包括计算聚类中心和预测样本类别。2.2 案例分析 创建不同二维数据集进行聚类实验,调整n_cluster参数,观察聚类效果。三、聚类算法实现流程 3.1 K-means聚类步骤 通过动态图示解释实现流程,包括初始化聚类中心、计算...

K-means聚类分析案例(二)
之前的笔记: 聚类介绍: 点这里 层次聚类分析案例(一):世界银行样本数据集 层次聚类分析案例(二):亚马逊雨林烧毁情况 层次聚类分析案例(三):基因聚类 K-means聚类分析案例(一)K-means聚类案例(二)食品 我们所吃的食物中的营养成分可以根据它们在构建身体构成的作用来分类。

kmeans算法经典案例(kmeans算法基本步骤)
在探讨k-means算法的经典案例时,我们关注的是其基本步骤和实际应用。k-means算法,作为聚类分析中的一种重要方法,能够将数据集划分为k个互不相交的子集(簇),从而实现数据的聚类分析。让我们深入剖析其核心步骤。首先,选择k个对象作为初始聚类中心。这一步通常需要基于数据集的先验知识或者随机选取,...

机器学习库sklearn的K-Means聚类算法的使用方法
观察并可视化聚类后的质心。对于实际应用,只需准备数据,调用fit()函数,即可完成K-means的计算。在后续的笔记中,我们将更深入地探讨如何在实际数据集上应用K-means算法。总之,sklearn的K-Means为快速进行聚类分析提供了简便途径,只需遵循正确步骤,即可在Python环境中轻松操作。

社交媒体话题文本分词后用sklearn的kmeans算法做聚类分析
实验过程包括使用sklearn的K-Means算法进行文本聚类分析。我们分别进行了人工设置K值为3和使用“手肘法”确定最佳K值的实验。通过“手肘法”,我们观察到最佳的K值为8。实验中,我们还对聚类结果进行了可视化,并展示了每个簇群去重后的关键词,以更直观地理解不同簇群之间的差异。总结而言,本文通过使用实际...

K-means聚类分析案例(一)
kmeans()函数能够在数据矩阵上执行k均值聚类。protein数据矩阵被当作一个对象传入该函数,该对象必须是数值型矩阵。centers=3代表初始化簇中心数量。因为簇的数量由一个数字指定,nstart=10定义了随机被选择的中心数。结果如下:接下来,生成簇指派列表。order()函数返回一个序列,以升序或者降序重新...

K-MEANS算法处理流程
k-means算法是一种基于样本间相似性度量的间接聚类方法,属于非监督学习方法。此算法以k为参数,把n个对象分为k个簇,以使簇内具有较高的相似度,而且簇间的相似度较低。相似度的计算根据一个簇中对象的平均值(被看作簇的重心)来进行。首先,从n个数据对象中任意选择k个对象作为初始聚类中心。接...

相似回答