我需要計算資料集的樣本方差,直到第 n 個元素,例如
x = np.random.randint(1, 7, 10)
--> [5 2 2 5 3 5 2 5 4 2]
快速簡便的方法是使用 np.var(x) 或 Welfords 演算法的實作,但那些只計算整個資料集的方差。對于我的應用程式,我需要在陣列中明智地使用方差元素,以便在第 n 個元素中,它將是與資料集中第一個第 n 個資料點的方差。
例如:
x_var[2]
--> variance of [5 2 2]
--> 1.7320508
x_var[9]
--> variance of [5 2 2 5 3 5 2 5 4 2]
--> 2.0555556
我的解決方案是將陣列分成 n 個陣列,這樣我就可以在每個陣列上使用 np.var 來獲得運行方差。這可行,但速度非常慢。
for i in range(0,n):
x_var[i] = np.var(x[:i])
我已經快速實作了運行均值,所以我有一個陣列,其均值直到第 n 個條目中的第 n 個元素,如果有幫助的話。
如果不將陣列分成 n 塊,您將如何有效且準確地解決這個問題?
uj5u.com熱心網友回復:
一個簡單的方法是使用pandaswithexpanding和var(ddof=0):
import numpy as np
import pandas as pd
x = np.array([5, 2, 2, 5, 3, 5, 2, 5, 4, 2])
pd.Series(x).expanding().var(ddof=0).to_numpy()
輸出:
array([0. , 2.25 , 2. , 2.25 , 1.84 ,
1.88888889, 1.95918367, 1.984375 , 1.77777778, 1.85 ])
uj5u.com熱心網友回復:
我實際上也會采用 pandas 方法。但是,使用不需要切片的純 numpy 的一種可能解決方案是
def running_mean(x:np.array) -> np.array:
return np.cumsum(x) / np.arange(1,len(x) 1)
def running_var(x:np.array) -> np.array:
means = running_mean(x)
return ((np.tril(x) - np.triu(means).T) ** 2).sum(axis=1) / np.arange(1,len(x) 1)
因此,基本上使用運行均值函式,但將其轉換為三角矩陣并從那里進行數學運算。由于創建了大小為 N x N 的三角形矩陣,因此對于較大的 x,這可能會變得很慢。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/413803.html
標籤:
