2017-02-15 9 views
8

मैं GA Package का उपयोग कर रहा हूं और मेरा उद्देश्य के-साधन क्लस्टरिंग एल्गोरिदम के लिए इष्टतम प्रारंभिक सेंट्रॉइड पदों को ढूंढना है। मेरे डेटा TF-आईडीएफ स्कोर में शब्दों का एक विरल-मैट्रिक्स है और डाउनलोड करने योग्य है here. नीचे चरणों मैं लागू कर दिया है में से कुछ हैं:के-साधन: प्रारंभिक केंद्र अलग नहीं हैं

0. पुस्तकालय और डाटासेट

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

corpus <- read.csv("Corpus_EnglishMalay_tfidf.csv")  ## a dataset of 5000 x 1168 

1. बाइनरी एन्कोडिंग और प्रारंभिक आबादी उत्पन्न करना।

k_min <- 15 

initial_population <- function(object) { 
    ## generate a population to turn-on 15 cluster bits 
    init <- t(replicate([email protected], sample(rep(c(1, 0), c(k_min, [email protected] - k_min))), TRUE)) 
    return(init) 
} 

2. स्वास्थ्य समारोह कम करता डेविस-Bouldin (DB) सूचकांक। जहां मैं initial_population से उत्पन्न प्रत्येक समाधान के लिए डीबीआई का मूल्यांकन करता हूं।

DBI2 <- function(x) { 
    ## x is a vector of solution of nBits 
    ## exclude first column of corpus 
    initial_centroid <- corpus[x==1, -1] 
    cl <- kmeans(corpus[-1], initial_centroid) 
    dbi <- index.DB(corpus[-1], cl=cl$cluster, centrotypes = "centroids") 
    score <- -dbi$DB 
    return(score) 
} 

3. जीए चल रहा है। इन सेटिंग्स के साथ

g2<- ga(type = "binary", 
    fitness = DBI2, 
    population = initial_population, 
    selection = ga_rwSelection, 
    crossover = gabin_spCrossover, 
    pcrossover = 0.8, 
    pmutation = 0.1, 
    popSize = 100, 
    nBits = nrow(corpus), 
    seed = 123) 

4. समस्या। केमन्स में त्रुटि (कॉर्पस [-1], प्रारंभिक_सेंट्रॉइड): प्रारंभिक केंद्र अलग नहीं हैं।

मुझे एक समान समस्या मिली here, जहां उपयोगकर्ता को क्लस्टर का उपयोग करने के लिए गतिशील रूप से पास करने के लिए पैरामीटर का उपयोग करना पड़ा। यह समूहों की संख्या को कड़ी-कोडिंग करके हल किया गया था। हालांकि, मेरे मामले में, मुझे वास्तव में क्लस्टर की संख्या में गतिशील रूप से पास करने की आवश्यकता है, क्योंकि यह यादृच्छिक रूप से जेनरेट किए गए बाइनरी वेक्टर से आ रहा है, जहां 1's प्रारंभिक सेंट्रॉइड का प्रतिनिधित्व करेगा।

kmeans()code साथ जाँच हो रही है, मैंने देखा है कि त्रुटि डुप्लिकेट केन्द्रों के कारण होता है:

if(any(duplicated(centers))) 
     stop("initial centers are not distinct") 

मैं trace साथ kmeans समारोह संपादित बाहर दोहराया केन्द्रों मुद्रित करने के लिए। उत्पादन:

[1] "206" "520" "564" "1803" "2059" "2163" "2652" "2702" "3195" "3206" "3254" "3362" "3375" 
[14] "4063" "4186" 

कौन सा में बेतरतीब ढंग से initial_centroids चयनित कोई दोहराव से पता चलता है और मुझे पता नहीं क्यों इस त्रुटि होने वाली रहती है। क्या कोई और चीज है जो इस त्रुटि का कारण बन जाएगी?

