मैंने दो डेटासेट के लिए क्लस्टरिंग करने के लिए मैटलैब किमी फ़ंक्शन का उपयोग किया: डेटा 1 और डेटा 2। मेरे पास तीन मुख्य फाइलें हैं, जिनमें क्रमशः निम्नलिखित कोड हैं,

result1 = kmeans(data1, 4);
result2 = kmeans(data2, 4);

r1 = kmeans(data1,4);

r2 = kmeans(data2,4);

मैंने देखा कि result1 और r1 समान हैं, लेकिन result2 और r2 थोड़े अलग हैं। मेरा मानना ​​है कि यह kmeans एल्गोरिथम में यादृच्छिकता के कारण होता है। पहली और दूसरी फाइलों में, डेटा 1 को पहले निष्पादित किया जाता है और इस प्रकार kmeans उसी "बीज" का उपयोग करता है। पहली और तीसरी फाइलों में, डेटा 2 को विभिन्न चरणों में निष्पादित किया जाता है। परिणाम 1 के लिए उपयोग किए जाने वाले किमी का निम्न किमी के अर्थों पर प्रभाव पड़ता है।

मेरा प्रश्न है: क्या हम किसी निश्चित तरीके से बीज स्थापित कर सकते हैं ताकि r2 और परिणाम 2 समान हों?

2
Tony B 13 फरवरी 2019, 21:00

2 जवाब

सबसे बढ़िया उत्तर

आप rng समारोह। इसके साथ, आप अपना कोड चलाने से पहले यादृच्छिक संख्या जनरेटर की स्थिति पर कब्जा कर सकते हैं, फिर यादृच्छिक संख्या जनरेटर को फिर से चलाने से पहले उस स्थिति में वापस सेट कर सकते हैं, यह सुनिश्चित करते हुए कि आपको वही परिणाम मिलते हैं। उदाहरण के लिए:

rngState1 = rng;  % Capture state before processing data1
result1 = kmeans(data1, 4);
rngState2 = rng;  % Capture state before processing data2
result2 = kmeans(data2, 4);

...

rng(rngState1);  % Restore state previously used for processing data1
r1 = kmeans(data1,4);

...

rng(rngState2);  % Restore state previously used for processing data2
r2 = kmeans(data2,4);

चूंकि आप अलग-अलग फ़ाइलों में डेटा संसाधित कर रहे हैं, इसका मतलब यह हो सकता है सेव और लोड हो रहा है स्टेट वेरिएबल्स को MAT-फाइल में और उसके ऊपर जो मैंने बताया है उसे करने के लिए। एक अन्य विकल्प बस प्रत्येक डेटा सेट को संसाधित करने से पहले बीज को किसी दिए गए मान पर सेट करना है:

rng(1);  % Set seed to 1 for data1
result1 = kmeans(data1, 4);
rng(2);  % Set seed to 2 for data2
result2 = kmeans(data2, 4);

...

rng(1);
r1 = kmeans(data1,4);

...

rng(2);
r2 = kmeans(data2,4);
2
gnovice 13 फरवरी 2019, 22:19

एक अन्य विकल्प गैर-यादृच्छिक आरंभीकरण का उपयोग करना है:

start = data1(1:4,:); % This is not necessarily a good initialization!
result1 = kmeans(data1, 4, 'Start',start);

ऊपर दिए गए कोड को कॉपी-पेस्ट न करें, यह सिर्फ उदाहरण के लिए है। लेकिन आपके पास अपने साधनों को गैर-यादृच्छिक रूप से प्रारंभ करने की एक अच्छी रणनीति हो सकती है, यह आपके डेटा पर निर्भर करता है कि आप यह कैसे कर सकते हैं। उदाहरण के लिए एक आयताकार डोमेन में 2डी डेटा के लिए आप डोमेन के चारों कोनों का चयन कर सकते हैं।

0
Cris Luengo 13 फरवरी 2019, 23:33