희소 벡터로 매우 높은 공간에서 가까운 쌍을 찾습니다.


9

나는 (~ 백만) 특징 벡터를 가지고 있습니다. 있다 (~ 만) 바이너리 기능이 있지만, 각 벡터 만에 것 중 (~ 천) , 나머지는 . 나는 적어도 (~ 백) 특징이 공통적 인 벡터 쌍을 찾고 있습니다 ( 둘 다 ). 이러한 쌍의 수는 (~ 백만) 과 비슷한 크기 입니다.NMK10L1N

나는 이것이 매우 높은 차원의 공간에서 가까운 점 쌍을 찾는 것으로 접근 할 수 있다고 생각합니다. 거리 함수는 두 벡터가 공통적으로 갖는 피처 수를 기반으로 할 수 있습니다. 그러나 유클리드와 같은 더 일반적인 거리 측정법에도 유용 할 것입니다.

이 문제에 접근하기 위해 잘 알려진 알고리즘은 무엇입니까? 또는 에서 2 차인 것은 실용적이지 않습니다.NM


문제의 실제 공식화의 예는 명의 사람들이 여러 위치 사이를 이동 하는 것을 고려 하는 것입니다. 두 사람이 동시에 같은 장소에 있었다면 서로 만났다고합니다. (적어도 한 사람과의 위치-시간 조합의 수는 입니다.) 우리는 친구를 찾고 있습니다 : 번 이상을 만난 사람들 .NML


1
벡터 1, 기능 1이 이고 벡터 2, 기능 1이 이면 해당 기능이 "공통"입니까? 00
gung-복직 모니카

@ user777, no 아니요 ,이 경우 귀하의 답변은 완벽하지만 OP가 명시 적으로 언급하는 것이 좋습니다.
gung-모니 티 복원

@ 궁, 당신은 옳다고 생각합니다. 명확히하기 위해 질문을 편집했습니다. 감사!
Daniel Darabos

1
공통-무작위 샘플 + 무차별 대입에서 100 개 이상의 특징을 갖는 벡터 쌍 수는? 1M x 1M 크기가 실제 문제입니까, 아니면 구성입니까? 스택 오버 플로우에 대한 비트 스트링 인접 이웃 검색 방법을 참조하십시오 .
데니스

1
미친 제안 : 1Mbit 길이의 특징 벡터를 1000 x 1000 픽셀의 이미지로보고 이미지 클러스터링 방법 (예 : stackoverflow.com/search?q=[image]+clustering)을 찾아보십시오 . Afaik은 작동하기 위해 좋은 기능 (단일 픽셀이 아닌)을 찾아야하지만 전문가는 아닙니다.
데니스

답변:


6

찾고있는 접근 방식은 minhash 서명과 LSH (Locality Sensitive Hashing)의 조합입니다. 마이닝 대규모 데이터 세트 의 (무료로 제공되는) pdf는 이 접근법 (및 기타 유사성 측정)을 3 장에 자세하게 설명하지만 간략하게 설명합니다.

minhash 서명 일부 번호함으로써 구성되어 원래 매트릭스의 압축 된 표현 인 N 시켜 관찰 당 피처의 수를 감소 기능에 해시 함수를. 이렇게하면 데이터 크기가 줄어들지 만 여전히 문제가 발생할 수 있습니다.O(N2)

이 문제를 해결하기 위해 MMDS는 귀하가 찾고자하는 모든 것이 유사성의 특정 임계 값을 초과하는 쌍 (경우에 적용되는 것)이라면 가장 유사 할 가능성이있는 쌍에만 초점을 맞출 수 있다고 조언합니다. Locality Sensitive Hashing 이라고 하며, 섹션 3.4에서는 minhash 서명 방식을 LSH와 결합하는 방법의 예를 보여줍니다.

텍스트 외에도 Coursera 과정 에서 같은 이름의 강의가 제공됩니다 .


7

적어도 특징이 공통 인 벡터 쌍을 찾고 있습니다.L

