2014-01-08 2 views
1

아마도 초보적인 질문이지만 온라인 알고리즘을 R에 적용하려고합니다. 본질적으로 이것은 루프의 모든 단계를 특정 단계로 업데이트하는 기능입니다. 나는이 "온라인 함수"를 적용하고 루프의 모든 단계에서 온라인 함수의 변수를 업데이트하고자하는 많은 행렬을 가지고 있습니다. 매트릭스는 다음과 같다 :이 구현하려고 할 때온라인 알고리즘으로 루핑하기 R

x 


      [,1]   [,2]   [,3]   [,4]   [,5]   [,6] 
[1,] 0.0294067658 1.116547e-02 1.2674784332 0.0000000000 6.994836e-03 8.222123e-01 
[2,] 0.0000000000 4.384807e+00 0.0099189102 0.0000000000 1.071928e+01 1.619473e-02 
[3,] 0.0000000000 2.047100e-02 0.0000000000 0.0000000000 1.282887e-02 4.370000e+00 
[4,] 1.2600000000 2.145952e-02 0.0143775046 0.0198709933 1.344862e-02 2.347032e-02 
[5,] 0.0584418001 2.219845e-02 0.0148727323 0.8905552563 0.000000e+00 2.427843e-02 
[6,] 0.0602240425 0.000000e+00 0.0153266127 0.0211823892 1.433646e-02 8.350191e-01 
[7,] 0.0361660755 1.071000e+01 0.0091998143 0.0127169064 8.605112e-03 1.502130e-02 
[8,] 0.0000000000 2.940000e+00 0.0020833114 0.0028839352 1.947935e-03 3.408502e-03 

나는 NaN을

바로 그만 둘 내가 구현하기 위해 노력하고 있습니다 온라인 알고리즘은 내가 R에 대한 약간 수정이 웹 사이트에서입니다
n=10 
for (i in 1:n) { 
    x <- rad(x) # rad just introduces some randomness into the matrix at every step 
    test <- as.matrix(sapply(x, online_fun)) 
} 

test 

[1] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
[22] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
[43] NaN NaN NaN NaN NaN NaN 

(http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance). online_fun은 다음과 같습니다

online_fun = function(data) { 
b = 0 
mean = 0 
M2 = 0 
for (x in data){ 
    b = b + 1 
    delta = x - mean 
    mean = mean + delta/b 
    M2 = M2 + delta*(x - mean)} 
variance = M2/(b - 1) 
return(variance) 
} 

내가 R을 사용하고 있기 때문에, 내가 R 형식으로 웹 사이트에서 파이썬 코드를 전송 문제가있는 것 같아요. 이 아이디어를 어떻게 얻을 수 있을지에 대한 아이디어가 있습니까?


편집

좋아이 작동합니다. 하지만 분산 값이 너무 높습니다. 나는 online_fun을 정확하게 쓰지 않을 것이라고 생각한다. 각 행렬 나는 당신의 online_fun을 테스트하고 잘 분산을 (R의 VAR 기능 비교) 계산 1보다 큰

n=10 
newdata=matrix(NA,length(x),length(x)) 
output=NULL 

for (i in 1:length(x)){newdata[i,]=as.numeric(rad(x))} 
for (b in 1:length(x)){output[b]=online_fun(newdata[,b])} 
varout <- matrix(output,dim(x)[1],dim(x)[2]) 

varout 

     [,1]  [,2]  [,3]  [,4]  [,5]  [,6] 
[1,] 0.004966027 1.4571354 0.2684045 11.1530038 0.6162148 0.09535756 
[2,] 0.076392842 0.4229576 8.2096252 3.7317939 20.4273919 10.84911306 
[3,] 0.203111586 0.7832483 2.9868466 23.7188088 31.7876892 21.87255841 
[4,] 0.196244671 0.3244376 4.3041476 14.3199122 14.9616231 0.05155568 
[5,] 0.450541223 2.2755737 0.0000000 24.4974883 0.0000000 16.34079758 
[6,] 0.212475849 3.2150916 0.9512643 24.2388946 26.6973032 1.66855735 
[7,] 0.028548367 7.1019461 0.9410647 4.5740047 10.8723574 0.00000000 
[8,] 0.716404545 6.0821764 1.1903668 38.1787544 11.3333774 5.55307623 
+0

확실하게 x가 데이터 프레임으로 간주됩니까? 그것은 행렬처럼 보입니다. –

+0

x는 8X6 인 행렬입니다. – user3141121

+0

그러나 x가 행렬 인 경우 sapply는 하나의 인수 만 사용하여 online_fun 함수를 호출합니다. 즉 단일 정보의 분산을 계산하려고 시도하는 것이므로 정보가 유용하지 않습니다. –

답변

1

을하지 않기 때문에 분산 값은 1에 0의 범위 내에서 유지해야한다. 왜 분산이 예상대로 작동하지 않는지 확실하지 않습니다. 게시 된 데이터에 1보다 큰 숫자가 표시됩니다.

위키 백과에서 복사 한 파이썬 코드는 Python3에서만 올바르게 작동합니다.