2011-01-05 17 views
8

मेरे पास 6500 आइटमों की एक सूची है जो मैं व्यापार करना चाहता हूं या निवेश करना चाहता हूं। (वास्तविक पैसे के लिए नहीं, बल्कि एक निश्चित गेम के लिए।) प्रत्येक आइटम में 5 संख्याएं होती हैं जिनका उपयोग इसे रैंक करने के लिए किया जाएगा दूसरे।रैंकिंग आइटम के लिए एल्गोरिदम

प्रति दिन कारोबार की गई कुल मात्रा: यह संख्या जितनी अधिक होगी, उतनी ही बेहतर होगी।

पिछले 5 दिनों में आइटम का डॉनचियन चैनल: इस नंबर जितना अधिक होगा, बेहतर होगा।

कीमत का औसत प्रसार: इस नंबर को कम करें, बेहतर।

आइटम के लिए 20 दिन चलने वाले औसत का प्रसार: इस नंबर को कम करें, बेहतर।

आइटम के लिए 5 दिन चलने वाले औसत का प्रसार: इस संख्या को बेहतर, बेहतर।

सभी 5 संख्याओं में वही 'वज़न' होता है, या दूसरे शब्दों में, उन्हें सभी को समान मूल्य या मूल्य के साथ अंतिम संख्या को प्रभावित करना चाहिए।

फिलहाल, मैं प्रत्येक आइटम के लिए सभी 5 संख्याओं को गुणा करता हूं, लेकिन यह उन वस्तुओं को रैंक नहीं करता है जिस तरह से मैं उन्हें रैंक करना चाहता हूं। मैं बस सभी 5 संख्याओं को एक भारित संख्या में जोड़ना चाहता हूं जिसका उपयोग मैं सभी 6500 वस्तुओं को रैंक करने के लिए कर सकता हूं, लेकिन मुझे यह सही नहीं है कि यह सही तरीके से या गणितीय तरीके से कैसे किया जाए।

नोट: प्रति दिन कारोबार किए गए आइटम की कुल मात्रा और डॉनचियन चैनल संख्याएं हैं जो फैलाव के बाद बहुत अधिक हैं, जो प्रतिशत प्रकार की संख्या अधिक हैं। शायद यही कारण है कि उन सभी को एक साथ गुणा करने से मेरे लिए काम नहीं किया गया; प्रति दिन कारोबार की मात्रा और डॉनचियन चैनल की अंतिम संख्या में बहुत बड़ी भूमिका थी।

+0

यह एक मशीन सीखने एल्गोरिथ्म की तरह एक बहुत लग रहा है - अगर आप उन लोगों में से कुछ काम खोजने की कोशिश कर रहे हैं पांच पैरामीटर जो स्टॉक की "भलाई" का अनुमान लगाते हैं। मैं कोई मशीन लर्निंग विशेषज्ञ नहीं हूं, लेकिन शायद कोई और यहाँ है? – templatetypedef

+1

क्या आप एक ठोस उदाहरण जोड़ सकते हैं? आम तौर पर आप अपने इनपुट डेटा डेटा में संख्याओं को सामान्य बनाना चाहते हैं, फिर उन्हें एक साथ जोड़कर ठोस रैंकिंग का उत्पादन करना चाहिए। – madmik3

+0

उदाहरण के लिए, प्रति दिन कारोबार की मात्रा 400 है। डॉनचियन चैनल 30000 है। औसत प्रसार 30 है। 20 दिन औसत का प्रसार 85 है, और 5 दिन औसत का प्रसार 1.2 है।एक साथ जोड़ना उन्हें गुणा करने के समान समस्या उठाता है। – Chuy

उत्तर

2

आप आमतौर पर अपनी डेटा प्रविष्टियों को अपनी संबंधित सीमा में सामान्यीकृत करेंगे। चूंकि उनके लिए कोई निश्चित सीमा नहीं है, इसलिए आपको एक स्लाइडिंग रेंज का उपयोग करना होगा - या, इसे आसान रखने के लिए, उन्हें दैनिक श्रेणियों में सामान्यीकृत करना होगा।

प्रत्येक दिन के लिए, किसी दिए गए प्रकार के लिए सभी प्रविष्टियां प्राप्त करें, उच्चतम और उनमें से सबसे कम प्राप्त करें, उनके बीच का अंतर निर्धारित करें। सबसे नीचे और निम्नतम के बीच अंतर, श्रेणी = अंतर का मूल्य दें। फिर आप प्रत्येक प्रविष्टि (मूल्य - नीचे)/रेंज के लिए गणना करते हैं, जिसके परिणामस्वरूप 0.0 और 1.0 के बीच कुछ होगा। ये वे संख्याएं हैं जिनके साथ आप काम करना जारी रख सकते हैं।

स्यूडोकोड (खरोज द्वारा प्रतिस्थापित कोष्ठक को पढ़ने के लिए आसान बनाने के लिए):