이것은 이진 특징 벡터의 내부 산물입니다. 내부 곱이 보다 크면 쌍은 최소 요소를 갖습니다 . 이것은 적어도 유클리드 거리보다 빠른 비교적 빠른 계산이어야하며,이 데이터는 낭비적이고 느려질 것입니다. 쌍을 찾고 있다고 규정하기 때문에 이것은 본질적으로 모든 벡터를 비교 하기 위해 계산을 수행해야 함을 의미합니다 .L1L(N2)

서로 가까운 지점을 찾는 것은 실제로 클러스터링 문제입니다. 그러나 내가 익숙한 클러스터링 알고리즘의 첫 번째 단계는 쌍별 거리 또는 유사성을 계산하는 것입니다. 누군가가보다 효율적인 대안을 개발했다고 확신합니다. 용어에 관한 요점 : 적어도 공통 이웃을 갖는 것은 거리가 아니라 유사성으로 표현됩니다 ! 이 경우 내부 제품은 정규화되지 않은 코사인 유사점입니다.L

관측치에 대한 피처 벡터의 합 (이 경우 표준과 동일 함)이 보다 큰 경우에만 내부 곱 계산을 수행하여이 계산식을 더 다루기 쉽게 만들 수 있습니다. 이진 피처 벡터에서는 불가능하기 때문입니다. 이 합이 보다 작을 때 내 기준을 충족시키는 다른 이진 특징 벡터를 가진 내부 제품을 갖습니다 . 분명히이 합계를 계산하는 것은 단지 복잡성이므로 내부 제품 단계의 규모를 줄이는 저렴한 방법입니다.L1LO(N)

그러나이 문제의 범위를 줄이는 일반적인 방법은 추가 사전 필터링을 수행하는 것입니다. 하나의 다소 드문 기능이 1의 값을 가질 때 특히 관심이 있습니까? 그렇다면 해당 특징 벡터에 대해서만 계산을 수행하십시오.

또는 문제를 재구성하여 이점을 얻을 수 있습니다. 예를 들어, 샘플링은 좋은 속성을 갖는 것으로 알려져 있습니다. 추론 통계는이 아이디어에 대해 어느 정도 깊이 발전합니다. 따라서 전체 데이터 세트를 분석하는 것이 불가능할 수도 있지만 작은 샘플을 검사하는 것은 완벽하게 실현 가능합니다. 어떤 질문에 답해야하는지 모르겠지만 실험을 신중하게 설계하면 검증 목적으로 충분한 양 이상의 데이터가 남아있는 수천 건의 관측치만으로도 벗어날 수 있습니다.

추가로 생각한 후에는 작업중 인 데이터가 일종의 그래프 라는 강한 직감이 있습니다 . 가 여러 개의 연결된 구성 요소로 구성 된다는 것은 매우 타당합니다 .이 경우 데이터의 차원을 줄이는 데 따른 부작용으로 를 그래프 세트로 분해 할 수 있습니다 . 그래프가 대략 동일한 크기의 두 개의 연결된 구성 요소 인 경우에도 쌍별 비교는 총 비용 .GGGO(N2)14

그래프가 대칭 인 경우 다음 관찰이 도움이 될 수 있습니다.

  1. 그래프의 라플라시안을 로 정의합니다 . 여기서 는 각도의 대각선 행렬 (각 특징 벡터의 합)이고 는 인접 행렬 (특징 벡터를 행렬에 쌓아 놓은 것)입니다.P=DADA
  2. 숫자에 곱 하면 의 고유 값 은 의 연결된 구성 요소 수입니다 . 그래프를 연결된 컴포넌트로 분해하고 해당 컴포넌트 만 사용하면 데이터의 차원을 줄이는 부작용이 있습니다. 관심 수량을 계산하는 것이 더 쉬울 것입니다. 그러나 고유 분해 계산은 백만 개의 정점에 대해 비쌉니다.0PG
  3. (완전 순열 후) 는 의 연결된 구성 요소에 대한 라플라시안의 블록 대각선 행렬입니다 .PG
  4. P 는 양의 반 한정입니다. 이것은 거의 확실하게 유용합니다.
  5. 의 대수 연결성 은 의 두 번째로 작은 고유 값입니다 . 이것은 가 얼마나 잘 연결되어 있는지 알려줍니다 . 아마도 그것은 당신이 관심있는 몇 가지 질문에 답할 것입니다 : 공통된 특징을 가진 벡터. 스펙트럼 그래프 이론은이 아이디어를 좀 더 자세히 개발합니다.GPG

