我正在使用Python进行内核密度估计和高斯混合模型来对多维数据样本的可能性进行排序.每个数据都是一个角度,我不知道如何处理机器学习的角度数据的周期性.
首先,我通过向它们添加360来移除所有负角度,因此所有负面的角度变为正,-179变为181.我相信这优雅地处理-179的情况,类似的情况与179并没有显着差异相似,但它确实不处理像359这样的实例与1不同.
我想到的解决问题的一种方法是保持负值和负值+ 360值并使用两者中的最小值,但这需要修改机器学习算法.
是否有一个很好的预处理解决方案来解决这个问题?什么内置为scipy或scikit?
谢谢!
正如Tal Darom在评论中所写,你可以x
用两个特征替换每个周期特征,cos(x)
并sin(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)
是矢量a
和矢量之间良好的欧几里德距离b
.正如您可以使用简单的绘图验证,或者通过意识到这些(cos,sin)对实际上是单位圆上的坐标,这个距离是这两个(cos,sin)向量之间的最大值(和点积最小)当原始角度相差180°时.