2016-07-07 1 views
5

위키피디아에 따르면, 균일 분포는 "최대 엔트로피 확률 분포"입니다. 따라서 길이 k의 두 시퀀스 (균일하게 분포 된 값과 반복 된 값을 갖는 값)가있는 경우 균일하게 분포 된 시퀀스의 엔트로피가 반복 된 값의 시퀀스보다 높을 것으로 예상됩니다. R에 다음 코드를 실행하는 경우에는,이 관찰되지 무엇 : 제 엔트로피 정확히 10 개 비트를 생성하지만,왜 균일 분포의 엔트로피가 R의 반복 된 값보다 낮습니까?

require(entropy) 
entropy(runif(1024), method="ML", unit="log2") 
entropy(rep(1,1024), method="ML", unit="log2") 

제 1 출력은 엔트로피의 약 9.7 비트를 생성을 (= 1024 (10)의베이스 2 로그). 왜 균일 분포가 10 비트 이상의 엔트로피를 가지지 않는가?

+1

구현 때문일 수도 있다고 생각했습니다. "MM"메서드를 사용하는 경우 반복되는 값의 엔트로피가 해당 값에 따라 달라진다는 점을 제외하고는 예상대로 작동합니다. "ML"방법은이를 올바르게 처리합니다. 편집 : 교차 유효성 검사가 더 나은 장소 일 수 있습니다. 네가 제안 할 때까지 나는 그것을 알지 못했다. –

+0

구현의 경우,'getAnywhere ("entropy.empirical")','getAnywhere ("entropy.MillerMadow")'및'getAnywhere ("entropy.plugin")'를보십시오. – Laterow

+0

감사합니다. 소스 코드를 살펴 봤지만 왜 그렇게 행동하는지 잘 모르겠습니다. 요약하면, 데이터를 취해 freqs 함수로 저장 한 다음 로그 함수를 적용합니다. –

답변

3

의 첫 번째 인수 인 y이 오해하고 있다고 생각합니다. ?entropy에서 언급했듯이 카운트 벡터를 제공합니다. 이러한 카운트는 함께이 "개별 정보 소스"의 메시지가 구성되는 각 기호의 상대 빈도를 제공합니다.

어떻게 실행되는지 보려면 두 개의 기호 (1/0, 켜기/끄기, A/B, 무엇이 있는지)가있는 이진 정보 소스의 간단한 예를 살펴보십시오. 이 경우, 다음의 모두 (즉, 반 심볼 A S이고 절반 B S이다) 두 문자의 상대적인 빈도가 동일한 한 소스의 엔트로피를 제공한다 :

entropy(c(0.5, 0.5)) 
# [1] 0.6931472 
entropy(c(1,1)) 
# [1] 0.6931472 
entropy(c(1000,1000)) 
# [1] 0.6931472 
entropy(c(0.0004, 0.0004)) 
# [1] 0.6931472 
entropy(rep(1,2)) 
# [1] 0.6931472 

때문에 이들 모두는 동일한 기본 분포를 지칭하며, 확률은 이용 가능한 심볼들 사이에서 최대한으로 퍼져 나가며, 이들은 각각 2- 상태 정보 소스 (log(2) = 0.6931472))에 대해 가능한 가장 높은 엔트로피를 제공한다.

대신 entropy(runif(2))을 사용하면 균일 배포에서 임의로 선택된 두 개의 기호에 대해 상대 확률을 제공하게됩니다. 두 개의 무작위로 선택된 숫자가 정확히 일치하지 않으면 entropy()에 다른 주파수로 사용되는 두 개의 기호가있는 정보 소스가 있다고 말합니다. 결과적으로 항상 log(2)보다 낮은 계산 된 엔트로피를 얻게됩니다.

set.seed(4) 
(x <- runif(2)) 
# [1] 0.585800305 0.008945796 
freqs.empirical(x) ## Helper function called by `entropy()` via `entropy.empirical()` 
# [1] 0.98495863 0.01504137 

## Low entropy, as you should expect 
entropy(x) 
# [1] 0.07805556 

## Essentially the same thing; you can interpret this as the expected entropy 
## of a source from which a message with 984 '0's and 15 '1's has been observed 
entropy(c(984, 15)) 
요약

entropy(rep(1, 1024))에서와 같이 y= 인수를 1의 긴 문자열을 전달하여, 당신은 이산 인 정보 소스를 기술하고 있습니다 : 여기가 무슨 뜻인지 설명하기 위해 간단한 예입니다 균일 한 분포의 아날로그. 장기적으로 또는 매우 긴 메시지에서 1024 자의 문자가 모두 동일한 빈도로 발생해야하며, 그 이상의 유니폼을 얻을 수 없습니다!

+0

도움에 감사드립니다. 내가하고 싶은 것은 배열의 엔트로피를 측정하는 것입니다. 배열의 각 요소에는 요소가 메모리에서 액세스 된 횟수에 해당하는 숫자가 포함됩니다 (보안 연구용).엔트로피를 정확하게 측정하기 위해서는 먼저 해당 배열에 freqs 함수를 적용해야합니까? –

+2

@AlphaBravo 죄송합니다. 특정 응용 프로그램에 엔트로피 계산을 적용하는 방법에 대한 도움이나 조언을 드릴 수 없습니다. 'freqs.empirical()'이 넘겨주는 데이터를 정규화하기 때문에 (주파수가'1 '로 합쳐지기 때문에), 원시 카운트 나 이미 정규화 된 데이터를 넘겨 줘도 아무런 차이가 없습니다. –

관련 문제