및 y = s i n ( α )를 예측하는 두 번째 방법 은 완전히 괜찮습니다.x = c o s ( α )와이= s i n ( α )
예, 예측 된 벡터 의 표준은 1 근처에 있다고 보장되지 않습니다 . 그러나 특히 시그 모이 드 활성화 기능 (특성에 의해 제한됨)을 사용하거나 모델을 잘 정규화하면 폭발하지 않을 것입니다. 모든 훈련 샘플에 있다면 왜 모델은 큰 값을 예측한다 [ - 1 , 1 ] ?( x , y)1[ − 1 , 1 ]
또 다른 측면은 벡터, 에 너무 가까이에 ( 0 , 0 ) . 이것은 때때로 발생할 수 있으며 실제로 잘못된 각도를 예측할 수 있습니다. 그러나 모형의 이점으로 보일 수 있습니다 . 모형 의 신뢰도 를 ( x , y ) 로 간주 할 수 있습니다 . 실제로 0에 가까운 표준은 모델이 올바른 방향인지 확실하지 않다는 것을 의미합니다.( x , y)( 0 , 0 )( x , y)
다음은 파이썬에서 작은 예를 보여줍니다.이 예제에서는 죄와 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)w = 코스( α + π4)
( x , y)( z, w )( x , y)arctan2