거꾸로 된 사전! 점 를 , 0이 아닌 값 (즉, 참을 유지하는 기능)에 해당하는 키입니다. 요소의 평균 저장 크기는 입니다. 실제로, 피처를 저장하기 위해 문자열 만 필요 하고 값을 보유하기 위해 float 만 필요 합니다.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)
이 방법을 사용하여 약 1 시간 동안 실행 된 큰 텍스트 세트 (트레인 : 2000000 라인, 테스트 35,000 라인, 피처 수 : 10,000, 요소 당 평균 피처 수 : 20)에 KNN을 구현했습니다. .