मुझे उन उपयोगकर्ताओं के लिए एकाधिक (कहते हैं, 100 000) होल्डिंग्स के यादृच्छिक सेट उत्पन्न करने की आवश्यकता है जो एकाधिक होल्डिंग्स धारण कर सकते हैं। किसी भी उपयोगकर्ता के लिए, इन होल्डिंग्स का योग 1 होना चाहिए। सिद्धांत रूप में, इन रैंडम होल्डिंग्स को उत्पन्न करना काफी आसानी से numpy में किया जा सकता है:

num_users = 100000
num_holdings = 8

random_holdings = np.random.rand(num_users, num_holdings)
random_holdings /= np.sum(random_holdings, axis=1, keepdims=True)

यह हमें देता है

random_holdings
array([[0.044, 0.169, 0.204, ..., 0.051, 0.116, 0.176],
       [0.132, 0.078, 0.23 , ..., 0.102, 0.028, 0.204],
       [0.036, 0.182, 0.165, ..., 0.138, 0.065, 0.04 ],
       ...,
       [0.195, 0.028, 0.136, ..., 0.147, 0.113, 0.22 ],
       [0.19 , 0.237, 0.061, ..., 0.23 , 0.109, 0.046],
       [0.181, 0.111, 0.1  , ..., 0.166, 0.126, 0.199]])

इसके साथ समस्या यह है कि यह कई समान होल्डिंग सेट और अपेक्षाकृत कुछ केंद्रित होल्डिंग सेट की ओर जाता है। उदाहरण के लिए:

len(np.where(random_holdings > 0.5)[0])

24 का परिणाम देता है, यानी पूरे 100 000 में से केवल 24 होल्डिंग्स हैं जो 0.5 से अधिक हैं।

क्या कोई कृपया बेहतर रैंडमाइजेशन विधि या सिर्फ एक अधिक समझदार समग्र दृष्टिकोण की सिफारिश कर सकता है, ताकि मेरे पास होल्डिंग्स के कम समान सेट और होल्डिंग्स के अधिक केंद्रित सेट हों?

धन्यवाद!

0
Chris J Harris 26 सितंबर 2018, 03:14

1 उत्तर

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

आप "बेहतर यादृच्छिककरण विधि" मांगते हैं, लेकिन "बेहतर" अच्छी तरह परिभाषित नहीं है। यदि आप केवल कुछ चाहते हैं जो होल्डिंग्स में अधिक अत्यधिक भिन्नता प्रदान करे, तो आप कोशिश कर सकते हैं

random_holdings = np.random.pareto(1, size=(num_users, num_holdings))

और फिर सामान्य करें जैसे आप पहले से करते हैं।

pareto वितरण के आकार को नियंत्रित करता है। जोत में कम चरम परिवर्तन के लिए बड़े मूल्यों का प्रयोग करें। आप अन्य भारी-पूंछ वाले वितरणों के साथ भी प्रयोग कर सकते हैं।

2
Warren Weckesser 26 सितंबर 2018, 04:31