पी/एस: मुझे समझ में आता है कि कुछ सुझाव दे सकते हैं कि GA + K-साधन एक अच्छा विचार नहीं है। लेकिन मैं जो कुछ शुरू कर चुका हूं उसे पूरा करने की आशा करता हूं। इस समस्या को के-साधन समस्या के रूप में देखना बेहतर है (कम से कम initial centers are not distinct त्रुटि को हल करने में)।

उत्तर

4

जेनेटिक एल्गोरिदम समस्या की प्रकृति द्वारा के-साधनों को अनुकूलित करने के लिए उपयुक्त नहीं हैं - प्रारंभिक बीज बहुत अधिक बातचीत करते हैं, जी सभी संभावित बीजों का यादृच्छिक नमूना लेने से बेहतर नहीं होगा।

तो मेरी मुख्य सलाह है कि यहां आनुवांशिक एल्गोरिदम का उपयोग न करें!

यदि आप जोर देते हैं, तो आपको खराब पैरामीटर का पता लगाने के लिए क्या करना होगा, फिर खराब प्रारंभिकरण के लिए केवल खराब स्कोर लौटाएं ताकि वे "जीवित" न हों।

+0

मैं इस विषय में एक कुल शुरुआत कर रहा हूँ, आप "प्रारंभ बीज बहुत ज्यादा बातचीत" के बारे में अधिक व्याख्या कर सकते हैं? क्या इस वजह से 'शुरुआती केंद्र अलग नहीं हैं' समस्या? और खराब गुणसूत्रों को खत्म करने के बारे में आपके सुझाव के लिए धन्यवाद, यह मेरे लिए नया है! –

2

आपके प्रश्न का उत्तर करने के लिए बस कार्य करें:

any(corpus[520, -1] != corpus[564, -1]) 

आपका 520 और corpus की 564 पंक्तियों में एक ही, एक विशेषता row.names में फर्क सिर्फ इतना के साथ कर रहे हैं, देखें:

identical(colnames(corpus[520, -1]), colnames(corpus[564, -1])) # just to be sure 
rownames(corpus[520, -1]) 
rownames(corpus[564, -1]) 

जीए के बारे में और के-साधन, उदाहरण देखें:

  1. Bashar Al-Shboul, Myaeng Sung-Hyon, "Initializing K-Means using Genetic Algorithms", World Academy of Science, Engineering & Technology, Jun2009, Issue 30, p. 114, (विशेष रूप से सेक्शन II बी); या
  2. BAIN KHUSUL KHOTIMAH, FIRLI IRHAMNI, AND TRI SUNDARWATI, "A GENETIC ALGORITHM FOR OPTIMIZED INITIAL CENTERS K-MEANS CLUSTERING IN SMEs", Journal of Theoretical and Applied Information Technology, 2016, Vol. 90, No. 1
+0

इंगित करने के लिए धन्यवाद। तो दो पंक्तियों में समान मूल्यों के मामले में, इसे संभालने के लिए एक बेहतर तरीका क्या है? –

+1

मेरा प्रारंभिक प्रयास यह सुनिश्चित करना होगा कि जीए अनन्य सेंट्रॉइड वाले व्यक्तियों को बना रहा हो (यानी आपके 'प्रारंभिक_centroid' के-साधन मूल्यांकन के लिए), इसलिए आपको कस्टम क्रॉसओवर और उत्परिवर्तन कार्यों को बनाना होगा। यही कारण है कि "डिफ़ॉल्ट" जीए को हल करने वाली हर समस्या के अनुकूलन की आवश्यकता है। एक और विचार, बहुत आसान लेकिन लगभग निश्चित रूप से बदतर, 'प्रारंभिक_सेंट्रॉइड' की विशिष्टता की जांच करना होगा और यदि कोई डुप्लिकेट आबादी से उन्हें हटाने के लिए इस व्यक्ति के लिए "बहुत बुरा" स्कोर लौटाता है। –

संबंधित मुद्दे