1 |
X |
|
tol |
|
maxit |
|
m.init |
|
trace |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | ##---- Should be DIRECTLY executable !! ----
##-- ==> Define data, use random,
##-- or do help(data=index) for the standard data sets.
## The function is currently defined as
function (X, tol = 1e-08, maxit = 200, m.init = apply(X, 2, median),
trace = FALSE)
{
centr <- function(X, m) X - rep(m, each = n)
mrobj <- function(X, m) sum(sqrt(rowSums(centr(X, m)^2)))
d <- dim(X)
n <- d[1]
p <- d[2]
m <- m.init
if (!is.numeric(m) || length(m) != p)
stop("'m.init' must be numeric of length p =", p)
k <- 1
if (trace)
nstps <- 0
while (k <= maxit) {
mold <- m
obj.old <- if (k == 1)
mrobj(X, mold)
else obj
X. <- centr(X, m)
Xnorms <- sqrt(rowSums(X.^2))
inorms <- order(Xnorms)
dx <- Xnorms[inorms]
X <- X[inorms, ]
X. <- X.[inorms, ]
w <- if (all(dn0 <- dx != 0))
1/dx
else c(rep.int(0, length(dx) - sum(dn0)), 1/dx[dn0])
delta <- colSums(X. * rep(w, p))/sum(w)
nd <- sqrt(sum(delta^2))
maxhalf <- if (nd < tol)
0
else ceiling(log2(nd/tol))
m <- mold + delta
nstep <- 0
while ((obj <- mrobj(X, m)) >= obj.old && nstep <= maxhalf) {
nstep <- nstep + 1
m <- mold + delta/(2^nstep)
}
if (trace) {
if (trace >= 2)
cat(sprintf("k=%3d obj=%19.12g m=(", k, obj),
paste(formatC(m), collapse = ","), ")", if (nstep)
sprintf(" nstep=%2d halvings", nstep)
else "", "\n", sep = "")
nstps[k] <- nstep
}
if (nstep > maxhalf) {
m <- mold
break
}
k <- k + 1
}
if (k > maxit)
warning("iterations did not converge in ", maxit, " steps")
if (trace == 1)
cat("needed", k, "iterations with a total of", sum(nstps),
"stepsize halvings\n")
list(center = m)
}
|
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.