double maxvalues[5]; 
double minvalues[5]; 
// init arrays with any item 
for(i=0; i<5; i++) 
    maxvalues[i] = items[0][i]; 
    minvalues[i] = items[0][i]; 
// find minimum and maximum values 
foreach (items as item) 
    for(i=0; i<5; i++) 
     if (minvalues[i] > item[i]) 
      minvalues[i] = item[i]; 
     if (maxvalues[i] < item[i]) 
      maxvalues[i] = item[i]; 

// now scale them - in this case, to the range of 0 to 1. 
double scaledItems[sizeof(items)][5]; 
double t; 
foreach(i=0; i<5; i++) 
    double delta = maxvalues[i] - minvalues[i]; 
    foreach(j=sizeof(items)-1; j>=0; --j) 
     scaledItems[j][i] = (items[j][i] - minvalues[i])/delta; 
     // linear normalization 

कुछ है कि पसंद है। मैं एक अच्छी लाइब्रेरी (एसटीएल, बूस्ट, जो भी आपके पास कार्यान्वयन प्लेटफ़ॉर्म पर है) के साथ अधिक सुरुचिपूर्ण होगा, और सामान्यीकरण एक अलग फ़ंक्शन में होना चाहिए, ताकि आप लॉग() जैसी अन्य विविधताओं के साथ इसे बदल सकें क्योंकि आवश्यकता उत्पन्न होती है ।

+0

मेरा वजन 5 संख्याओं को भारित संख्या में जोड़कर, मेरा मतलब था कि अंतिम संख्या भारित की जाएगी क्योंकि प्रत्येक 5 कारक इसे समान रूप से प्रभावित करेंगे। मेरे पास एक सेट रेंज है, यदि सीमा से आप सबसे ज्यादा संख्या और सबसे कम संख्या का मतलब है। हालांकि, यह सीमा 1 (1 मिलीलीटर, केवल 1) से 40 मिलियन तक जाती है। अधिकांश रेंज 100 से 400 के बीच है। क्या 40 मिलीलीटर नतीजे नहीं निकलेगा? – Chuy

+0

ठीक है, पोस्टिंग को अनुकूलित किया गया। निश्चित सीमा से मेरा मतलब उन सभी मूल्यों पर एक सीमा है जो वे कभी पार नहीं करते हैं। - यही कारण है कि मैंने सामान्यीकरण के बारे में लिखा था। यहां रैखिक सामान्यीकरण पांच प्रविष्टियों के बीच अंतर के खिलाफ मदद करेगा। यदि आप उनके डेटा की तरह (आवर्धन पर वितरित) हैं, तो आप कुछ वस्तुओं पर लॉगरिदमिक स्केलिंग जैसे कुछ का उपयोग कर इस पर सुधार करना चाह सकते हैं। हालांकि, आपने जो लिखा है उससे नहीं बता सकते हैं। – foo

+0

मैं @foo से सहमत हूं कि लॉग या अन्य स्केलिंग करने से –

3

प्रत्येक आइटम को 0 के स्कोर के साथ शुरू करें। प्रत्येक 5 संख्याओं के लिए, उस नंबर से सूची को क्रमबद्ध करें और प्रत्येक आइटम की रैंकिंग को उस क्रम में क्रमबद्ध करें। फिर, केवल संयुक्त स्कोर द्वारा वस्तुओं को सॉर्ट करें।

+0

सहमत है, यह सबसे आसान तरीका होगा और ओपी चाहता है कि –

+0

यही वह है जो मैं करने की योजना बना रहा था। हालांकि, डेटा की सीमा काफी भिन्न होती है। उदाहरण के लिए, कारोबार की मात्रा 2 से 40 मिलियन तक हो सकती है। अगले परिणाम के बाद 40 मिलियन अधिक है, जो लगभग 20 मिलियन मीटर है जो अगले आइटम के बाद भी काफी अधिक है। प्रतिदिन कारोबार किए गए आदेश से रैंकिंग केवल 20 मिलियन के साथ आइटम पर 40 मिलियन एक रैंकिंग स्थिति के साथ आइटम देगी, भले ही लगभग 20 मिलियन का बड़ा अंतर हो। अगर मैं बेहतर समाधान नहीं ढूंढता तो मैं यही करूँगा। – Chuy

+0

तो आपको सामान्यीकरण की आवश्यकता है, आखिरकार। – foo

5

फिर आप वेक्टर Z(x) की z- स्कोर, जहां

Z(x) = (x - mean(x))/sd(x). 

