이것은 단지 Numpy 솔루션 일뿐입니다. 함수가 행렬 요소와 평균, 즉 스케일 된 합계에 대한 연산으로 구성된다고 가정합니다. 따라서,
Y = np.power(X-X0, 2)
그래서 우리는 단지 윈도우 평균을 결정 다룰 필요가 같이
Y
보는 것으로 충분하다. 1D 경우에 대해, 1을 적절한 벡터로 갖는 행렬 곱을 평균 계산을 위해 결정할 수 있음을 주목한다.
h = np.array([0, 1, 1, 0]) # same dimension as y
m1 = np.dot(h, y)/2
m2 = (y[1] + y[2])/2
print(m1 == m2) # True
2D 케이스는 유사하지만 두 행렬 곱셈 (행과 열에 각각 하나씩)이 있습니다. 예 :
m_2 = np.dot(np.dot(h, Y), h)/2**2
슬라이딩 윈도우를 구성하려면 다음과 같이 이동 된 윈도우의 매트릭스를 만들어야합니다.
H = [[1, 1, 1, 0, 0, ..., 0],
[0, 1, 1, 1, 0, ..., 0],
.
.
.
[0, ..., 0, 0, 1, 1, 1]]
는
H
구축을위한
S = np.dot(np.dot(H, Y), H.T)
가 (m, m)
윈도우와 (n, n)
매트릭스 전체 예제는 대안하지만, 아마도 약간 덜 효율적인 방법
import numpy as np
n, m = 500, 10
X0 = np.ones((n, n))
X = np.random.rand(n, n)
Y = np.power(X-X0, 2)
h = np.concatenate((np.ones(m), np.zeros(n-m))) # window at position 0
H = np.vstack((np.roll(h, k) for k in range(n+1-m))) # slide the window
M = np.dot(np.dot(H,Y), H.T)/m**2 # calculate the mean
print(M.shape) # (491, 491)
수있는 모든 합계
을 계산 is
평균을 계산 953,210
업데이트
편차가 접근도 가능 제곱. 우리는 W
이 수있는 블록 (m.m)
행렬을 포함하는 (m,n)
매트릭스, 가정
:이를 위해, 우리는 매트릭스의 경우에 벡터 정체성 |x-x0|^2 = (x-x0).T (x-x0) = x.T x - 2 x0.T x + x0.T x0
을 (공백 스칼라 또는 매트릭스 곱셈과 .T
전치 벡터를 의미) 일반화 (k0,k1)
-th (m,m)
부분 행렬을 Y = W Z W.T
으로 추출하고, 여기서 Z
은 데이터를 포함하는 (n,n)
행렬입니다.차분
D = Y - X0 = Y = W Z W.T - X0
계산은 X0
및 D
가 (m,m)
행렬이고, 간단하다. 요소의 제곱합의 제곱근을 Frobenius norm이라고합니다. 그 identities에 기초하여, 우리는
s = sum_{i,j} D_{i,j}^2 = trace(D.T D) = trace((W Z W.T - X0).T (H Z H.T - X0))
= trace(W Z.T W.T W Z W.T) - 2 trace(X0.T W Z W.T) + trace(X0.T X0)
=: Y0 + Y1 + Y2
Y0
가 Y1
가 Z
및 Y2
의 가중 평균으로서 해석 될 수 above.The 기간에서 상기 방법에서 H Z H.T
로 해석 될 수있는 용어로 제곱 합을 쓸 수있는 것은 일정한 , 한 번만 결정하면됩니다. 따라서 , 가능한 구현은 다음과 같습니다
import numpy as np
n, m = 500, 10
x0 = np.ones(m)
Z = np.random.rand(n, n)
Y0 = Z**2
h0 = np.concatenate((np.ones(m), np.zeros(n-m)))
H0 = np.vstack((np.roll(h0, k) for k in range(n+1-m)))
M0 = np.dot(np.dot(H0, Y0), H0.T)
h1 = np.concatenate((-2*x0, np.zeros(n-m)))
H1 = np.vstack((np.roll(h1, k) for k in range(n+1-m)))
M1 = np.dot(np.dot(H1, Z), H0.T)
Y2 = np.dot(x0, x0)
M = (M0 + M1)/m**2 + Y2
그냥 확인, 순수 NumPy와/scipy 솔루션은 허용? (나는 하나를 염두에 둔다) 아니면 Theano를 사용하는 솔루션을 기대합니까? 추신 오타 : "...'X'와'X0' **는 **''10 x 10'' 매트릭스입니다." –
@DavidZ, 순수한 numpy/scipy 솔루션이 적합합니다. 실제로 나는 numpy를 사용하여 솔루션을 찾으려고 애썼지 만 numpy로 처리하는 "기본"방법이 없다고 봅니다 (확실하지는 않지만). 나는 Theano에서 길쌈 레이어를 제공하기 때문에 더 자연 스럽다고 생각했다. (그리고 내가하고 싶은 것은 컨볼 루션과 비슷하다.) – Roman