周期性数据与机器学习(如角度 -> 179与-179的差异为2)

我在使用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)是向量ab之间的欧几里得距离。正如你可以通过简单绘图验证,或者通过意识到这些(cos,sin)对实际上是单位圆上的坐标,这表明当原始角度相差180°时,这些(cos,sin)向量之间的距离最大(点积最小)。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注