【问题标题】:Is it possible to use complex numbers as target labels in scikit learn?是否可以在 scikit learn 中使用复数作为目标标签?
【发布时间】:2026-01-23 15:15:02
【问题描述】:

我正在尝试使用 sklearn 来预测一个表示旋转的变量。由于在旋转极端情况下从 -pi 到 pi 的不幸跳跃,我认为更好的方法是使用复数作为目标。这样,从 1+0.01j 到 1-0.01j 的错误就不会那么具有破坏性了。

我找不到任何描述 sklearn 是否支持将复数作为分类器目标的文档。从理论上讲,距离度量应该可以正常工作,因此它至少应该适用于某些回归算法。

谁能建议我如何让回归算法以复数为目标进行操作?

【问题讨论】:

    标签: python numpy scipy scikit-learn


    【解决方案1】:

    好问题。如何将角度转换为一对标签,即。 x 和 y 坐标。这些是角度的连续函数(cos 和 sin)。您可以将单独的 x 和 y 分类器的结果组合成一个角度吗? $\theta = \sign(x) \arctan(y/x)$。但是,如果两个分类器都返回接近零的数字,则该结果将不稳定。

    【讨论】:

    • 仅供参考,numpy 有一个名为“arctan2”的便捷函数,它会在给定 x 和 y 偏移的情况下返回带有正确象限的 theta。
    【解决方案2】:

    多个回归器支持多维回归目标。只需将复数视为 2d 点。

    【讨论】:

    • 为了让 andy 的回答更清楚,我所知道的任何 sklearn 回归器都不会接受目标变量(也不是输入变量)中的复数。假设 32 或 64 位浮点数。不过,复变量的实部和虚部的显式 2D 浮点编码应该可以工作。
    【解决方案3】:

    到目前为止,我发现大多数分类器,如线性回归器,都会自动将复数转换为实部。

    但是,kNN 和 RadiusNN 回归器工作良好 - 因为它们对相邻标签进行加权平均,因此可以优雅地处理复数。

    使用多目标分类器是另一种选择,但是我不想将 x 和 y 方向解耦,因为当两个结果都接近 0 时,这可能会导致不稳定的解决方案,正如 Panic 上校提到的那样。

    我将尝试其他具有复杂目标的分类器并在此处更新结果。

    【讨论】:

    • 确实,正如 Panic 上校所说,使用复杂目标的范数和相位,使用 2D 浮点编码而不是实数和虚数部分可能对您的问题更有意义。
    最近更新 更多