2012-02-18 3 views
1

커다란 점 집합을 클러스터링하고 있습니다. 반복을 통해 할당 된 점이 이전 반복과 동일하면 클러스터 속성을 다시 계산하지 않아야합니다. 각 클러스터는 해당 포인트의 ID를 유지합니다. 나는 그들과 요소를 현명하게 비교하고 싶지 않다. ID 벡터의 합을 비교하는 것은 위험하다. (작은 ID는 큰 값으로 보상 될 수있다.) 나는 제곱의 합을 비교해야 할까? Matlab에서 자신있게 사용할 수있는 해싱 방법이 있습니까?벡터의 선형 인덱스에 대해 Matlab의 해시 연산자

예 데이터 :

a=[2,13,14,18,19,21,23,24,25,27] 

b=[6,79,82,85,89,111,113,123,127,129] 

c=[3,9,59,91,99,101,110,119,120,682] 

d=[11,57,74,83,86,90,92,102,103,104] 

그래서 문제는 그냥 합계를 확인하는 경우는, 포인트 11,103을 푼다 및 9105를 얻을 예를 들어 해당 클러스터의 개발이 될 수 있다는 것입니다. 그러면 클러스터에 변화가 없다고 실수로 생각할 것입니다.

+1

몇 가지 예제 데이터를 제공 할 수 있습니까? – Alex

+0

Matlab의 해시에 대해서는 확신이 없습니다. 이러한 비교를 위해 ismember 또는 setdiff와 같은 집합 연산이 강력 해 보입니다. 퍼포먼스에 대해 걱정한다면, 길이를 비교함으로써 가장 많이 변경된 세트를 제거 할 수 있다고 생각합니다.또는 첫 번째 테스트로 무작위 요소 만 - 위치 n에서 말하십시오. – bdecaf

+0

의견을 보내 주셔서 감사합니다. Setdiff는 정말 느리고 무작위 요소를 검사하는 것은 위험합니다. 왜냐하면 클러스터가 정착함에 따라 몇 점을 얻거나 느슨하게하기 때문입니다. 포인트 ID를 무작위로 선택하면 놓칠 수 있습니다. – zamazalotta

답변

0

나는이 함수를 찾았습니다. DataHash on FEX 벡터에 대해 조용하고 빠르며, strcmp가 예상보다 훨씬 빠릅니다.

+0

* Java를 사용하고 싶지 않습니다. * [DataHash] (http://www.mathworks.com/matlabcentral/fileexchange/31272-datahash)는 java를 사용합니다. 실제로 macduff가 제안한 메소드 (165 행 참조 :'Engine = java.security.MessageDigest.getInstance (Method);') – embert

0

는 내가 자바 해싱 알고리즘

http://docs.oracle.com/javase/1.4.2/docs/api/java/security/MessageDigest.html를 사용하도록 matlab에 Java 인터페이스를 사용하는 것이 좋습니다 것 ID 년대를 해시, 제대로 이해하고

당신은 같은 것을 할 수 있습니다

:

hash = java.security.MessageDigest.getInstance('SHA'); 

을 희망이 도움이됩니다.

+0

나는 오버 헤드 때문에 부분적으로 자바를 얻고 싶지 않다. 또한 값 비싼 문자열 비교를해야 할 것이다. 현재의 ID 벡터를 사용하여 수치 비교를하고 싶습니다. – zamazalotta

1

이것은 데이터 및 응용 프로그램에 대해 더 많이 알수록 우리가 더 잘 도와 줄 수있는 상황 중 하나입니다. 당신이 제공하는 것보다 더 나은 정보가 없을 때, 그리고 그러한 부재시에 이것과 같은 대답의 약점을 드러내는 정신에서, 당신이 거부 할 수있는 몇 가지 제안이 있습니다.

집합 연산에 대한 하나의 적절한 데이터 구조는 비트 집합입니다. 즉, (비트 집합의 구성원에 따라 각 비트가 설정되거나 해제되는 기본 우주의 카디널리티와 동일한 길이의 집합입니다. 서브 - 세트).

a) 쉽지만 너무 많은 공간을 소비 할 수 있습니다 : 데이터에 포인트가있는 행 수와 각 클러스터마다 하나의 행렬을 정의하십시오. . point가 cluster의 멤버 인 경우 (cluster, point) 값을 true로 설정합니다. 그런 다음 집합 연산은 벡터 연산에 의해 정의됩니다. 나는 setdiff와 rowA == rowB의 상대적 (시간) 효율에 대한 단서를 가지고 있지 않다.

b) (더 어렵습니다) : 실제로 비트 세트별로 클러스터를 나타냅니다. 물론 Matlab의 비트 - twiddling 기능을 사용해야하지만, 고통은 이득 가치가있을 수 있습니다. 유니버스가 1024 포인트로 구성된 경우 각 클러스터에 대해 비트 세트를 나타 내기 위해 16 개의 uint64 값의 배열이 필요합니다. 예를 들어, 클러스터에서 포인트 563이 존재하면 해당 클러스터를 나타내는 비트 세트에 대해 비트 563 (집합의 9 번째 요소에서 비트 51 일 것임)을 1로 설정해야합니다.

그리고 아마도 나는 이것이 문제의 해싱 종류라고 생각하지 않는다는 것을 써서 시작 했어야했는데, 그것은 일련의 문제였다. 예, 해시를 사용할 수는 있지만 손톱에 드라이버를 사용하는 것의 한계를 프로그램해야합니다 (선호하는 유추를 선택하십시오).

+0

답장을 보내 주셔서 감사합니다. 그러나 나는 아직도 내 문제가 일종의 문제라고 생각한다. 내가 명확히하려고 노력하겠습니다. 내 데이터는 3D로 60,000 포인트로 구성됩니다. K- 평균 클러스터링의 커스텀 버전을 구현 중입니다. 클러스터에 가장 가까운 포인트를 계산하면 이러한 포인트, 통계 분포 등을 기반으로 클러스터의 여러 속성을 계산합니다. 이것은 계산 상으로 무겁습니다. 그래서 그것을 피하기 위해서 마지막 반복을했던 것처럼 클러스터에 같은 점이 있는지 알고 싶습니다. 현재 나는 점의 3D 좌표를 평균하여 뭔가 더 빠른 것을 찾고 있습니다. – zamazalotta

관련 문제