2017-01-24 5 views
0

У меня есть следующие dataset (полученного here):Оптимизация K-средства кластеризации с использованием генетического алгоритма

----------item survivalpoints weight 
1 pocketknife    10  1 
2  beans    20  5 
3  potatoes    15  10 
4  unions    2  1 
5 sleeping bag    30  7 
6   rope    10  5 
7  compass    30  1 

Я группироваться этот набор данных на три группы с kmeans() используя двоичную строку в качестве моего первоначального выбора центров. Для например:

## 1 represents the initial centers 
chromosome = c(1,1,1,0,0,0,0) 
## exclude first column (kmeans only support continous data) 
cl <- kmeans(dataset[, -1], dataset[chromosome == 1, -1]) 
## check the memberships 
cl$clusters 
# [1] 1 3 3 1 2 1 2 

Используя эту фундаментальную концепцию, я попробовал его с GA пакетом для проведения поиска, где я пытаюсь оптимизировать индекс (минимизировать) Davies-Bouldin (DB).

library(GA)   ## for ga() function 
library(clusterSim) ## for index.DB() function 

## defining my fitness function (Davies-Bouldin) 
DBI <- function(x) { 
     ## converting matrix to vector to access each row 
     binary_rep <- split(x, row(x)) 
     ## evaluate the fitness of each chromsome 
     for(each in 1:nrow(x){ 
      cl <- kmeans(dataset, dataset[binary_rep[[each]] == 1, -1]) 
      dbi <- index.DB(dataset, cl$cluster, centrotypes = "centroids") 
      ## minimizing db 
      return(-dbi) 
    } 
} 

g<- ga(type = "binary", fitness = DBI, popSize = 100, nBits = nrow(dataset)) 

Конечно (я понятия не имею, что происходит), я получил сообщение об ошибке в Warning messages: Error in row(x) : a matrix-like object is required as argument to 'row'

Вот мои вопросы:

  1. Как правильно можно использовать GA пакет, чтобы решить мой проблема?
  2. Как я могу убедиться, что случайно сгенерированных хромосома содержит одинаковое число 1 с, что соответствует k количеству кластеров (например, если k=3 то хромосома должен содержать ровно три 1 S)?
+0

Я не думаю, что этот подход имеет какой-то смысл. Вероятно, это не сработает, потому что k-значит слишком часто сходится к точному решению. –

+0

Есть ли какие-либо предложения, которые вы можете предложить по такой проблеме? мой набор данных слишком мал? –

+0

Я не думаю, что GA + k-означает * когда-либо * имеет смысл. –

ответ

2

Я не могу прокомментировать смысл объединения k-средств с ga, но могу указать, что у вас была проблема в вашей фитнес-функции. Кроме того, ошибки производится, когда все гены включены или выключены, поэтому фитнес вычисляется только тогда, когда это не так:

DBI <- function(x) { 
    if(sum(x)==nrow(dataset) | sum(x)==0){ 
    score <- 0 
    } else { 
    cl <- kmeans(dataset[, -1], dataset[x==1, -1]) 
    dbi <- index.DB(dataset[,-1], cl=cl$cluster, centrotypes = "centroids") 
    score <- dbi$DB 
    } 

    return(score) 
} 

g <- ga(type = "binary", fitness = DBI, popSize = 100, nBits = nrow(dataset)) 
plot(g) 

enter image description here

[email protected] 
[email protected] 

Похоже, некоторые комбинации генов получают то же самое «лучшее «значение пригодности

+1

Я не могу сказать вам, насколько я благодарен за этот ответ. Да, я согласен с тем, что гены имеют тенденцию сходиться к одному и тому же решению, но знание того, как применять определяемую пользователем физическую форму, - отличное начало для меня. Большое спасибо! –

+0

Приветствия. Если это было непонятно, убедитесь, что вы понимаете, что ga попытается _maximize_ функцию фитнеса, а не минимизировать - как это делается в других оптимизирующих алгоритмах, основанных на функции стоимости. –

+0

, который подводит меня к другому вопросу, так как 'ga' максимизирует функцию пригодности, почему нет необходимости в множественном« счете »с -1, чтобы свести его к минимуму? Я видел в других примерах, особенно используя пакет «genalg», где он минимизирует функцию фитнеса, поэтому, чтобы максимизировать его, они просто вернут значение, умноженное на -1. –

 Смежные вопросы

  • Нет связанных вопросов^_^