2025, Oct 22 15:16

ConditionalCategorical में 2×2 NumPy probs देने पर TypeError का समाधान

pomegranate के ConditionalCategorical में 2×2 NumPy probability table सीधे देने पर TypeError का कारण और हल: probs को list में रखें, n_categories को nested

pomegranate में एक साधारण ConditionalCategorical सेट करते समय, अक्सर मन करता है कि एक अकेली 2×2 NumPy array को probability table की तरह पास करके आगे बढ़ जाएं। लेकिन ऐसा करने पर लाइब्रेरी के भीतर गहराई में एक अप्रत्याशित TypeError मिल सकता है। समाधान छोटा है, पर इनपुट की आकृति (shape) मायने रखती है।

न्यूनतम उदाहरण

नीचे दिया स्निपेट एक द्विआधारी पैरेंट और द्विआधारी चाइल्ड को सरल one‑hot मैपिंग के साथ सेट करता है और फिर ConditionalCategorical को प्रारंभ करता है। यही त्रुटि पैदा करता है।

from pomegranate.distributions import ConditionalCategorical
import numpy as np
prob_grid = [
    [1.0, 0.0],  # पैरेंट = 0 -> चाइल्ड = 0
    [0.0, 1.0],  # पैरेंट = 1 -> चाइल्ड = 1
]
probs_np = np.array(prob_grid, dtype=np.float32)
cat_sizes = [2, 2]
cond_model = ConditionalCategorical(probs_np, n_categories=cat_sizes)
print("ConditionalCategorical constructed:", cond_model)

असल समस्या क्या है

ConditionalCategorical अपने probs तर्क को NumPy arrays की सूची के रूप में अपेक्षित करता है। एक अकेली NumPy array देने पर आंतरिक shape logic की गणना बदल जाती है और प्रारंभिकरण के दौरान बाद में असफलता होती है। इसलिए probability table को सूची में लपेटने के साथ‑साथ, n_categories को भी उसी संरचना को दर्शाना चाहिए।

उपाय और सुधरा हुआ उदाहरण

Probability table को एक सूची में रखें और n_categories को उसी nesting का प्रतिबिंब बनाएं।

from pomegranate.distributions import ConditionalCategorical
import numpy as np
prob_grid = [
    [1.0, 0.0],  # पैरेंट = 0 -> चाइल्ड = 0
    [0.0, 1.0],  # पैरेंट = 1 -> चाइल्ड = 1
]
probs_np = np.array(prob_grid, dtype=np.float32)
cat_sizes = [2, 2]
cond_model = ConditionalCategorical(probs=[probs_np], n_categories=[cat_sizes])
print("ConditionalCategorical constructed:", cond_model)

यह बारीकी क्यों मायने रखती है

वे API जो संरचित probability tables लेती हैं, अक्सर shape से जुड़ी अर्थवत्ता को केवल array के आयामों से नहीं, बल्कि कंटेनर प्रकारों के जरिए व्यक्त करती हैं। यहां सूची initializer को conditional distributions की अपेक्षित संरचना बताती है। इस अनुबंध का पालन करने से पेचीदा runtime errors से बचाव होता है और आगे की क्रियाएं इच्छित तरीके से चलती हैं।

निष्कर्ष

यदि ConditionalCategorical को एक अकेली NumPy array देने पर error आता है, तो probs को arrays की सूची के रूप में दें और n_categories में भी वही संरचना दर्शाएं। यह छोटा सा बदलाव आपके इनपुट को constructor की अपेक्षाओं के अनुरूप लाता है और मॉडल सेटअप को सरल और पूर्वानुमेय बनाए रखता है।

यह लेख StackOverflow के एक प्रश्न (लेखक: Isaac A) और p011yr011n द्वारा दिए गए उत्तर पर आधारित है।