इससे उन्हें एक ही "पैमाने" में परिणत हो गया द्वारा प्रत्येक विशेषता-वेक्टर x (लंबाई N = 6500 की) की जगह ले सकता है, और आप अंतिम स्कोर प्राप्त करने के लिए जेड-स्कोर (बराबर भार के साथ) जोड़ सकते हैं, और इस कुल स्कोर से N=6500 आइटम रैंक कर सकते हैं। यदि आप अपनी समस्या में कुछ अन्य विशेषता-वेक्टर ढूंढ सकते हैं जो "भलाई" का संकेतक होगा (सुरक्षा की 10-दिन की वापसी कहें?), तो आप इन जेड-रन के खिलाफ इस अनुमानित विशेषता के एक रिग्रेशन मॉडल को फिट कर सकते हैं सबसे अच्छा गैर-वर्दी वजन का पता लगाने के लिए चर।

12

लोगों को इस प्रश्न का उत्तर देने में परेशानी हो रही है कि हमारे पास दो अलग-अलग "विशेषताओं" की तुलना करने का कोई तरीका नहीं है। यदि केवल दो गुण थे, तो मात्रा का व्यापार और औसत मूल्य फैलता है, (20 मिलियन, 50%) (100,1%) से भी बदतर या बेहतर होगा? केवल आप इसे तय कर सकते हैं।

सब कुछ एक ही आकार संख्या में कनवर्ट करने में मदद मिल सकती है, यह "सामान्यीकरण" के रूप में जाना जाता है। ऐसा करने का एक अच्छा तरीका है जेड-स्कोर जो प्रसाद का उल्लेख है। यह एक सांख्यिकीय अवधारणा है, यह देखते हुए कि मात्रा कैसे भिन्न होती है। इसका उपयोग करने के लिए आपको अपनी संख्याओं के सांख्यिकीय वितरण के बारे में कुछ धारणाएं करने की आवश्यकता है।

फैल जैसी चीजें शायद normally distributed - shaped like a normal distribution हैं। इनके लिए, प्रसाद कहते हैं, z(spread) = (spread-mean(spreads))/standardDeviation(spreads) लें।

कारोबार की मात्रा जैसी चीजें Power law distribution हो सकती हैं। इनके लिए आप औसत और एसडी की गणना करने से पहले log() लेना चाहेंगे। वह जेड स्कोर z(qty) = (log(qty)-mean(log(quantities)))/sd(log(quantities)) है।

फिर प्रत्येक विशेषता के लिए ज़ेड-स्कोर जोड़ें।

प्रत्येक विशेषता के लिए ऐसा करने के लिए आपको इसके वितरण का विचार होना होगा। आप अनुमान लगा सकते हैं लेकिन सबसे अच्छा तरीका एक ग्राफ प्लॉट है और एक नज़र है। आप लॉग स्केल पर ग्राफ प्लॉट करना भी चाह सकते हैं। wikipedia for a long list देखें।

+0

+1 इस उत्तर के साथ सामान्यीकृत संख्याओं के बारे में सोचना सीखने में मदद करेगा, तो मैंने साल पहले किया था। – orangepips

+0

हम्म। तो, मुझे सभी 5 श्रेणियों के लिए डेटा ग्राफ़ करना चाहिए, फिर आलेखों की तुलना विकिपीडिया पर वितरण की सूची में करें? मैं इस बारे में अनिश्चित हूं कि इसे कैसे ग्राफ़ करना है। मैं वाई अक्ष पर डेटा डाल सकता हूं, तो क्या मुझे विशिष्ट अक्ष को x अक्ष पर रखना चाहिए? यदि मैं ऐसा करता हूं तो मुझे लगता है कि मुझे एक्स अक्ष पर आइटम्स को निम्न से उच्च के गुण के अनुरूप मान से सॉर्ट करना चाहिए? – Chuy

+0

आपको हिस्टोग्राम (बार चार्ट के समान) बनाने की आवश्यकता है। ऐसा करने का सबसे आसान तरीका एक्सेल (या ओपन ऑफिस समतुल्य) के साथ है। देखें http://www.ncsu.edu/labwrite/res/gt/gt-bar-home.html#ith –

0

प्रति दिन कारोबार की गई कुल मात्रा: इस संख्या जितनी अधिक होगी, बेहतर होगा। (ए)

पिछले 5 दिनों में आइटम का डॉनचियन चैनल: इस नंबर जितना अधिक होगा, बेहतर होगा। (बी)

कीमत का औसत प्रसार: इस नंबर को कम, बेहतर। (सी)

आइटम के लिए 20 दिन चलने वाले औसत का प्रसार: इस नंबर को कम, बेहतर। (डी)

आइटम के लिए 5 दिन चलने वाले औसत का प्रसार: इस संख्या जितना अधिक होगा, बेहतर होगा। (ई)

ए + बी -c -d + ई = "स्कोर" (उच्च स्कोर = बेहतर स्कोर)

+0

यह याद करता है कि (ए) और (बी) फैलाव से काफी बड़े हैं, और उन दोनों को हावी कर देगा परिणाम। – Teepeemm

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