import numpy as np
def compute_mape(var, var_hat):
return np.sum(np.abs(var - var_hat) / var) / var.shape[0]
def compute_rmse(var, var_hat):
return np.sqrt(np.sum((var - var_hat) ** 2) / var.shape[0])
def laplacian(T, tau):
ell = np.zeros(T)
ell[0] = 2 * tau
for k in range(tau):
ell[k + 1] = -1
ell[-k - 1] = -1
return ell
def prox_2d(z, w, lmbda, denominator):
N, T = z.shape
temp = np.fft.fft2(lmbda * z - w) / denominator
temp1 = 1 - N * T / (lmbda * np.abs(temp))
temp1[temp1 <= 0] = 0
return np.fft.ifft2(temp * temp1).real
def update_z(y_train, pos_train, x, w, lmbda, eta):
z = x + w / lmbda
z[pos_train] = (lmbda / (lmbda + eta) * z[pos_train]
+ eta / (lmbda + eta) * y_train)
return z
def update_w(x, z, w, lmbda):
return w + lmbda * (x - z)
def LCR_2d(y_true, y, lmbda, gamma, tau, maxiter = 50):
eta = 100 * lmbda
N, T = y.shape
pos_train = np.where(y != 0)
y_train = y[pos_train]
pos_test = np.where((y_true != 0) & (y == 0))
y_test = y_true[pos_test]
z = y.copy()
w = y.copy()
ell_s = np.zeros(N)
ell_s[0] = 1
ell_t = laplacian(T, tau)
denominator = lmbda + gamma * np.fft.fft2(np.outer(ell_s, ell_t)) ** 2
del y_true, y
show_iter = 20
for it in range(maxiter):
x = prox_2d(z, w, lmbda, denominator)
z = update_z(y_train, pos_train, x, w, lmbda, eta)
w = update_w(x, z, w, lmbda)
if (it + 1) % show_iter == 0:
print(it + 1)
print(compute_mape(y_test, x[pos_test]))
print(compute_rmse(y_test, x[pos_test]))
print()
return x
import numpy as np
np.random.seed(1000)
dense_mat = np.load('../datasets/California-data-set/pems-w1.npz')['arr_0']
for t in range(2, 5):
dense_mat = np.append(dense_mat, np.load('../datasets/California-data-set/pems-w{}.npz'.format(t))['arr_0'],
axis = 1)
dim1, dim2 = dense_mat.shape
missing_rate = 0.3
sparse_mat = dense_mat * np.round(np.random.rand(dim1, dim2) + 0.5 - missing_rate)
import time
start = time.time()
N, T = sparse_mat.shape
lmbda = 1e-5 * N * T
gamma = 5 * lmbda
tau = 2
maxiter = 100
x = LCR_2d(dense_mat, sparse_mat, lmbda, gamma, tau, maxiter)
end = time.time()
print('Running time: %d seconds.'%(end - start))
20 0.019326063590590074 1.8469075189503177 40 0.018291349703718655 1.7642514833071652 60 0.017830019277746346 1.7281949411865851 80 0.01756314882867062 1.7079867630076375 100 0.017395301266413966 1.695600518352902 Running time: 1749 seconds.
import numpy as np
np.random.seed(1000)
dense_mat = np.load('../datasets/California-data-set/pems-w1.npz')['arr_0']
for t in range(2, 5):
dense_mat = np.append(dense_mat, np.load('../datasets/California-data-set/pems-w{}.npz'.format(t))['arr_0'],
axis = 1)
dim1, dim2 = dense_mat.shape
missing_rate = 0.5
sparse_mat = dense_mat * np.round(np.random.rand(dim1, dim2) + 0.5 - missing_rate)
import time
start = time.time()
N, T = sparse_mat.shape
lmbda = 1e-5 * N * T
gamma = 5 * lmbda
tau = 2
maxiter = 100
x = LCR_2d(dense_mat, sparse_mat, lmbda, gamma, tau, maxiter)
end = time.time()
print('Running time: %d seconds.'%(end - start))
20 0.020921699715046062 1.9864663623668373 40 0.019730134355872713 1.9048773274011586 60 0.01927821116423975 1.8718854112852188 80 0.01902399119045938 1.8536975914702196 100 0.01886408720149061 1.8425064963220812 Running time: 1726 seconds.
import numpy as np
np.random.seed(1000)
dense_mat = np.load('../datasets/California-data-set/pems-w1.npz')['arr_0']
for t in range(2, 5):
dense_mat = np.append(dense_mat, np.load('../datasets/California-data-set/pems-w{}.npz'.format(t))['arr_0'],
axis = 1)
dim1, dim2 = dense_mat.shape
missing_rate = 0.7
sparse_mat = dense_mat * np.round(np.random.rand(dim1, dim2) + 0.5 - missing_rate)
import time
start = time.time()
N, T = sparse_mat.shape
lmbda = 1e-5 * N * T
gamma = 5 * lmbda
tau = 2
maxiter = 100
x = LCR_2d(dense_mat, sparse_mat, lmbda, gamma, tau, maxiter)
end = time.time()
print('Running time: %d seconds.'%(end - start))
20 0.02807437273978388 2.424408471717167 40 0.022833820006265604 2.1934042499644177 60 0.02240215349961558 2.171363927117896 80 0.022197398356892824 2.1601976274047887 100 0.022074589919512364 2.1533054374448373 Running time: 1698 seconds.
import numpy as np
np.random.seed(1000)
dense_mat = np.load('../datasets/California-data-set/pems-w1.npz')['arr_0']
for t in range(2, 5):
dense_mat = np.append(dense_mat, np.load('../datasets/California-data-set/pems-w{}.npz'.format(t))['arr_0'],
axis = 1)
dim1, dim2 = dense_mat.shape
missing_rate = 0.9
sparse_mat = dense_mat * np.round(np.random.rand(dim1, dim2) + 0.5 - missing_rate)
import time
start = time.time()
N, T = sparse_mat.shape
lmbda = 1e-5 * N * T
gamma = 5 * lmbda
tau = 2
maxiter = 100
x = LCR_2d(dense_mat, sparse_mat, lmbda, gamma, tau, maxiter)
end = time.time()
print('Running time: %d seconds.'%(end - start))
20 0.07685129604529177 5.507472158793369 40 0.03819965707146848 3.2261222305931962 60 0.034539328825466634 3.0823587146102795 80 0.034110402049302456 3.0710646678583235 100 0.034026685858232784 3.0705641511045876 Running time: 1672 seconds.