为什么在角度数据的情况下均方误差不起作用?

机器算法验证 神经网络 多重回归 错误 循环统计
2022-03-13 09:28:57

假设,以下是数据集中用于解决回归问题的前几行:

H   7.042 5.781 5.399  -9.118   5.488  7.470     0 0 0 1 0 1 1 3 0 0 0 1 0 0 0 0 0 0 0 0    2.144    
H   5.781 5.399 5.373   5.488   5.166  6.452     0 1 1 3 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0    2.268
H   5.399 5.373 5.423   5.166   4.852  6.069     0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0    2.101 
H   5.373 5.423 5.247   4.852   5.164  6.197     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0    2.222 
H   5.423 5.247 5.485   5.164   4.943  6.434     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0    2.416
C   5.247 5.485 6.675   4.943   8.103  8.264     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0    3.028
C   5.485 6.675 6.372   8.103  -9.152  9.047     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0    -1.235
C   6.675 6.372 5.669  -9.152  -8.536 11.954     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0    -0.953 
H   6.372 5.669 5.304  -8.536   5.433  6.703     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0    2.233 
H   5.669 5.304 5.461   5.433   4.924  6.407     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0    2.313

最左边的列是类数据。最右边的列是 Y 数据。其余的特征都是角度数据。

.

我对该模型的初始设置如下:

def create_model(n_hidden_1, n_hidden_2, num_features):
    # create the model
    model = Sequential()
    model.add(tf.keras.layers.InputLayer(input_shape=(num_features,)))
    model.add(tf.keras.layers.Dense(n_hidden_1, activation='relu'))
    model.add(tf.keras.layers.Dense(n_hidden_2, activation='relu'))
    model.add(tf.keras.layers.Dense(1))

    # instantiate the optimizer
    opt = keras.optimizers.Adam(learning_rate=LEARNING_RATE)

    # compile the model
    model.compile(
         loss="mean_squared_error",
         optimizer=opt,
         metrics=["mean_squared_error"]
    )

    # return model
    return model

这个模型没有产生正确的结果。预期的输出应该在左右。但是,当前的设置产生了大约这些是弧度值。0.200.80

有人告诉我,MSE 在角度数据的情况下不起作用。所以,我需要使用自定义输出层和自定义错误函数。

为什么在角度数据的情况下均方误差不起作用?

我该如何解决这个问题?

1个回答

直接在角度值上使用 MSE 的问题是,值在圆上可能非常接近,但会产生很大的平方误差。例如,359 度和 1 度在一个圆上非常接近,但就平方差而言却相距甚远。

为了纠正这个问题,您应该使用一个距离度量来反映您正在使用角度这一事实。

圆上两点之间的欧几里得距离是两点之间的弦长。因此,一个简单直接的距离示例将角度视为单位圆上的一个点,然后以普通方式计算欧几里得距离。α(cosα,sinα)

初等三角恒等式简化了表达式。

dE2(θ,ϕ)=(cosθcosϕ)2+(sinθsinϕ)2=cos2θ2cosθcosϕ+cos2ϕ+sin2θ2sinθsinϕ+sin2ϕdE(θ,ϕ)=22cos(θϕ)

通过检查,我们可以看到非常接近的角度有接近 1,因此距离接近 0。另一方面,相距很远的角度有接近 0,所以距离接近 1。这满足了我们直观的距离概念。cos(θϕ)cos(θϕ)

当然,这不是唯一的选择。在这些相关线程中讨论了这个距离和一些替代方案: