倒词典!代表点作为˚F ë 一吨1:v 一个升ù ë 1,˚F Ë 一吨101:v 一个升ü ë 101,对应于非零个值的密钥(即,保持真功能)。的元素的存储的平均大小将是ķ。实际上,我只需要K个字符串来存储要素,K个浮点数即可保存值。XFË 一吨1个:v 一升ù ê1个,˚FË 一吨101:v 一升ù ê101ķķķ
对于每个功能,构建一个字典,其中包含共享此功能的索引。希望这个数字不会太大(如果您拥有所有索引都共享的功能,那么这种方法就会毁了,您可以在这里停止阅读)。
此词典看起来像:FË 一吨1个:{ 1 ,101 ,202 } ,˚FË 一吨2:{ 7 ,202 } ,˚FË 一吨3:{ 202 } 。。。FË 一吨中号:{ 3 ,45 ,6 }。如果我想提高速度并节省空间,我什至可以删除仅在一个元素中找到的特征(此处为),因为它们不会产生紧密对。该词典以O (N K )个运算构建。FË 一吨3ø (Ñķ)
现在,当您要评估元素与其他元素的距离时,(使用字典)生成与x共享至少一个特征的索引列表。您知道所有其他元素都不是x(它们甚至不共享一个功能!)。如果“每个要素的元素”的平均数量较少(称为P),则不必再处于O (N 2)中。XXXPø (Ñ2)
现在,如果和y也表示为字典,则还有另一个很大的改进,因为d (x ,y )或< x ,y >可以在O (K )操作中迭代x和y的键来求值。Xÿd(x ,y)< x ,y>XÿØ (ķ)
您的最终复杂度是而不是朴素的O (M N 2)初始方法。ø (ÑPķ)Ø (中号ñ2)
我使用此方法在大型文本集(火车:2 000 000行,测试35 000行,特征数量:10000,每个元素的平均特征数量:20)上实现了KNN,该过程大约运行了一个小时。 。