Hồi quy tham số của góc quay


15

Giả sử tôi có một hình ảnh từ trên xuống của một mũi tên và tôi muốn dự đoán góc mà mũi tên này tạo ra. Điều này sẽ nằm trong khoảng từ đến độ hoặc từ đến . Vấn đề là mục tiêu này là hình tròn, và độ hoàn toàn giống nhau, đó là một bất biến mà tôi muốn kết hợp trong mục tiêu của mình, điều này sẽ giúp khái quát hóa đáng kể (đây là giả định của tôi). Vấn đề là tôi không thấy một cách giải quyết vấn đề này rõ ràng, có bất kỳ giấy tờ nào cố gắng giải quyết vấn đề này (hoặc những vấn đề tương tự) không? Tôi có một số ý tưởng với nhược điểm tiềm năng của họ:036002π0360

  • Sử dụng kích hoạt sigmoid hoặc tanh, chia tỷ lệ thành phạm vi ( và kết hợp thuộc tính hình tròn trong hàm mất. Tôi nghĩ rằng điều này sẽ thất bại khá khó khăn, bởi vì nếu nó ở biên giới (dự đoán tồi tệ nhất) chỉ một chút tiếng ồn sẽ đẩy trọng lượng đi theo cách này hay cách khác. Ngoài ra, các giá trị gần biên giới và sẽ khó tiếp cận hơn vì giá trị kích hoạt trước tuyệt đối sẽ cần phải gần với vô hạn.0,2π)02π

  • Hồi quy hai giá trị, giá trị và và tính toán tổn thất dựa trên góc mà hai giá trị này tạo ra. Tôi nghĩ rằng cái này có nhiều tiềm năng hơn nhưng tiêu chuẩn của vectơ này không bị ràng buộc, điều này có thể dẫn đến sự mất ổn định về số lượng và có thể dẫn đến nổ tung hoặc xuống 0 trong quá trình đào tạo. Điều này có khả năng có thể được giải quyết bằng cách sử dụng một số chương trình chính quy kỳ lạ để ngăn chặn định mức này đi quá xa so với 1.yxy

Các tùy chọn khác sẽ làm một cái gì đó với các hàm sin và cosine nhưng tôi cảm thấy thực tế là nhiều bản đồ kích hoạt trước cho cùng một đầu ra cũng sẽ khiến việc tối ưu hóa và khái quát hóa trở nên rất khó khăn.


Thành thật tôi nghĩ rằng cố gắng dự đoán tổng số vòng quay sẽ dễ dàng hơn và mang lại cho bạn kết quả tốt hơn. Bạn có thể ánh xạ từ ví dụ đến π sau khi thực tế nếu bạn muốn. Cố gắng dự đoán góc trên vòng tròn đơn vị sau khi nhân về cơ bản là cố gắng dự đoán phần còn lại sau khi chia cho 2 π và tôi không thể thấy điều đó sẽ dễ hơn dự đoán cường độ tổng thể và sau đó trừ đi bội số của 2 π . 3ππ2π2π
tom

1
Các tùy chọn là một) bước bên tính chu kỳ: ước tính sin và cos của góc bằng hàm kích hoạt sigmoid. b) kết hợp tính đối xứng vào hàm mất thông qua một hạt nhân như vậy . Đọc về các nhóm luân chuyểnluận án của Taco Cohen về việc học các nhóm chuyển đổi . Thật không may, tôi không am hiểu về lý thuyết nhóm nên tôi không thể giúp nhiều hơn nữa.
Emre

@tom Điều về cách tiếp cận đó là có những kích hoạt trước vô hạn ánh xạ tới cùng một góc trong khi chúng không có điểm chung. Trong khi x1 dương luôn đề cập đến một góc giữa -1/2 và 1 \ 2 π . Và Emre, tôi sẽ làm việc theo cách của mình thông qua một số lý thuyết nhóm, nó luôn khiến tôi quan tâm vì vậy sự kết hợp giữa ML và lý thuyết nhóm sẽ hấp dẫn tôiππ
Jan van der Vegt

Câu trả lời:


15

Cách thứ hai, dự đoán y = s i n ( α ) là hoàn toàn ổn.x=cos(α)y=sin(α)

Có, định mức của vectơ dự đoán không được bảo đảm là gần 1 . Nhưng nó không có khả năng nổ tung, đặc biệt nếu bạn sử dụng các chức năng kích hoạt sigmoid (bị ràng buộc bởi bản chất của chúng) và / hoặc thường xuyên hóa mô hình của bạn tốt. Tại sao mô hình của bạn phải dự đoán một giá trị lớn, nếu tất cả các mẫu đào tạo nằm trong [ - 1 , 1 ] ?(x,y)1[1,1]

Mặt khác là vectơ quá gần ( 0 , 0 ) . Điều này đôi khi có thể xảy ra, và thực sự có thể dẫn đến dự đoán các góc sai. Nhưng nó có thể được coi là một lợi ích của mô hình của bạn - bạn có thể coi định mức của ( x , y ) là thước đo độ tin cậy của mô hình của bạn. Thật vậy, một chỉ tiêu gần bằng 0 có nghĩa là mô hình của bạn không chắc chắn hướng đi đúng.(x,y)(0,0)(x,y)

Dưới đây là một ví dụ nhỏ trong Python cho thấy tốt hơn là dự đoán sin và cos, đó là dự đoán góc trực tiếp:

# 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

Bạn có thể tiếp tục và vẽ các dự đoán, để thấy rằng các dự đoán của mô hình sin-cos gần như chính xác, mặc dù có thể cần một số hiệu chỉnh thêm:

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

nhập mô tả hình ảnh ở đây

πN2αcos(α)tội(α)z= =tội(α+π4)w= =cos(α+π4)

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


Điều này là hoàn hảo, cảm ơn rất nhiều. Tôi sẽ xem xét nó nhiều hơn, tôi sẽ cần mở rộng nó ra nhiều chiều hơn
Jan van der Vegt

2

Làm việc với tọa độ Cartesian hoạt động tốt như đã đề cập ở trên. Tuy nhiên, theo tôi, việc chuyển đổi dữ liệu cực sang Cartesian tạo ra sự phụ thuộc giữa tọa độ X và Y vốn không có trong dữ liệu. Ví dụ, mô hình quyết định đường đi của robot trực quan hơn ở tọa độ cực so với Cartesian. Sự phụ thuộc của vectơ vận tốc của robot trong tọa độ cực giữa góc và độ lớn thậm chí có thể không tồn tại hoặc khác với sự phụ thuộc trong tọa độ Cartesian.

Một cách giải quyết mà tôi thấy là tiếp tục làm việc với tọa độ cực là tạo hàm lỗi tùy chỉnh để tính toán độ lệch góc bằng cách sử dụng hàm angdiff () trong MATLAB và độ chênh lệch cường độ như bình thường.

Hàm này trả về '0' cho chênh lệch giữa -pi và pi. Đây là một liên kết đến trang hỗ trợ chức năng trên trang web Mathworks.

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

Nếu bạn đang sử dụng kích hoạt Sigmoid và dữ liệu góc của bạn được chuẩn hóa giữa [0,1], bạn nên đưa nó trở lại phạm vi [-pi, pi] trước khi sử dụng hàm angdiff () và sau đó bình thường hóa lỗi trở lại [0,1 ] phạm vi cho quá trình backpropagation.

Ngoài ra, hàm tương đương trong Python sẽ là:

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))

Điều này trả về kết quả tương tự như hàm MATLAB và cũng hoạt động với các mảng:

[ 1.5708 -0.7854 -3.1416]
0.0
0.0

Mong rằng sẽ giúp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.