रोटेशन कोण के परिधिकरण प्रतिगमन


15

मान लीजिए कि मेरे पास एक तीर की ऊपर-नीचे की तस्वीर है, और मैं उस तीर की भविष्यवाणी करना चाहता हूं जिसे यह तीर बनाता है। इस बीच होगी और 360 डिग्री, या के बीच 0 और 2 π । समस्या यह है कि यह लक्ष्य गोलाकार है, 0 और 360 डिग्री बिल्कुल एक ही है जो कि एक व्युत्क्रमानुपाती है जिसे मैं अपने लक्ष्य में शामिल करना चाहूंगा, जिसे सामान्यीकरण में महत्वपूर्ण मदद करनी चाहिए (यह मेरी धारणा है)। समस्या यह है कि मुझे इसे हल करने का एक साफ तरीका दिखाई नहीं देता है, क्या कोई कागजात हैं जो इस समस्या (या इसी तरह) से निपटने की कोशिश करते हैं? मेरे पास उनके संभावित पतन के साथ कुछ विचार हैं:036002π0360

  • एक अवग्रह या tanh सक्रियण का प्रयोग करें, (करने के लिए इसे पैमाने पर रेंज और नुकसान समारोह में परिपत्र संपत्ति को शामिल। मुझे लगता है कि यह काफी कठिन होगा, क्योंकि अगर यह सीमा पर है (सबसे खराब भविष्यवाणी) तो केवल एक छोटा सा शोर एक तरह से या दूसरे पर जाने के लिए भार को धक्का देगा। इसके अलावा, की सीमा के करीब मान 0 और 2 π क्योंकि पूर्ण सक्रियण से पहले मूल्य अनंत के करीब होने की आवश्यकता होगी और अधिक तक पहुँचने के लिए कठिन हो जाएगा।0,2π)02π

  • दो मूल्यों के लिए, एक और वाईxy मान और इन दो मूल्यों को बनाने वाले कोण के आधार पर नुकसान की गणना करें। मुझे लगता है कि इसकी क्षमता अधिक है लेकिन इस सदिश का मान अनबाउंड है, जो संख्यात्मक अस्थिरता पैदा कर सकता है और प्रशिक्षण के दौरान ब्लो अप या 0 तक जा सकता है। इस मानक को 1 से बहुत दूर जाने से रोकने के लिए कुछ अजीब नियमित उपयोग करके संभावित रूप से इसे हल किया जा सकता है।

अन्य विकल्प साइन और कोसाइन फ़ंक्शंस के साथ कुछ कर रहे होंगे लेकिन मुझे इस तथ्य की तरह लगता है कि एक ही आउटपुट के लिए कई प्री-एक्टीवेशन मैप भी अनुकूलन और सामान्यीकरण को बहुत मुश्किल बना देंगे।


ईमानदारी से मुझे लगता है कि कुल रोटेशन की भविष्यवाणी करना आसान हो जाएगा और आपको बेहतर परिणाम मिलेंगे। आप से मैप कर सकते हैं जैसे के लिए π तथ्य यदि आप चाहते हैं के बाद। इकाई चक्र गुणा के बाद अनिवार्य रूप से भविष्यवाणी करने के लिए कोशिश कर रहा है पर कोण भविष्यवाणी करने के लिए कोशिश कर रहा है शेष से विभाजित होने के बाद 2 π , और मैं नहीं देख सकते हैं कि कैसे समग्र परिमाण की भविष्यवाणी और उसके बाद के गुणकों बंद घटाकर की तुलना में आसान हो जाएगा 2 π3ππ2π2π
टॉम

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

@tom उस दृष्टिकोण के बारे में बात यह है कि अनंत पूर्व सक्रियण हैं जो एक ही कोण पर मैप करते हैं जबकि उनके पास कोई चीज नहीं है। एक सकारात्मक x1 हमेशा एक -1/2 के बीच एक कोण को संदर्भित करता है जबकि और 1 \ 2 π । और Emre, मैं कुछ समूह सिद्धांत के माध्यम से अपना काम करूंगा, इसने मुझे हमेशा दिलचस्पी दी है इसलिए ML और समूह सिद्धांत का संयोजन मुझे अपील करेगाππ
Jan van der Vegt

जवाबों:


15

दूसरा तरीका, और y = s i n ( α ) की भविष्यवाणी करना पूरी तरह से ठीक है।एक्स=सीरों(α)y=रोंमैंn(α)

हां, अनुमानित वेक्टर का मान 1 के पास होने की गारंटी नहीं है । लेकिन यह उड़ा देने की संभावना नहीं है, खासकर यदि आप सिग्मॉइड सक्रियण फ़ंक्शन का उपयोग करते हैं (जो कि वे प्रकृति से बंधे हैं) और / या अपने मॉडल को अच्छी तरह से नियमित करते हैं। आपके मॉडल को एक बड़े मूल्य की भविष्यवाणी क्यों करनी चाहिए, यदि सभी प्रशिक्षण नमूने [ - 1 , 1 ] में थे ?(एक्स,y)1[-1,1]

