chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
import unittest
|
||||
import numpy as np
|
||||
from prml import nn
|
||||
|
||||
|
||||
class TestBernoulli(unittest.TestCase):
|
||||
|
||||
def test_bernoulli(self):
|
||||
np.random.seed(1234)
|
||||
obs = np.random.choice(2, 1000, p=[0.1, 0.9])
|
||||
a = nn.Parameter(0)
|
||||
for _ in range(100):
|
||||
a.cleargrad()
|
||||
x = nn.random.Bernoulli(logit=a, data=obs)
|
||||
x.log_pdf().sum().backward()
|
||||
a.value += a.grad * 0.01
|
||||
self.assertAlmostEqual(x.mu.value, np.mean(obs))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
@@ -0,0 +1,22 @@
|
||||
import unittest
|
||||
import numpy as np
|
||||
from prml import nn
|
||||
|
||||
|
||||
class TestCategorical(unittest.TestCase):
|
||||
|
||||
def test_categorical(self):
|
||||
np.random.seed(1234)
|
||||
obs = np.random.choice(3, 100, p=[0.2, 0.3, 0.5])
|
||||
obs = np.eye(3)[obs]
|
||||
a = nn.Parameter(np.zeros(3))
|
||||
for _ in range(100):
|
||||
a.cleargrad()
|
||||
x = nn.random.Categorical(logit=a, data=obs)
|
||||
x.log_pdf().sum().backward()
|
||||
a.value += 0.01 * a.grad
|
||||
self.assertTrue(np.allclose(np.mean(obs, 0), x.mu.value))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
import unittest
|
||||
import numpy as np
|
||||
from prml import nn
|
||||
|
||||
|
||||
class TestCauchy(unittest.TestCase):
|
||||
|
||||
def test_cauchy(self):
|
||||
np.random.seed(1234)
|
||||
obs = np.random.standard_cauchy(size=10000)
|
||||
obs = 2 * obs + 1
|
||||
loc = nn.Parameter(0)
|
||||
s = nn.Parameter(1)
|
||||
for _ in range(100):
|
||||
loc.cleargrad()
|
||||
s.cleargrad()
|
||||
x = nn.random.Cauchy(loc, nn.softplus(s), data=obs)
|
||||
x.log_pdf().sum().backward()
|
||||
loc.value += loc.grad * 0.001
|
||||
s.value += s.grad * 0.001
|
||||
self.assertAlmostEqual(x.loc.value, 1, places=1)
|
||||
self.assertAlmostEqual(x.scale.value, 2, places=1)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
@@ -0,0 +1,28 @@
|
||||
import unittest
|
||||
import numpy as np
|
||||
from prml import nn
|
||||
|
||||
|
||||
class TestDirichlet(unittest.TestCase):
|
||||
|
||||
def test_dirichlet(self):
|
||||
np.random.seed(1234)
|
||||
obs = np.random.choice(3, 100, p=[0.2, 0.3, 0.5])
|
||||
obs = np.eye(3)[obs]
|
||||
a = nn.Parameter(np.zeros(3))
|
||||
for _ in range(100):
|
||||
a.cleargrad()
|
||||
mu = nn.softmax(a)
|
||||
d = nn.random.Dirichlet(np.ones(3) * 10, data=mu)
|
||||
x = nn.random.Categorical(mu, data=obs)
|
||||
log_posterior = x.log_pdf().sum() + d.log_pdf().sum()
|
||||
log_posterior.backward()
|
||||
a.value += 0.01 * a.grad
|
||||
|
||||
count = np.sum(obs, 0) + 10
|
||||
p = count / count.sum(keepdims=True)
|
||||
self.assertTrue(np.allclose(p, mu.value, 1e-2, 1e-2))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
@@ -0,0 +1,21 @@
|
||||
import unittest
|
||||
import numpy as np
|
||||
from prml import nn
|
||||
|
||||
|
||||
class TestExponential(unittest.TestCase):
|
||||
|
||||
def test_exponential(self):
|
||||
np.random.seed(1234)
|
||||
obs = np.random.gamma(1, 1 / 0.5, size=1000)
|
||||
a = nn.Parameter(0)
|
||||
for _ in range(100):
|
||||
a.cleargrad()
|
||||
x = nn.random.Exponential(nn.softplus(a), data=obs)
|
||||
x.log_pdf().sum().backward()
|
||||
a.value += a.grad * 0.001
|
||||
self.assertAlmostEqual(x.rate.value, 0.475135117)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
@@ -0,0 +1,14 @@
|
||||
import unittest
|
||||
import numpy as np
|
||||
from prml import nn
|
||||
|
||||
|
||||
class TestGaussian(unittest.TestCase):
|
||||
|
||||
def test_gaussian(self):
|
||||
self.assertRaises(ValueError, nn.random.Gaussian, 0, -1)
|
||||
self.assertRaises(ValueError, nn.random.Gaussian, 0, np.array([1, -1]))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
import unittest
|
||||
import numpy as np
|
||||
from prml import nn
|
||||
|
||||
|
||||
class TestLaplace(unittest.TestCase):
|
||||
|
||||
def test_laplace(self):
|
||||
obs = np.arange(3)
|
||||
loc = nn.Parameter(0)
|
||||
s = nn.Parameter(1)
|
||||
for _ in range(1000):
|
||||
loc.cleargrad()
|
||||
s.cleargrad()
|
||||
x = nn.random.Laplace(loc, nn.softplus(s), data=obs)
|
||||
x.log_pdf().sum().backward()
|
||||
loc.value += loc.grad * 0.01
|
||||
s.value += s.grad * 0.01
|
||||
self.assertAlmostEqual(x.loc.value, np.median(obs), places=1)
|
||||
self.assertAlmostEqual(x.scale.value, np.mean(np.abs(obs - x.loc.value)), places=1)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
@@ -0,0 +1,33 @@
|
||||
import unittest
|
||||
import numpy as np
|
||||
from prml import nn
|
||||
|
||||
|
||||
class TestMultivariateGaussian(unittest.TestCase):
|
||||
|
||||
def test_multivariate_gaussian(self):
|
||||
self.assertRaises(ValueError, nn.random.MultivariateGaussian, np.zeros(2), np.eye(3))
|
||||
self.assertRaises(ValueError, nn.random.MultivariateGaussian, np.zeros(2), np.eye(2) * -1)
|
||||
|
||||
x_train = np.array([
|
||||
[1., 1.],
|
||||
[1., -1],
|
||||
[-1., 1.],
|
||||
[-1., -2.]
|
||||
])
|
||||
mu = nn.Parameter(np.ones(2))
|
||||
cov = nn.Parameter(np.eye(2) * 2)
|
||||
for _ in range(1000):
|
||||
mu.cleargrad()
|
||||
cov.cleargrad()
|
||||
x = nn.random.MultivariateGaussian(mu, cov + cov.transpose(), data=x_train)
|
||||
log_likelihood = x.log_pdf().sum()
|
||||
log_likelihood.backward()
|
||||
mu.value += 0.1 * mu.grad
|
||||
cov.value += 0.1 * cov.grad
|
||||
self.assertTrue(np.allclose(mu.value, x_train.mean(axis=0)))
|
||||
self.assertTrue(np.allclose(np.cov(x_train, rowvar=False, bias=True), x.cov.value))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user