c语言聚类函数,模糊c均值聚类的r语言代码

FCM

## FCM

## INPUTS

##   x: input matrix n*d, n  d-dim samples

##   K: number of desired clusters

##   Optional :

##       mybeta : beta, exponent for m (defaut 2).

##       nstart:  how many random sets should be chosen(defaut 1)

##       iter_max : The maximum number of iterations allowed. (default 100)

##

## OUTPUTS

##   u: The fuzzy membership matrix = maxtrix of size n*K;

##   g: matrix of size K*d of the centers of the clusters

##   J: objective function

##   histJ: all the objective function values in the iter process

## modified time: 2015-02-07

FCM_onetime

n = dim(x)[1]

d = dim(x)[2]

g = init_centers

K = dim(g)[1]

histJ = c()

pasfini = 1

Jold = Inf

D = matrix(0, n, K)

for (j in 1:K) {

D[, j] = rowSums(sweep(x, 2, g[j, ], "-")^2)

}

iter = 1

J_old = Inf

while (pasfini) {

s = (1/(D + eps))^(1/(mybeta - 1))

u = s/(s %*% matrix(1, K, K))

t1 = t(u^mybeta) %*% x

t2 = t(u^mybeta) %*% matrix(1, n, d)

V = t1/t2

g = V

D = matrix(0, n, K)

for (j in 1:K) {

D[, j] = rowSums(sweep(x, 2, g[j, ], "-")^2)

}

J = sum(u^mybeta * D)

pasfini = abs(J - Jold) > 0.001 && (iter < iter_max)

Jold = J

histJ = c(histJ, J)

iter = iter + 1

}

cluster_id = apply(u, 1, which.max)

re = list(u, J, histJ, g, cluster_id)

names(re) = c("u", "J", "histJ", "g", "cluster_id")

return(re)

}

x = as.matrix(x)

seeds = 1:nrow(x)

id = sample(seeds, K)

g = as.matrix(x[id, ])

re_best = FCM_onetime(x = x, init_centers = g, mybeta = mybeta, iter_max = iter_max, eps = eps)

if (nstart > 1) {

minJ = 0

i = 2

while (i <= nstart) {

init_centers_id = sample(seeds, K)

init_centers = as.matrix(x[init_centers_id, ])

run = FCM_onetime(x, init_centers = init_centers, mybeta = mybeta, iter_max = iter_max)

if (run$J <= re_best$J) {

re_best = run

}

i = i + 1

}

}

return(re_best)

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值