R语言:如何生成随机聚类数据/generate random clusters;介绍R package:clusterGeneration

写在前面:因为参考文献是外文文献,虽然我已尽量照着自己的理解翻译,但有些专业词汇我也怕表述不清,不可避免的会出现很多英文术语。希望不会影响阅读,见谅!

clustering:聚类方法,如K-means之类的

clusters:聚类结果,k=3代表最后分成3类

------------

不知我这个【生成随机聚类数据】翻译是否正确,总之就是根据预设条件(如有多少个类clusters,每个cluster有多少个点,分别服从什么分布等等)生成随机聚类的点simulate data。这在很多应用中都需要,比如用来比较各种聚类方法:K-means,PAM(Partitioning Around Medoids),Hierarchical clustering层次聚类等。当然我们可以用实际数据比较,但假如我想知道哪种聚类方法更加适用于什么情况blabla,我们就需要根据情况自己生成artificial datatset。

这里讲的都是用R来做的哈!

第一种方法:简单粗暴!根据自己需求直接写。

# Artificial dataset 
#生成3个clusters,其中两个服从正态分布,一个均匀分布,其中服从正态分布的每组20个点,均匀分布的100个点。

 x1 <- rnorm(20)
 y1 <- rnorm(20)
 x2 <- rnorm(20,mean=10)
 y2 <- rnorm(20)
 x3 <- runif(100,-20,30)
 y3 <- runif(100,20,40)
 data <- cbind(c(x1,x2,x3),c(y1,y2,y3))

缺点就是如果我想做因子实验factorial experiment design,比如设置3个因子:聚类数有(2,3,5)个,点数可以有(50,100,225)个,还有cluster之间的距离是离得近还是远,这样就是3*3*2=18种情况了。这时候我们可以找一个更加方便的方法写~这也是我主要想介绍的一个R package:clusterGeneration。这个函数非常的方便,能根据要求随机生成各种cluster,尤其是能量化的定义cluster之间的距离远近。如果是用第一种方法自己写,得经过不断地参数调整才能找到合适的参数:怎么样cluster之间相隔的间距比较模糊fuzzy-separated(似连似分?哈哈哈哈 

主要讲讲genRandomClust这个函数。simClustDesign跟它异曲同工,就是引入了因子实验。

网站:https://cran.r-project.org/web/packages/clusterGeneration/clusterGeneration.pdf

document都讲的非常清楚了,主要参数包括:

numcluster:几个聚类;

sepVal:cluster与cluster之间的距离远近,等于0.01代表距离很近,聚的类之间不那么明显(有重叠区域)。0.21代表距离适中,能看出分界线。0.34代表well-separated,分得很开。下面会具体说这个指标是怎么计算的。

numNonNoisy:数据有几维;

numNoisy:默认为0,如果大于0那么最终数据的维度=numNonNoisy+numNoisy;

numOutlier:有多少个异常值;

numReplicate:重复次数;

clustszind:关于cluster size的indicator。等于1说明所有的cluster点数都相同,具体数值填在下一个参数clustSizeEq里。等于2说明cluster的点数随机在一个范围里生成,范围定义在之后的参数rangeN里。等于3就是每个cluster的点数都具体指定,在之后的clustSizes。

clustSizeEq:只能填一个值,就是每组的点数。

rangeN:填一个范围,如c(50,200),那么每个cluster的点数就是在50~200里随机定。

clustSizes:每个cluster指定点数,假如填c(50,200),意味着有2个cluster,第一个是50个点,第二个200点。如果clustSizes的长度不等于numcluster的话是会报错的哟。

剩下的就不说了,最后关于output的几个参数默认为True,就是把生成的每个case都分别输出,如果不想这样就改成False,最后结果是一个list。

给一个栗子~这个是偷懒直接照搬上篇文章的嘻嘻

cluster<-c(2,3,5)
point<-c(25,100,225)
sepval<-c(0.01,0.21)
repl<-2

#Eq=1:the number of points in each cluster is the same.

t<-list()
gen<-list()
Eq1<-list()
for (i in 1:3){
  for (j in 1:3){
    for (k in 1:2){
      t[[k]] <- genRandomClust(numClust=cluster[i], sepVal=sepval[k], numNonNoisy=2,
                               numNoisy=0, numOutlier=0, numReplicate=repl, fileName="Eq1",
                               clustszind=1,
                               clustSizeEq=point[j],
                               outputDatFlag=F,
                               outputLogFlag=F,
                               outputEmpirical=F,
                               outputInfo
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值