方差計算的簡單實現
在概率統計中,方差用於衡量一組數據的離散程度,相關的計算公式如下(總體方差):
其中 爲數據的平均值, 而 即是(總體)方差.
相應的實現代碼如下:
-- Lua
function average(values, count)
local sum = 0
for i = 1, count do
sum = sum + values[i]
end
return sum / count
end
function variance(values, count)
local average = average(values, count)
local variance = 0
for i = 1, count do
local delta = values[i] - average
variance = variance + delta * delta
end
return variance / count
end
通常我們需要在獲取新樣本數據時更新方差,簡單的方法就是按照上述公式重新計算一遍,我們可以通過計算數據子集方差的方式來模擬這個過程:
-- Lua
function variance_list(values)
local ret = {}
for i = 1, #values do
ret[i] = variance(values, i)
end
return ret
end
更好的一種方式是通過遞推來計算數據子集的方差,這需要對方差的計算公式做一些變形:
基於此,我們就可以遞推的計算數據子集的方差了,相關的計算複雜度則降低了一個數量級():
-- lua
function variance_list_recurrence(values)
local ret = {}
local pre_square_sum = 0
local pre_sum = 0
for i = 1, #values do
local val = values[i]
pre_square_sum = pre_square_sum + val * val
pre_sum = pre_sum + val
ret[i] = (pre_square_sum - (pre_sum * pre_sum / i)) / i
end
return ret
end