倒字典!将点表示为,对应于非零值的键(即特征保持为真)。元素的平均存储大小为。实际上,我只需要个字符串来存储特征和个浮点数来保存值。xfeat1:value1,feat101:value101KKK
对于每个特征,构建一个包含共享该特征的索引的字典。希望这个数字不会太大(如果您有一个由所有索引共享的功能,那么这种方法就被破坏了,您可以在此处停止阅读)。
这本字典看起来像:。如果我想提高速度并节省空间,我什至可以放弃仅在一个元素中找到的特征(此处为:),因为它们不会产生紧密的对。该字典内置在操作中。feat1:{1,101,202},feat2:{7,202},feat3:{202}...featM:{3,45,6}feat3O(NK)
现在,当您想要评估元素共享至少一个特征的索引列表。您知道所有其他元素都与相去甚远(它们甚至不共享一个特征!)。如果“每个特征的元素”的平均数量很低(称为),则您不再需要处于中。xxxPO(N2)
现在,如果和也表示为字典,则还有另一个重大改进,因为或可以在操作中迭代和xyd(x,y)<x,y>xyO(K)
您最终的复杂性是而不是天真的初始方法。O(NPK)O(MN2)
我应用这种方法在大型文本集上实现了一个 KNN(训练:2 000 000 行,测试 35 000 行,特征数:10 000,每个元素的平均特征数:20),运行大约一个小时。 .