2014-05-01 3 views
0

행 100 개와 10 개를 포함하는 행렬을 가지고 있습니다. 여기서는 행 사이의 다양성을 비교하고 정렬하려고합니다. 그리고 나서, 나는 그것으로부터 최대 비 유사 행을 10 개 선택하고 싶습니다. 어떤 방법을 사용할 수 있습니까? 유사하고 dissimilarty 값과 비교 - 두 개의 행과 dissimilairty = 1 내지 :In R : 행렬의 행간 최대 비 정렬 정렬

set.seed(123) 
mat <- matrix(runif(100 * 10), nrow = 100, ncol = 10) 

내 초기 방법 (예컨대 http://en.wikipedia.org/wiki/Jaccard_index 타니 모토 계수 또는 다른 말)의 유사도를 계산하는 것이다. 마침내 모든 비평가 값을 정렬하고 10 개의 최대 비평가 값을 선택합니다. 하지만 결과가 100 * 100 행렬 인 것 같습니다. 많은 수의 행이있는 경우 이러한 계산에 효율적인 방법이 필요할 수 있습니다. 그러나 이것은 단지 제 생각이었고 어쩌면 옳지 않았을 수 있습니다. 그래서 도움이 필요합니다.

[업데이트] 일부 자료를 찾은 후. 최대 불일치 방법에 대한 하나의 정의를 찾았습니다.

최대 비 차이 성 방법 : 데이터 레코드를 첫 번째 클러스터 중심으로 무작위로 선택하는 것으로 시작합니다. 첫 번째 점으로부터 최대한 멀리 떨어진 기록은 다음 클러스터 중심으로 선택됩니다. 그 후 현재 지점과 최대 거리만큼 떨어진 기록이 선택됩니다. 이 과정은 충분한 수의 클러스터 센터가있을 때까지 반복됩니다.

내 질문에 여기

, 충분한 수는 10

감사해야합니다.

+0

그리고 지금까지 어떤 시도를 했습니까? 그래서. 사이트는 보통 당신이 한 일과 질문을하기 전에 벽을 치는 곳을 보여줄 것으로 기대합니다. – thelatemail

+0

@thelatemail, 감사합니다.내 질문을 편집했지만 어쩌면 내 질문을 묘사하기에 아직 모호합니다. 사람들에게 도움이 필요합니다. – BioChemoinformatics

+0

3 행으로 간단한 예를 들자면 각 조합에 대한 유사성 측정 값을 얻을 수 있습니다. 'r1/r2'' r1/r3''r2/r3'이므로 10 행이 아닌 10 개의 서로 다른 행 쌍만 얻을 수 있습니다. – thelatemail

답변

1

우선, Jacard 색인은 당신에게 적합하지 않습니다. 위키 피 디아 페이지에서

유한 샘플 세트 사이 인 Jaccard 계수를 측정 유사성 ...

귀하의 매트릭스는 다른 문제가 있으므로 (해당 인덱스가 정의되어 있습니다, 수레의 샘플을 가지고 교차로의 측면에서, 바로 붉은 깃발이 있어야합니다 :-).

그래서, 당신은 비 유사성의 의미를 결정해야합니다. 한 가지 자연스러운 해석은 행 A가 데이터 집합의 중심에 더 큰 유클리드 거리를 갖는 경우 행 B보다 데이터 집합과 더 유사하다는 것입니다. 데이터 집합의 질량 중심을 각각의 열의 평균을 취하여 함께 넣는 벡터로 생각할 수 있습니다 (apply(mat, 2, mean)).

이렇게하면 각 행의 거리를 해당 중심 벡터로 가져올 수 있습니다. 그런 다음 해당 거리에 대해 순서를 지정할 수 있습니다. 원래 행렬에서 원하는 행까지 다시 작업 할 수 있습니다. 모두 함께

: 나는 실제로이 글을 쓰는 경우

center <- apply(mat, 2, mean) 
# not quite the distances, actually, but their squares. That will work fine for us though, since the order 
# will still be the same 
dists <- apply(mat, 1, function(row) sum((row - center) ** 2)) 
# this gives us the row indices in order of least to greaest dissimiliarity 
dist.order <- order(dists) 
# Now we just grab the 10 most dissimilar of those 
most.dissimilar.ids <- dist.order[91:100] 
# and use them to get the corresponding rows of the matrix 
most.dissimilar <- mat[most.dissimilar.ids,] 

, 나는 아마 most.dissimilar <- mat[order(dists)[91:100],]로 마지막 세 줄을 압축 한 것, 그러나 희망 이것이 조금 더 쉽게 무슨 일이 일어나고 있는지 볼 수 있습니다처럼 깨진 데 에.

물론 질량 중심으로부터의 거리가 당신의 맥락에서 "비 환상"을 생각하는 최선의 방법으로 이해가되지 않는다면, 당신은 무언가로 고쳐야 할 것입니다.

+0

감사합니다. 너의 대답은 나에게 합리적인 방법을 제공한다. 네, 센터로부터의 거리는 좋은 방법입니다. 어쩌면 마지막 코드의 작은 오타가 쉼표가 누락되어 다음과 같이 추가 될 수 있습니다. 'most.dissimilar <- mat [most.dissimilar.ids,] '설명을 다시 해 주셔서 감사합니다. – BioChemoinformatics