Tìm thấy giải pháp trong một cuốn sách của năm 1972 (George R. Price, Ann. Hum. Genet., Lond, pp485-490, Mở rộng toán học chọn hiệp phương sai, năm 1972) .
Hiệp phương sai mẫu có trọng số:
Σ = 1ΣNi = 1wTôiΣNi = 1wTôi( xTôi- μ*)T( xTôi- μ*)
Và hiệp phương sai mẫu có trọng số không thiên vị được đưa ra bằng cách áp dụng hiệu chỉnh Bessel:
Σ = 1ΣNi = 1wTôi- 1ΣNi = 1wTôi( xTôi- μ*)T( xTôi- μ*)
Trong đó là mẫu có trọng số (không thiên vị) có nghĩa là:μ*
μ∗=∑Ni=1wixi∑Ni=1wi
Lưu ý quan trọng: điều này chỉ hoạt động nếu các trọng số là "lặp lại" các trọng số, nghĩa là mỗi trọng số biểu thị số lần xuất hiện của một quan sát và trong đó đại diện cho cỡ mẫu thực (tổng số mẫu thực, chiếm trọng lượng).N *∑Ni=1wi=N∗N∗
Tôi đã cập nhật bài viết trên Wikipedia, nơi bạn cũng sẽ tìm thấy phương trình cho phương sai mẫu có trọng số không thiên vị:
https://en.wikipedia.org/wiki/ WEighted_arithatures_mean# WEighted_sample_covariance
Lưu ý thực tế: Tôi khuyên bạn trước tiên nên nhân từng cột và và sau đó thực hiện phép nhân ma trận với để bọc mọi thứ lên và tự động thực hiện tổng kết. Ví dụ: trong mã Python Pandas / Numpy:( x i - μ * ) ( x i - μ * )wi(xi−μ∗)(xi−μ∗)
import pandas as pd
import numpy as np
# X is the dataset, as a Pandas' DataFrame
mean = mean = np.ma.average(X, axis=0, weights=weights) # Computing the weighted sample mean (fast, efficient and precise)
mean = pd.Series(mean, index=list(X.keys())) # Convert to a Pandas' Series (it's just aesthetic and more ergonomic, no differenc in computed values)
xm = X-mean # xm = X diff to mean
xm = xm.fillna(0) # fill NaN with 0 (because anyway a variance of 0 is just void, but at least it keeps the other covariance's values computed correctly))
sigma2 = 1./(w.sum()-1) * xm.mul(w, axis=0).T.dot(xm); # Compute the unbiased weighted sample covariance
Đã thực hiện một vài kiểm tra độ tỉnh táo bằng cách sử dụng bộ dữ liệu không trọng số và bộ dữ liệu có trọng số tương đương, và nó hoạt động chính xác.