"이것은 SNA 문제입니까?" 잘 모르겠습니다. 한 응용 프로그램에서 기능은 동작을 설명하며 유사한 동작을 가진 사람들을 연결하려고합니다. 이것이 SNA 문제가됩니까?

사람들을 행동에 연결하는 이분 그래프가 있다면 이것을 사람들을 행으로, 행동을 열로 하는 제휴 네트워크 로 생각할 수 있습니다. 공통된 동작을 통해 사람들을 사람들과 연결하려면 계산할 수 있습니다 . 는 사람들이 공통적으로하는 행동의 수입니다. 분명히, 당신의 질문에 대답 하는 정점들의 집합입니다 .BBBT=AAijAijL


훌륭한 답변에 감사드립니다! 그것은 내가 더 조사해야 할 많은 것들입니다. 그래도 쌍 비교는 피할 수 없다고 확신하지 않습니다. 크기가 1보다 큰 클러스터를 찾을 때 이것이 클러스터링 문제가 아닙니까? 공간 분할 방식이 쌍별 비교 수를 크게 줄일 수있을 것으로 기대했습니다.
Daniel Darabos

데이터 과학에 대해 잘 모르겠습니다. 그러나 서로 가까운 지점을 모 으려고 할 때 클러스터링 문제가 아닌가? 최대 거리 (L)가 있고 서로의 거리 내에있는 점 그룹 (쌍)을 찾고 싶습니다. 이것이 클러스터링의 정의를 너무 많이 늘리고 있습니까?
Daniel Darabos

1
실제로 그래프 문제로 표현할 수 있습니다. 이 경우 우리는 N 점과 M 특징의 이분 그래프를 가지며 적어도 L 개의 공통 이웃을 가진 점 쌍을 찾고 싶습니다. 나는 특히 기능 벡터 기반 구문을보고 있는데, 나에게 유용 할 수있는 클러스터링 방법이 있기를 바랍니다. K-SVD는 stats.stackexchange.com/questions/93366/… 에서 비슷한 문제를 제안했습니다. 그래서 나는 지금 그것에 대해 읽고 있습니다. 감사!
Daniel Darabos

"이것은 SNA 문제입니까?" 잘 모르겠습니다. 한 응용 프로그램에서 기능은 동작을 설명하며 유사한 동작을 가진 사람들을 연결하려고합니다. 이것이 SNA 문제가됩니까? 용어를 소개해 주셔서 감사합니다. 검색을 안내하는 것이 매우 도움이됩니다.
Daniel Darabos

내 답변을 수정했습니다. 많은 행동을하는 사람들을 공통으로 열거하는 것이 궁극적 목표입니까? 아니면 다른 것입니까?
Sycorax는 Reinstate Monica

2

시공간 블록에서 만나는 사람들을 찾는 경우 :
공간을 블록 (도시 블록, 평방 킬로미터 등)으로 나누고 시간을 블록 으로 나눕니다 . 사람들이 만나면 같은 블록 안에서 만날 가능성이 큽니다. 따라서 각 블록 내에서 NN을 실행하십시오. 런타임 및 오류율은 물론 블록 크기 및 모양 (병렬화 / MapReduce 가능한 항목에 따라 다름)에 따라 달라 지지만, 넓게 개방 된 아닌 엔지니어링과 함께 사용할 매개 변수가 있습니다 .NspaceNtime
O(N2)


데이터 과학에 대한 가장 가까운 이웃 검색-매우 높은 차원의 데이터 도 참조하십시오.

pairwise.py :

