我将尝试对包含其他功能的数据集进行kNN分类,该数据集称为“时间”。在申请的上下文中,星期一23:58和星期二00:02一样接近星期五00:04。重要的是时钟表盘上的时针角度。如果不是那个圆形特征,那么欧氏距离就可以了。
到目前为止,我知道class::knn()
和caret::knn3()
。但是,我没有找到一种方法来为它们提供我自己的自定义距离度量,甚至是预先计算的距离矩阵。你知道这样做的方法吗?
可能的替代方案是数据准备中的额外步骤,即用两个线性替换圆形特征(角度θ变为点(cosθ,sinθ))或者在00:00复制训练集中的数据点导致边界消失的边界:https://stats.stackexchange.com/questions/51908/nearest-neighbor-algorithm-for-circular-dimensions但是,如果可能的话,我宁愿避免将一个维度替换为二维并创建数据点的副本。
另一种方法是自己计算距离矩阵然后实现kNN。这听起来非常像重新发明轮子。
我正在寻找一种方法来插入我自己的自定义距离指标的另一个原因如下。虽然周二15:01至周三15:02点之间的距离是1分钟,但周日23:00 UTC(货币兑换市场开放)被视为距离任何其他日子的23:00“远”。其他特殊情况也可能出现。
答案 0 :(得分:0)
Afaik knn
的工作方式略有不同。它是一个基于实例的方法,意味着实际模型由实例组成。对于每组测试样本,在计算距离矩阵< - 这是你在哪里时,重新计算距离矩阵?
您不能仅通过距离矩阵来定义knn。至少我不知道一种方法,如果给定一个测试向量,你可以在没有相应的火车矢量集的情况下计算距离。
如果您有距离矩阵,请查看以下类似问题 Find K nearest neighbors, starting from a distance matrix
但是文档明确说:
用法
k.nearest.neighbors(i,distance_matrix,k = 5)
参数
我来自数字类,是distance_matrix的一行。
distance_matrix是一个nxn矩阵。
k来自数字类,表示函数将返回的neigbours数。
这个imho类似于:
apply(dm, 1, function(d) "majority vote for labels[order(d) < k]")
鉴于你有一个距离矩阵,你已经重新发明了knn
的80%