วิธีที่สองการทำนายและy = s i n ( α )ก็โอเคโดยสิ้นเชิงx = c o s ( α )Y= s i n ( α )
ใช่บรรทัดฐานของการคาดการณ์เวกเตอร์ไม่รับประกันว่าจะได้อยู่ใกล้1 แต่มันก็ไม่น่าจะเกิดขึ้นโดยเฉพาะอย่างยิ่งถ้าคุณใช้ฟังก์ชั่นการเปิดใช้งาน sigmoid (ซึ่งถูก จำกัด โดยธรรมชาติ) และ / หรือทำให้โมเดลของคุณเป็นปกติ ทำไมรูปแบบของคุณควรคาดการณ์ค่าขนาดใหญ่หากทุกตัวอย่างการฝึกอบรมอยู่ใน[ - 1 , 1 ] ?(x , y)1[ - 1 , 1 ]
อีกด้านหนึ่งเป็นเวกเตอร์ใกล้เกินไปที่( 0 , 0 ) บางครั้งสิ่งนี้อาจเกิดขึ้นและอาจส่งผลในการทำนายมุมที่ผิด แต่มันอาจถูกมองว่าเป็นประโยชน์ของแบบจำลองของคุณ - คุณสามารถพิจารณาบรรทัดฐานของ( x , y )เป็นเครื่องวัดความมั่นใจของแบบจำลองของคุณ จริง ๆ แล้วค่ามาตรฐานใกล้กับ 0 หมายความว่าแบบจำลองของคุณไม่แน่ใจว่าทิศทางที่ถูกต้องอยู่ที่ใด( x , y)( 0 , 0 )( x , y)
นี่คือตัวอย่างเล็ก ๆ ใน Python ซึ่งแสดงว่าเป็นการดีกว่าที่จะทำนายบาปและ 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αcos( α )บาป( α )Z= บาป(α + π4)w = cos( α + π4)
( x , y)( z, w )( x , y)arctan2