표준 라이브러리의 Python Gensim 라이브러리와 heapq를 사용하여 TF-IDF와 코사인 거리를 사용하여 엄청나게 많은 수의 문서를 쌍으로 비교할 수 있습니다.


1

거꾸로 된 사전! 점 를 , 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을 구현했습니다. .


나는이 접근법을 완전히 이해하지 못한다. 이것은 당신을 믿지 않기 때문이 아니라, 그것은 데이터를 표현하기위한 다른 전략에 익숙하지 않기 때문이다. 아마도 처음 두 단락에서 다루는 내용에 대해 더 자세히 설명 할 수 있습니까?
Sycorax는 Reinstate Monica가

1) "이 숫자는 너무 크지 않습니다": 평균 열 합 = 평균 행 합 = 1000. 2) float? OP의 기능은 바이너리입니다. 3) 3 번 실행 N, 2N, 4N 런타임은 흥미 롭습니다. 거의 경우를 보여줍니다 . O(N2)
11:26에

1

도움이 될만한 참고 자료를 찾았으며 지금까지 제시 된 다른 모든 솔루션보다 무의식적으로 더 효율적이라고 생각합니다. 올바르게 이해하면 시간에 최근 접 이웃 (KNN) 그래프를 구성 할 수 있습니다 .kO(LNlog(N))

L. Erotz, M. Steinbach 및 V. Kumar. "최근의 공유 된 가장 가까운 이웃 클러스터링 알고리즘 및 응용 프로그램." 고차원 데이터 클러스터링과 그 응용에 관한 제 1 차 워크숍, 2002.


고마워요, 재미있는 읽을 거리입니다. O (LN log (N)) 시간은 어떻게 얻었습니까? 잘 들린다. 그러나 알고리즘 설명은 "유사성 행렬 구성"으로 시작 하며 이것이 내가 이해하는 한 NxN 행렬입니다.
Daniel Darabos

복잡성이 책에서 설명 @DanielDarabos R.와 실제 그래프 광업
Sycorax는 분석 재개 모니카 말한다

1

미쳤지 만 작동 가능한 접근 방식은 주파수 영역으로 이동하는 것일 수 있습니다. 미친 /의 빠른 FFT "라는 병이 스파 스 FFT 임계 값보다 행 최대 이상 (룩에 당신이 (100 개 기능 당신의 카운트)에 대해 관심을 한 다음 회선에서 작동 모드의 수를 지정"및 표정 상위 레지스터의 비트). 될 것이다 여기서 .O(klogn)k<<n

k가 100이고 n이 1e6 인 경우 클래식 FFT와 비교하여 ~ 1e4x 속도가 향상됩니다.

20 배 더 빠른 속도가 필요하고 위험을 감수해야하는 경우 도메인에 대해 모든 행을 복잡하게 만들고 최고점을 찾는 대신 행의 하위 집합을 부트 스트랩 할 수 있습니다.

또한 합계가 50 미만인 열 또는 일치시키려는 행 수의 절반 정도 인 다른 임계 값을 제거하여 열을 사전 필터링 할 수 있습니다. 최소한 정보가없는 모든 0과 1의 열을 제거해야합니다. 완전히 비어 있거나 비어있는 행 또는 너무 꽉 찬 행과 관련이없는 행과 동일합니다.

해야 할 일 : 여기에 합성 데이터를 사용하여 예제를 작성하고 일부 방법을 비교해야합니다.


0

방금 직접 관련된 논문을 발견했습니다.

무작위 알고리즘 및 NLP : 고속 명사 클러스터링을 위해 위치 감지 해시 기능 사용 (Ravichandran et al, 2005)

실제로 https://github.com/soundcloud/cosine-lsh-join-spark 에서 구현되어 있습니다.

그것은 지역에 민감한 해싱 (다른 답변에서 이미 언급)을 기반으로합니다. 피쳐 벡터를 저 차원 공간으로 축소 한 후 빠른 해밍 거리 조인을 사용하여 가장 가까운 이웃을 찾습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.