2012-02-11 24 views
5

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

कंप्यूट:

for(Point3D p3d : pointCloud) { 
    pos = p3d.getPosition(); 
    fSumX += pos[0]; 
    fSumY += pos[1]; 
    fSumZ += pos[2]; 
    fSumXX += pos[0]*pos[0]; 
    fSumXY += pos[0]*pos[1]; 
    fSumXZ += pos[0]*pos[2]; 
    fSumYY += pos[1]*pos[1]; 
    fSumYZ += pos[1]*pos[2]; 
} 

से मैट्रिक्स बनाने:

double[][] A = { 
    {fSumXX, fSumXY, fSumX}, 
    {fSumXY, fSumYY, fSumY}, 
    {fSumX, fSumY, pointCloud.size()} 
}; 

double[][] B = { 
    {fSumXZ}, 
    {fSumYZ}, 
    {fSumZ} 
}; 
Ax = b हल से

और 3

वर्तमान एल्गोरिथ्म (वजन) के बिना इस तरह दिखता है समाधान के घटक फिट सादे के गुणांक हैं ...

एस ओ, क्या आप कृपया वजन कम करने के लिए इसे संशोधित करने में मेरी सहायता कर सकते हैं? धन्यवाद!

+4

FYI करें - आप अंक के बहुत सारे (> कहते हैं कि 20) और/हो सकता है या निर्देशांक अगर एक बड़ी ऑफसेट, कभी आंकड़ों की गणना नहीं है जिस तरह से आप कर रहे हैं (कच्चे स्थिति के वर्गों का रकम लेने के द्वारा) - इसमें संख्यात्मक त्रुटियों की खराब संवेदनशीलता है। कम से कम, आप पहले एक्स/वाई/जेड निर्देशांक के औसत मूल्य को घटा सकते हैं, फिर अपनी प्रसंस्करण करें, फिर अंत में ऑफसेट को वापस जोड़ें। ऐसा करने के अन्य एल्गोरिदम-विशिष्ट तरीके हैं, लेकिन मुझे समझ में नहीं आता कि आपका एल्गोरिदम कम से कम वर्गों का उपयोग कैसे करता है, इसलिए इससे अधिक मदद नहीं मिल सकती है। –

+0

ऑफ़सेट द्वारा आपका क्या मतलब है? (क्षमा करें, इस संदर्भ में इसे समझ में नहीं आता)। –

+2

त्वरित उदाहरण: अंक पी 1 = (10001, 10002, 10003), पी 2 = (10005, 10006, 10007), पी 3 = (1000 9, 10004, 10008)। इनका मूल्य है (10005, 10004, 10006)। इसलिए आप इस राशि के विपरीत बिंदु निर्देशांक को ऑफ़सेट (अनुवाद) पी 1 '(-4, -2, -3), पी 2' = (0,2,1), पी 3 '= (4,0, 2)। फिर अपने गणित करें, फिर ऑफ़सेट में वापस जोड़ें। –

उत्तर

10

अंतर्ज्ञान

एक विमान सामान्य n द्वारा परिभाषित किया गया और विमान p का अनुसरण करता है पर एक बिंदु पर एक बिंदु x: n.(x - p) = 0। यदि कोई बिंदु y विमान पर नहीं है, n.(y -p) शून्य के बराबर नहीं होगा, इसलिए लागत को परिभाषित करने का एक उपयोगी तरीका |n.(y - p)|^2 है। यह विमान से y बिंदु की चौकोर दूरी है।

बराबर वजन के साथ, आप एक n जब अंक से अधिक संक्षेप कि कुल वर्ग त्रुटि को कम करता है पता लगाना चाहते हैं:

f(n) = sum_i | n.(x_i - p) |^2 

अब इस मान लिया गया है कि हम कुछ बिंदु p है कि विमान पर स्थित है पता है। हम आसानी से एक को सेंट्रॉइड के रूप में गणना कर सकते हैं, जो बिंदु बिंदु में बिंदुओं का घटक-वार माध्यम है और हमेशा कम-स्क्वायर विमान में झूठ बोलता है।

समाधान

के एक मैट्रिक्स M जहां प्रत्येक पंक्ति ith बिंदु x_i शून्य से केन्द्रक c है परिभाषित करते हैं, हम कर सकते हैं फिर से लिखना:

f(n) = | M n |^2 

आप अपने आप को कि समझाने के लिए सक्षम होना चाहिए यह मैट्रिक्स गुणा संस्करण पिछले समीकरण पर योग के समान है।

फिर आप M की singular value decomposition ले जा सकते हैं, और n आप चाहते हैं तो M के अधिकार विलक्षण वेक्टर कि छोटी से छोटी विलक्षण मूल्य से मेल खाती है द्वारा दिया जाता है।

वजन आप बस प्रत्येक बिंदु के लिए एक वजन w_i परिभाषित करने की जरूरत को शामिल करने के लिए। c को अंक के भारित औसत के रूप में गणना करें, और sum_i | n.(x_i - c) |^2 से sum_i | w_i * n.(x_i - c) |^2 पर बदलें, और मैट्रिक्स M इसी तरह से करें। फिर पहले के रूप में हल करें।

+0

आप ठीक बाद में थे, यह अच्छी तरह से काम करता है। धन्यवाद! –

2

प्रत्येक योग में प्रत्येक शब्द को इसी वजन से गुणा करें। उदाहरण के लिए:

fSumZ += weight * pos[2]; 
fSumXX += weight * pos[0]*pos[0]; 

pointCloude.size() के बाद से सभी बिंदुओं के लिए 1 का योग है, यह सब वजन की राशि के साथ प्रतिस्थापित किया जाना चाहिए।

+0

मैंने सोचा कि इसे वजन से प्रत्येक शब्द को गुणा करने के लिए विचार किया जाना चाहिए, लेकिन मुझे यकीन नहीं था ... मैं इसे आजमाउंगा और वापस आऊंगा। धन्यवाद। –

0

कम से कम वर्ग त्रुटि गणना को फिर से परिभाषित करने से प्रारंभ करें। सूत्र त्रुटियों के वर्गों के योग को कम करने की कोशिश करता है। स्क्वायर त्रुटि को दो बिंदुओं के एक फ़ंक्शन से गुणा करें जो उनकी दूरी से कम हो जाती है। फिर स्क्वायर त्रुटियों के भारित योग को कम करने का प्रयास करें और उस से गुणांक प्राप्त करें।

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

  • कोई संबंधित समस्या नहीं^_^