R语言——实验5-聚类分析

  1. 针对课件中的例子自己实现k-means算法
  2. 调用R语言自带kmeans()对给定数据集表示的文档进行聚类。
  3. 给定数据集:

 

 

a)         数据代表的是文本信息。

b)        第一行代表词语,由于保密原因,词语已经被转意。第一列代表了文本的编号。

c)         红框中的数字为对应词的词频。

共113个样本,用K-Means算法将样本分为8类。

 

1、针对课件中的例子自己实现k-means算法

 

rm(list=ls())
#导入数据

id<-c(1:8)
x<-c(1,2,1,2,4,5,4,5)
y<-c(1,1,2,2,3,3,4,4)
inputdata<-data.frame(id,x,y)


#计算距离函数
cal_distance<-function(x1,y1,x2,y2){
  dis=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)
  dis=sqrt(dis)
  return(dis)
}

#假定随机选择的两个对象,如序号1和序号3当作初始点
center1=matrix(c(inputdata[1,2],inputdata[1,3]))
center2=matrix(c(inputdata[3,2],inputdata[3,3]))

#一开始两个簇都是空的
cu1<-c()
cu2<-c()

for(time in 1:5)
{
  #遍历每一个点
  for(i in 1:length(inputdata$id))
  {
    distance1=cal_distance(inputdata$x[i],inputdata$y[i],center1[1],center1[2])
    distance2=cal_distance(inputdata$x[i],inputdata$y[i],center2[1],center2[2])
    if(distance1<=distance2)
    {
      cu1<-c(cu1,i)
    }
    else
    {
      cu2<-c(cu2,i)
    }
  }
  
  #更新簇1的质心
  sx=0
  sy=0
  for(i in 1:length(cu1))
  {
    sx=sx+inputdata$x[cu1[i]]
    sy=sy+inputdata$y[cu1[i]]
  }
  center1[1]=sx*1.0/length(cu1)
  center1[2]=sy*1.0/length(cu1)
  
  #更新簇2的质心
  sx=0
  sy=0
  for(i in 1:length(cu2))
  {
    sx=sx+inputdata$x[cu2[i]]
    sy=sy+inputdata$y[cu2[i]]
  }
  if(center2[1]==sx*1.0/length(cu2)&&center2[2]==sy*1.0/length(cu2))
  {
    break
  }
  center2[1]=sx*1.0/length(cu2)
  center2[2]=sy*1.0/length(cu2)
  cu1<-c()
  cu2<-c()
}

cat("簇1质心: ",center1[1]," ",center1[2])
print("簇1包含的元素有: ")
for(i in 1:length(cu1))
{
  print(cu1[i])
}
print("")
cat("簇2质心: ",center2[1]," ",center2[2])
print("")
print("簇1包含的元素有: ")
for(i in 1:length(cu2))
{
  print(cu2[i])
}

 

 

 

 

2、  调用R语言自带kmeans()对给定数据集表示的文档进行聚类。

 

rm(list=ls())

setwd("C:/Users/Administrator/Desktop/R语言与数据挖掘作业/实验5-聚类分析")

data = read.table("data_cluster.txt")

kc <- kmeans(data, 8) #分类模型训练

print(kc)

#fitted(kc) #查看具体分类情况  
#table(data$Species, data$cluster)#查看分类概括 

 

 

 

 

posted on 2018-11-29 11:00  蔡军帅  阅读(808)  评论(0编辑  收藏  举报