2015-01-02 8 views
1

의미 공간을 확보하기 위해 R 패키지 lsa에서 lsa 함수를 사용했습니다. 입력은 용어 - 문서 행렬입니다. 문제는 기본적으로 lsa가 사용하는 dimcalc_share() 함수가 잘못된 것처럼 보입니다. 함수의 도움말 페이지는 "함수의 합계가 지정된 공유를 충족하거나 초과하는 특이 값의 내림차순 시퀀스에서 첫 번째 위치를 찾습니다"라고 말합니다. 나는이 값의 합이 모든 특이 값의 합계의 일정 비율을 초과하도록 함수가 n 번째로 큰 특이 값을 유지하므로 단어를 이해합니다. 1. 왜 플러스 1 D에 : 기능의 소스 코드를 내가 소스 코드와 함께 두 개의 질문이R 패키지에 보관할 단일 값의 수 lsa

function(share=0.5) 
{ 
    function(x){ 
     if(any(which(cumsum(s/sum(s))<=share))){ 
      d=max(which(cumsum(s/sum(s))<=share))+1 
     } 
     else{ 
      d=length(s) 
     } 
     return(d) 
    } 
} 

입니까? 2. 첫 번째 특이 값의 비율이 share보다 큰 경우 함수는 모든 특이 값을 유지하지만 함수는 첫 번째 특이 값을 유지해야합니다.

+0

게다가, 원본 데이터와 LSA 공간에서 재구성 된 TDM을 사용하여 문서 유사성을 계산했습니다. 데이터에 대한 ras TDM은 훨씬 낮은 학습 오류를 생성합니다. 자세한 분석을 주셔서 감사합니다. –

답변

0

첫 번째 질문은 "+ 1"입니다.

# create some files 
td = tempfile() 
dir.create(td) 
write(c("dog", "cat", "mouse"), file=paste(td, "D1", sep="/")) 
write(c("ham", "mouse", "sushi"), file=paste(td, "D2", sep="/")) 
write(c("dog", "pet", "pet"), file=paste(td, "D3", sep="/")) 

# LSA 
data(stopwords_en) 
myMatrix = textmatrix(td, stopwords=stopwords_en) 
myMatrix = lw_logtf(myMatrix) * gw_idf(myMatrix) 
myLSAspace = lsa(myMatrix, dims=dimcalc_share()) 
as.textmatrix(myLSAspace) 

      D1   D2   D3 
cat 0.3616693 0.6075489 0.3848429 
dog 0.4577219 0.2722711 1.2710784 
mouse 0.5942734 1.3128719 0.1357196 
ham 0.6075489 1.5336529 -0.1634938 
sushi 0.6075489 1.5336529 -0.1634938 
pet 0.6099616 -0.2591316 2.6757285 

그래서, lsa는 입력 행렬 (기본 0.5) 주어진 공유를 기반으로 dimcalc_share()에서 치수를 얻고 매핑 특이 값 분해를 실행합니다

의 이러한 기능이 작동하는 방법을 살펴 보자 원래의 TDM은 새로운 LSAspace으로 변경되었습니다.

이러한 차원은 LSA의 차원 감소에 대한 특이 값의 수입니다. dimcalc_share()은 특이 값 s의 내림차순 시퀀스에서 첫 번째 위치를 찾습니다.이 값의 합계 (모든 값의 합계로 나눔)는 지정된 공유를 충족하거나 초과합니다.

기능이 dmax() 위치 <= share 동일하도록 작성 :

> # Break it apart 
> s <- myMatrix 
> share <- .5 
> 
> any(which(cumsum(s/sum(s)) <= share)) #TRUE 
[1] TRUE 
> cumsum(s/sum(s)) <= share 
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
> d = max(which(cumsum(s/sum(s)) <= share)) + 1 
> d 
[1] 10 

당신은 단지 당신에게 9 대신 10 줄 것 d -1를 사용하는 경우에, 당신은 대신에 위치이있을 것이다 cumsum은 여전히 ​​<= ~ share입니다. 즉 작동하지 않을 것입니다 :

> myMatrix = lw_logtf(myMatrix) * gw_idf(myMatrix) 
> myLSAspace2 = lsa(myMatrix, dims=d-1) 
Error in SVD$u[, 1:dims] : subscript out of bounds 

동등하게

> dims = 9 
> myLSAspace = lsa(myMatrix, dims) 
Error in SVD$u[, 1:dims] : subscript out of bounds 

그래서 기능 dimshare_calc()+ 1 사용에 맞습니다.

첫 번째 값이> 공유 일 경우 두 번째 질문은 "dimcalc_share() = 18 대신 = 1이됩니까?"입니다. 첫 번째 값이 > share을한다면 당신은 가정으로

다음 첫 번째 if 조건은 대신 18

당신은 확인하는 CrossValidated에 대한 질문 후속 수있는 length(s)을 사용, false를 반환과 것이다 당신의 직감은 = 1이 맞아야합니다 (그래도 나에게 의미가 있음). 그렇다면 d = 1이라는 함수를 else으로 다시 작성하는 것이 간단합니다.

+0

감사합니다. 나는 다음의 함수를 사용하여 차원을 할당했다 : k <-min (cumsum (lsaSpace $ sk/sum (lsaSpace $ sk)> = share)). dimcalc_share()에서 if ... else ... 구조체가 필요하지 않은 것 같습니다. –