机器学习中的周期性数据(如度数角度-> 179与-179不同)

8
我正在使用Python进行核密度估计和高斯混合模型,以评估多维数据样本的可能性排名。每个数据都是一个角度,但我不确定如何处理角度数据的周期性问题,以便用于机器学习。
首先,我将所有负角度都加上360度,使得所有负角度变成了正角度。例如,-179度变成了181度。我认为这很好地解决了-179度等与179度相比没有明显差异的情况。但它无法解决359度与1度相似的情况。
我想到一种方法来解决这个问题,即同时保留负值和负值+360,并使用两者中的最小值,但这需要修改机器学习算法。
是否有好的预处理解决方案?是否有内置于scipy或scikit的处理方法?
谢谢!

当你说“每个数据都是一个角度”时,你的意思是输入特征和目标变量(用于回归)都是吗? - ogrisel
2
我不是scipy或scikit的专家,但你可以尝试用cos(angle)和sin(angle)替换角度。 - Tal Darom
@ogrisel,是的,我的意思是所有的输入特征和目标变量都是角度。 - calben
@TalDarom,我不明白这如何解决数据的周期性问题。你能详细说明一下吗? - calben
1
它可以解决问题,因为cos和sin是角度的周期函数。例如,您可以使用这些值之间的欧几里得距离(或任何其他标准度量)。 - Tal Darom
4个回答

13

正如Tal Darom在评论中写道,您可以在将函数参数标准化为弧度后,用cos(x)sin(x)替换每个周期性特征x。这样可以解决359 ≈ 1的问题:

>>> def fromdeg(d):
...     r = d * np.pi / 180.
...     return np.array([np.cos(r), np.sin(r)])
... 
>>> np.linalg.norm(fromdeg(1) - fromdeg(359))
0.03490481287456796
>>> np.linalg.norm(fromdeg(1) - fromdeg(180))
1.9999238461283426
>>> np.linalg.norm(fromdeg(90) - fromdeg(270))
2.0

norm(a - b) 是向量 ab 之间的欧几里得距离。通过简单的绘图,或者意识到这些(cos,sin)对实际上是单位圆上的坐标,您可以验证这个距离在原始角度相差180°时,两个这些(cos,sin)向量之间最大(点积最小)。


抱歉,我不确定我理解这个解决方案。它如何作为预处理步骤应用于数据集中的每个样本? - calben
1
@Kylamus:是的,它是特征提取的一部分。 - Fred Foo

2
一个替代已发布的方法的选择是使用Von Mises distribution来模拟角度变量。
这个分布似乎被scipy支持,所以将其适配到混合模型中应该不会太困难。

0

另一种更简单的方法是使用时间作为角度测量而不是度数测量(不是DMS)。由于许多分析软件将时间作为数据类型,因此您可以利用其周期性来完成工作。

但请记住,您需要将360度缩放到24小时。


-3

您需要使用 mod 函数。在 Python 中,这将是(ang2-ang1)%360,但是使用 Scipy 似乎可以使用numpy.mod() - 参见文档


6
这远远不能解决这个问题。OP并不是在问“如何计算两个角度之间的差”,这个问题涉及完全不同的方面,更深更难。这不是一个有关函数或实现问题的问题。它是一个关于在一类聚类模型中使用自定义度量的概念问题。 - lejlot
@lejlot - 大约三分之二的问题似乎是关于如何计算角度差的,甚至标题的一半也是。我假设那就是问题所在,他可以处理其他的东西。但显然我误解了。 - neil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接