A função NumPy np.std
tem um parâmetro opcional ddof
: "Delta Degrees of Freedom". Por padrão, é 0
. Defina como para 1
obter o resultado do MATLAB:
>>> np.std([1,3,4,6], ddof=1)
2.0816659994661326
Para adicionar um pouco mais de contexto, no cálculo da variância (da qual o desvio padrão é a raiz quadrada), normalmente dividimos pelo número de valores que temos.
Mas se selecionarmos uma amostra aleatória de N
elementos de uma distribuição maior e calcularmos a variância, a divisão por N
pode levar a uma subestimação da variância real. Para corrigir isso, podemos diminuir o número que dividimos ( os graus de liberdade ) para um número menor que N
(normalmente N-1
). O ddof
parâmetro nos permite alterar o divisor pelo valor que especificamos.
Salvo indicação em contrário, NumPy calculará o estimador enviesado para a variância ( ddof=0
, dividindo por N
). Isso é o que você deseja se estiver trabalhando com toda a distribuição (e não com um subconjunto de valores que foram escolhidos aleatoriamente em uma distribuição maior). Se o ddof
parâmetro for fornecido, NumPy será dividido por N - ddof
.
O comportamento padrão do MATLAB std
é corrigir o viés da variância da amostra dividindo por N-1
. Isso elimina parte (mas provavelmente não toda) do viés no desvio padrão. É provável que seja isso que você deseja se estiver usando a função em uma amostra aleatória de uma distribuição maior.
A boa resposta de @hbaderts fornece mais detalhes matemáticos.
std([1 3 4 6],1)
é equivalente ao padrão do NumPynp.std([1,3,4,6])
. Tudo isso é explicado claramente na documentação do Matlab e do NumPy, então eu recomendo fortemente que o OP leia-o no futuro.O desvio padrão é a raiz quadrada da variância. A variância de uma variável aleatória
X
é definida comoUm estimador para a variância seria, portanto,
onde denota a média da amostra. Para selecionados aleatoriamente , pode-se mostrar que este estimador não converge para a variância real, mas para
Se você selecionar amostras aleatoriamente e estimar a média e a variância da amostra, você terá que usar um estimador corrigido (imparcial)
que irá convergir para . O termo de correção também é chamado de correção de Bessel.
Agora, por padrão, o MATLABs
std
calcula o estimador imparcial com o termo de correçãon-1
. No entanto, NumPy (como @ajcr explicado) calcula o estimador tendencioso sem termo de correção por padrão. O parâmetroddof
permite definir qualquer termo de correçãon-ddof
. Definindo para 1, você obtém o mesmo resultado do MATLAB.Da mesma forma, o MATLAB permite adicionar um segundo parâmetro
w
, que especifica o "esquema de pesagem". O default,,w=0
resulta no termo de correçãon-1
(estimador enviesado), enquanto paraw=1
, apenas n é usado como termo de correção (estimador enviesado).fonte
n
ir para o topo da notação de soma, ele ia dentro da soma.Para pessoas que não são boas com estatísticas, um guia simplista é:
Incluir
ddof=1
se estiver calculandonp.std()
para uma amostra retirada de seu conjunto de dados completo.Certifique-
ddof=0
se de que você está calculandonp.std()
para toda a populaçãoO DDOF é incluído para amostras a fim de contrabalançar o viés que pode ocorrer nos números.
fonte