Já que o artigo sobre variância rendeu outro artigo interessante, me empolguei e resolvi escrever como implementar o cálculo da variância em Smalltalk.Como gostei muito da ferramenta e para privilegiar seu foco educacional, vou usar o Squeak.
Abra o System Browser e, se não tiver o pacote
Kodumaro, crie-o. Crie então a categoria Kodumaro-Variance.Crie então a seguinte classe:
FloatArray subclass: #VariantiableArray
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Kodumaro-Variance'Agora os métodos…
Na categoria
math functions, crie o método rms:rms
"Calculates and returns the root mean square"
| aux |
aux := 0.
self do: [ :e |
aux := aux + (e * e)
].
↑ (aux / self size) sqrtÉ claro que poderíamos criar um método para retornar o numerador do cálculo, mas vou fazer diferente. =)
Vamos implementar a variância populacional com média aritmética –
average, herdado de Collection, já que costuma ser um valor mais redondo – e a variância da amostra com média quadrada, ambas também na categoria math functions.populationalVariance
"Calculates and returns the populational variance"
| aux mean |
aux := 0.
mean := self average.
self do: [ :e | | temp |
temp := e - mean.
aux := aux + (temp * temp).
].
↑ aux / self sizeAgora a variância amostral:
sampleVariance
"Calculates and returns the sample variance"
| aux mean |
aux := 0.
mean := self rms.
self do: [ :e | | temp |
temp := e - mean.
aux := aux + (temp * temp).
].
↑ aux / (self size - 1)Está pronto!
— Como assim? Só isso?
É, só isso. =)
Vamos testar, abra um
Workspace e digite:| v |
v := VariantiableArray newFrom: #(1 2 3 4 5).
Transcript
open;
show: 'Média aritmética: ', v average printString; cr;
show: 'Média quadrada: ', v rms printString; cr;
show: 'Variância populacional: ', v populationalVariance printString; cr;
show: 'Variância da amostra: ', v sampleVariance printString; cr.Pressione M-a M-d para executar.
[]'s
Cacilhas, La Batalema