(x,y)(0,0)(x,y) के । वास्तव में, 0 के करीब एक मानदंड का अर्थ है कि आपका मॉडल सुनिश्चित नहीं है कि सही दिशा कहां है।

यहाँ पाइथन में एक छोटा सा उदाहरण दिया गया है जो दर्शाता है कि पाप और कोस का अनुमान लगाने से बेहतर है कि सीधे कोण का अनुमान लगाया जाए:

# predicting the angle (in radians)
import numpy as np
from sklearn.neural_network import MLPRegressor
from sklearn.model_selection import cross_val_predict
from sklearn.metrics import r2_score
# generate toy data
np.random.seed(1)
X = np.random.normal(size=(100, 2))
y = np.arctan2(np.dot(X, [1,2]), np.dot(X, [3,0.4]))
# simple prediction
model = MLPRegressor(random_state=42, activation='tanh', max_iter=10000)
y_simple_pred = cross_val_predict(model, X, y)
# transformed prediction
joint = cross_val_predict(model, X, np.column_stack([np.sin(y), np.cos(y)]))
y_trig_pred = np.arctan2(joint[:,0], joint[:,1])
# compare
def align(y_true, y_pred):
    """ Add or remove 2*pi to predicted angle to minimize difference from GT"""
    y_pred = y_pred.copy()
    y_pred[y_true-y_pred >  np.pi] += np.pi*2
    y_pred[y_true-y_pred < -np.pi] -= np.pi*2
    return y_pred
print(r2_score(y, align(y, y_simple_pred))) # R^2 about 0.57
print(r2_score(y, align(y, y_trig_pred)))   # R^2 about 0.99

आप भविष्यवाणी पर जा सकते हैं और यह देख सकते हैं कि साइन-कोसाइन मॉडल की भविष्यवाणियां लगभग सही हैं, हालांकि कुछ और अंशांकन की आवश्यकता हो सकती है:

import matplotlib.pyplot as plt
plt.figure(figsize=(12, 3))
plt.subplot(1,4,1)
plt.scatter(X[:,0], X[:,1], c=y)
plt.title('Data (y=color)'); plt.xlabel('x1'); plt.ylabel('x2')
plt.subplot(1,4,2)
plt.scatter(y_simple_pred, y)
plt.title('Direct model'); plt.xlabel('prediction'); plt.ylabel('actual')
plt.subplot(1,4,3)
plt.scatter(y_trig_pred, y)
plt.title('Sine-cosine model'); plt.xlabel('prediction'); plt.ylabel('actual')
plt.subplot(1,4,4)
plt.scatter(joint[:,0], joint[:,1], s=5)
plt.title('Predicted sin and cos'); plt.xlabel('cos'); plt.ylabel('sin')
plt.tight_layout();

यहाँ छवि विवरण दर्ज करें

πN2αcos(α)sin(α)z=sin(α+π4)w=cos(α+π4) , क्रमशः 45 ° और 135 ° के पास मॉडल को लगभग रैखिक बनाने के लिए। इस मामले में, हालांकि, मूल कोण को बहाल करना इतना स्पष्ट नहीं है।

(x,y)(z,w)(x,y)arctan2


यह एकदम सही है, बहुत बहुत धन्यवाद। मैं इसे और अधिक
देखूंगा

2

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

ध्रुवीय निर्देशांक के साथ काम करना जारी रखने के लिए मैंने जो वर्कअराउंड पाया है वह MATLAB में एंगडिफ () फ़ंक्शन का उपयोग करके कोण अंतर की गणना करने के लिए एक कस्टम त्रुटि फ़ंक्शन बनाने और सामान्य रूप से परिमाण अंतर है।

यह फ़ंक्शन -pi और pi के बीच के अंतर के लिए '0' लौटाता है। यहाँ Mathworks वेबसाइट पर फ़ंक्शन समर्थन पृष्ठ का लिंक दिया गया है।

https://www.mathworks.com/help/robotics/ref/angdiff.html

यदि आप सिग्मॉइड सक्रियण का उपयोग कर रहे हैं और आपके एंगल्स डेटा को [0,1] के बीच सामान्यीकृत किया जाता है, तो आपको एंगडिफ () फ़ंक्शन का उपयोग करने से पहले इसे [-पी, पीआई] रेंज में वापस कर देना चाहिए और फिर त्रुटि को [0,1] पर वापस कर देना चाहिए। ] बैकप्रोपैजेशन प्रक्रिया के लिए सीमा।

इसके अलावा, पायथन में समान कार्य होगा:

import numpy as np


def angdiff(a, b):
    delta = np.arctan2(np.sin(b-a), np.cos(b-a))
    delta = np.around(delta, 4)  # Since np.sin(pi) result is 1.22e-16
    delta += 0.  # Since np.around return -0.
    return delta


pi = np.pi
a = np.asarray([pi/2, 3*pi/4, 0])
b = np.asarray([pi, pi/2, -pi])

print(angdiff(a, b))
print(angdiff(pi, -pi))
print(angdiff(-pi, pi))

यह MATLAB फ़ंक्शन के समान परिणाम देता है और सरणियों के साथ भी काम करता है:

[ 1.5708 -0.7854 -3.1416]
0.0
0.0

उम्मीद है की वो मदद करदे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.