求優化現有程式,用r語言實作,具體要求如下:
修改第34-41行,即#mykmeans函式后面的那部分(初始聚類中心的確定)。要求改革當前的方式(隨機選擇)為某種自定策略,使得對于矩陣m的聚類結果更可靠。
1、該策略自行設計,并在程式中用注釋的方法予以闡明。
2、可靠的聚類結果以系統自帶的kmeans函式為標準。
rm(list=ls())
#計算兩點間距離的函式
dis = function(c1,c2){
sqrt(sum((c1-c2)^2))
}
#根據當前中心計算新的中心cennew和類別標簽labels
calccenlab = function(m,cen){
nrow = nrow(m)
ncol = ncol(m)
labels = c()
k = nrow(cen)
for (i in 1:nrow){
point = m[i,]
distance = c()
for (j in 1:k){
distance[j] = dis(point,cen[j,])
}
labels[i] = which.min(distance)
}
#calc the new center
cennew = matrix(0,k,ncol)
for (i in 1:k){
if (is.vector(m[labels==i,])){ #只有1行
cennew[i,]=m[labels==i,]
}else{ #有多行
cennew[i,]=apply(m[labels==i,],2,mean)
}
}
list(cennew,labels)
}
#mykmeans函式
mykmeans = function(m,k){
#尋找合適的k個聚類中心
sel = sample(1:nrow(m),k)
print(sel)
center = m[sel,]
tmp = calccenlab(m,center)
center = tmp[[1]]
labels = tmp[[2]]
#迭代重定位
while(1){
rst = calccenlab(m,center)
if (sum(rst[[2]]==labels)==nrow(m)){
break
}
center = rst[[1]]
labels = rst[[2]]
}
rst
}
#construct data m
p1=c(0.8,0.9)
p2=c(1,1)
p3=c(3,3)
p4=c(2.9,3.1)
p5=c(3.5,3.4)
m = rbind(p1,p2,p3,p4,p5)
#聚類
rst=mykmeans(m,3)
print(rst[[2]])
print(rst[[1]])
#plot
plot(m[,1],m[,2],pch=19,col=factor(rst[[2]]))
text(m[,1]+0.07,m[,2]+0.07,rownames(m),font =2)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/34895.html
標籤:其他開發語言
上一篇:python怎么監控一個函式
下一篇:關于pygame中的音樂播放
