회전 각도의 매개 변수화 회귀


15

화살표의 하향식 그림이 있고이 화살표가 이루는 각도를 예측하려고합니다. 이것은 도와 도 사이 또는 과 사이 입니다. 문제는이 목표가 원형이며 및 도가 정확히 동일하여 내 목표에 포함하려는 불균형이며 일반화에 크게 도움이되어야한다는 것입니다 (이것은 내 가정입니다). 문제는이 문제를 해결하는 깨끗한 방법이 보이지 않는다는 것입니다.이 문제 (또는 유사한 문제)를 해결하려고하는 논문이 있습니까? 잠재적 인 단점이있는 아이디어가 있습니다.036002π0360

  • 시그 모이 드 또는 탄 활성화를 사용하여 ( 범위로 스케일링 하고 손실 함수에 순환 특성을 통합하십시오. 나는 이것이 경계에 있다면 (최악의 예측) 약간의 잡음만이 가중치를 어느쪽으로 또는 다른쪽으로 이동시킬 것이기 때문에 이것은 상당히 어려울 것이라고 생각합니다. 또한 절대 사전 활성화 값이 무한대에 가까워 야하기 때문에 과 의 경계에 가까운 값 은 도달하기가 더 어려울 수 있습니다.0,2π)02π

  • 와 값의 두 값으로 회귀하고이 두 값 의 각도에 따라 손실을 계산합니다. 나는 이것이 더 많은 잠재력을 가지고 있다고 생각하지만이 벡터의 규범은 한계가 없으며, 이는 숫자의 불안정성을 초래할 수 있으며 훈련 중 폭발 또는 0으로 이어질 수 있습니다. 이상한 규범을 사용 하여이 규범이 1에서 너무 멀어지지 않도록 잠재적으로 해결할 수 있습니다.yxy

다른 옵션은 사인 및 코사인 함수로 무언가를 수행하는 것이지만 여러 사전 활성화가 동일한 출력에 매핑되면 최적화 및 일반화가 매우 어려워진다는 느낌이 듭니다.


솔직히 회전 을 예측하는 것이 더 쉬울 것이며 더 나은 결과를 얻을 수 있다고 생각 합니다. 당신은에서 매핑 할 수 있습니다 예를 들어, π 당신이 원하는 경우 사후. 본질적으로 예측하기 위해 노력하고있다 곱셈 후 단위 원의 각도를 예측하기 위해 노력 나머지 로 나누어 후 2 π를 , 나는 그 전체 크기를 예측하고 다음의 배수 오프 뺀 것보다 쉬울 것 볼 수 없습니다 2 π를 . 3ππ2π2π
tom

1
옵션은 다음과 같습니다. a) 주기성 측면 : 시그 모이 드 활성화 기능을 사용하여 각도의 사인과 코사인을 추정합니다. b) 커널을 통해 손실 함수에 대칭 통합 과 같이 . 로테이션 그룹변형 그룹 학습에 관한 Taco Cohen의 논문에 대해 읽어보십시오 . 불행히도 나는 그룹 이론에 대해 잘 모르므로 더 많은 것을 도울 수 없습니다.
Emre

@tom 그 접근법에 대한 것은 공통점이 없지만 동일한 각도로 매핑되는 무한한 사전 활성화가 있다는 것입니다. 양의 x1은 항상 -1/2 ~ 1 \ 2 π 사이의 각도를 나타냅니다 . 그리고 Emre, 나는 어떤 그룹 이론을 통해 나아갈 것입니다. 그것은 항상 저에게 관심이 있었으므로 ML과 그룹 이론의 조합이 저에게 호소력을 발휘할 것입니다ππ
Jan van der Vegt

답변:


15

y = s i n ( α )를 예측하는 두 번째 방법 은 완전히 괜찮습니다.엑스=영형에스(α)와이=에스나는(α)

예, 예측 된 벡터 의 표준은 1 근처에 있다고 보장되지 않습니다 . 그러나 특히 시그 모이 드 활성화 기능 (특성에 의해 제한됨)을 사용하거나 모델을 잘 정규화하면 폭발하지 않을 것입니다. 모든 훈련 샘플에 있다면 왜 모델은 큰 값을 예측한다 [ - 1 , 1 ] ?(엑스,와이)1[1,1]

또 다른 측면은 벡터, 에 너무 가까이에 ( 0 , 0 ) . 이것은 때때로 발생할 수 있으며 실제로 잘못된 각도를 예측할 수 있습니다. 그러나 모형의 이점으로 보일 수 있습니다 . 모형 의 신뢰도( x , y ) 로 간주 할 수 있습니다 . 실제로 0에 가까운 표준은 모델이 올바른 방향인지 확실하지 않다는 것을 의미합니다.(엑스,와이)(0,0)(엑스,와이)

다음은 파이썬에서 작은 예를 보여줍니다.이 예제에서는 죄와 cos를 예측하는 것이 좋고 각도를 직접 예측하는 것이 좋습니다.

# 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();

여기에 이미지 설명을 입력하십시오

업데이트 . 내비게이션 엔지니어는 각도가 가까울 때 이러한 모델이 가장 정확하다는 것을 알았습니다.π2α코사인(α)(α)=(α+π4)=코사인(α+π4)

(엑스,와이)(,)(엑스,와이)arctan2


정말 고마워요. 더 자세히 살펴 보겠습니다. 더 많은 차원으로 확장해야합니다.
Jan van der Vegt

2

데카르트 좌표 작업은 위에서 언급 한대로 잘 작동합니다. 그러나 필자의 의견으로는 극좌표 데이터를 직교로 변환하면 원래 데이터에 없었던 X와 Y 좌표 사이에 종속성이 생성됩니다. 예를 들어 로봇의 경로 결정 모델은 직교 좌표보다 극좌표에서 더 직관적입니다. 각도와 크기 사이의 극좌표에서 로봇 속도 벡터의 의존성은 존재하지 않거나 직교 좌표에서의 의존성과 다를 수 있습니다.

극좌표 작업을 계속하는 것으로 밝혀진 해결 방법은 MATLAB의 angdiff () 함수를 사용하여 각도 차이와 평소와 같이 크기 차이를 계산하는 사용자 정의 오류 함수를 만드는 것입니다.

이 함수는 -pi와 pi의 차이에 대해 '0'을 반환합니다. 다음은 Mathworks 웹 사이트의 기능 지원 페이지에 대한 링크입니다.

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

Sigmoid 활성화를 사용하고 각도 데이터가 [0,1] 사이에서 표준화 된 경우 angdiff () 함수를 사용하기 전에 [-pi, pi] 범위로 되 돌린 다음 오류를 [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

희망이 도움이됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.