私は病気のリスクモデルの一部として、(Python/numpyの)論文から計算を実装しようとしています。次の行列演算:ハット行列の対角を効率的に計算する:inv(X'WX) 'X'
:
- X [NM]。 mは(1..200)適度な大きさであるが、nは非常に大きく(> 500K)である
- Wは[NN]であり、過度に大部分であるが、唯一の対角線
また、Qの対角要素を出力するだけでよいです。
私はこれを効率的に計算することができるいくつかの魔法の行列の魔法がありますか?
注:
paperは、次のように私は(信じて)implementation in Rがこれを行うあります
Qdiag <- lm.influence(lm(y ~ X-1, weights=W))$hat/W
Rのdocs for lm.influence$hatが、これは「『帽子』行列の対角を含むベクトルを与えると言います。 "私は帽子の行列(==影響または投影行列)のWikipedia's definitionが少し違って見えますが、ちょっと好きですか?
-
私は次のように有効な(ナイーブ)の実装だと思います。それは私がそれはいくつかの密度 - とブラックボックスとして扱い、ハードウェアの前提与えられたことは不可能だと述べ、今削除されたコメントで(大nは
m = 3
n = 20 # 500000 -- out of memory for large n
np.random.seed(123)
X = np.random.random((n,m))
W = np.random.random(n)
W = np.diag(W)
xtwx = X.T.dot(W.dot(X))
xtwxi = np.linalg.pinv(xtwx)
xtwxixt = xtwxi.dot(X.T)
Q = X.dot(xtwxixt)
Qdiag = np.diag(Q)
print Qdiag.shape, Qdiag.sum() # Checksum of output
print Qdiag
Xが密集しています。 Wは密なベクトルから構成されていますが、対角線に沿った値しか持っていません。 – user48956
一般的に、周囲の仕事の入力と出力は密集しています。 – user48956
そしてなぜmの番号を与えないのですか?さらに、偽データ生成コードをいくつか追加してください。 – sascha