Untitled
unknown
r
4 years ago
1.7 kB
33
Indexable
kmedioids <- function(X, k, max_iter = 1000, tol = 0.001) {
# In this section we randomly assign each row to a random cluster
n_col <- ncol(X)
n_row <- nrow(X)
# Get random objects as initial mediods
medoids <- get_medoids(X, n_row, k)
# Get the total costs of each cluster
### For every point, calculate distance to each cluster
### Assign each point to the cluster with lowest distance
### We then sum the total costs for this assignment (per cluster)
costs <- get_costs(X, medoids)
clusters <- costs[[1]]
distances <- costs[[2]]
dj <- costs[[3]]
swap <- TRUE
stop <- FALSE
counter <- 0
while(stop == FALSE){
swap <- FALSE
for(i in 1:n_row){
if(nrow(merge(X[i,],medoids))==0){
for(j in 1:nrow(medoids)){
medoids_ <- medoids
medoids_[j,] <- X[i,]
costs_ <- get_costs(X, medoids_)
clusters_ <- costs_[[1]]
distances_ <- costs_[[2]]
di <- costs_[[3]]
if(di-dj < tol){
clusters <- clusters_
distances <- distances_
dj <- di
medoids <- medoids_
swap <- TRUE
print(paste0('Changed medoids with new cost: ', dj))
}
}
}
}
if(counter>max_iter){
print('Max iterations reached')
stop <- TRUE
break
}
if(!swap){
print('Ending search by convergence')
stop <- TRUE
break
}
counter <- counter + 1
}
return(list(medoids, clusters, distances, dj))
}Editor is loading...