我正在设计一个异常检测系统。
构建此类系统有多种方法。我选择通过检测大多数样本共有的特征来实现系统的一个方面。我承认这种方法可能存在不足,但对于我的特定用例:(1) 知道新样本是否包含(或缺乏)大多数过去数据共有的特征就足以做出快速决策。(2) 我对这种方法能为数据提供的洞见感兴趣。
所以,问题是这样的:
考虑一个包含M个数据点的庞大数据集,每个数据点可以包含任意数量的{key:value}特征。我选择通过将数据中观察到的所有特征(所有唯一键的集合)分组来建模训练数据集,并将其设置为模型的特征空间。我通过为现有键设置其值,并为不包含的特征设置None来定义每个样本。
基于这个训练数据集,我想确定哪些特征在数据中反复出现;对于这些反复出现的特征,它们是否大多共享一个单一值。
我的问题是:
一个简单的解决方案是计算所有内容 – 对于N个特征中的每一个,计算值的分布。然而,由于M和N可能很大,我想知道是否有更紧凑的方式来表示数据,或者更复杂的方法来对特征的频率做出声明。
我是否在重新发明轮子?如果有在线方法来完成这项任务,那就更好了。
回答:
如果我理解正确的话,你的问题是,你无论如何都需要遍历所有数据,那么为什么不使用哈希呢?实际上是两个哈希表:
- 内部哈希表用于特征值的分布。
- 外部哈希表用于特征的存在性。
这样,内部哈希表的大小将指示特征在你的数据中有多常见,而实际值将指示它们之间的差异。另一个需要注意的是,你只需遍历一次数据,并且如果从一开始就分配足够的空间,哈希表上几乎所有操作的时间复杂度都是O(1)
。
希望这对你有帮助