Skip to content

Commit b60a685

Browse files
authored
Merge pull request #46 from ctgk/develop
Develop
2 parents 0aba5c8 + 5a8557d commit b60a685

103 files changed

Lines changed: 638 additions & 404 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/run-notebooks.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ on:
88
branches: [ main, develop ]
99
pull_request:
1010
branches: [ main, develop ]
11+
schedule:
12+
# run every month on 6th day
13+
- cron: '0 0 6 * *'
1114

1215
jobs:
1316
jupyter-notebooks:

.pre-commit-config.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ repos:
1515
name: Check file encoding
1616
entry: bash -c 'for file in "$@"; do file --mime-encoding $file | grep -q "ascii\|binary"; if [ $? != 0 ]; then echo $file; exit 1; fi; done' --
1717
types: [text]
18-
# - id: flake8
19-
# name: Check Python format
20-
# entry: flake8 --count --show-source --statistics
21-
# language: system
22-
# types: [python]
18+
- id: flake8
19+
name: Check Python format
20+
entry: flake8 --count --show-source --statistics
21+
language: system
22+
types: [python]
2323
- id: unittest
2424
name: Run Python unittests
2525
language: system

notebooks/ch07_Sparse_Kernel_Machines.ipynb

Lines changed: 10 additions & 10 deletions
Large diffs are not rendered by default.

prml/bayesnet/discrete.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import numpy as np
2+
23
from prml.bayesnet.probability_function import ProbabilityFunction
34
from prml.bayesnet.random_variable import RandomVariable
45

@@ -35,7 +36,7 @@ def __init__(self, n_class:int):
3536
self.is_observed = False
3637

3738
def __repr__(self):
38-
string = f"DiscreteVariable("
39+
string = "DiscreteVariable("
3940
if self.is_observed:
4041
string += f"observed={self.proba})"
4142
else:
@@ -201,7 +202,8 @@ def send_message(self, proprange, exclude=None):
201202
if random_variable is not exclude:
202203
self.send_message_to(random_variable, proprange)
203204

204-
if proprange == 0: return
205+
if proprange == 0:
206+
return
205207

206208
for random_variable in self.condition:
207209
if random_variable is not exclude:

prml/clustering/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from .k_means import KMeans
1+
from prml.clustering.k_means import KMeans
22

33

44
__all__ = [

prml/clustering/k_means.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ class KMeans(object):
77
def __init__(self, n_clusters):
88
self.n_clusters = n_clusters
99

10-
def fit(self, X, iter_max=100):
10+
def fit(self, x, iter_max=100):
1111
"""
1212
perform k-means algorithm
1313
1414
Parameters
1515
----------
16-
X : (sample_size, n_features) ndarray
16+
x : (sample_size, n_features) ndarray
1717
input data
1818
iter_max : int
1919
maximum number of iterations
@@ -23,31 +23,31 @@ def fit(self, X, iter_max=100):
2323
centers : (n_clusters, n_features) ndarray
2424
center of each cluster
2525
"""
26-
I = np.eye(self.n_clusters)
27-
centers = X[np.random.choice(len(X), self.n_clusters, replace=False)]
26+
eye = np.eye(self.n_clusters)
27+
centers = x[np.random.choice(len(x), self.n_clusters, replace=False)]
2828
for _ in range(iter_max):
2929
prev_centers = np.copy(centers)
30-
D = cdist(X, centers)
30+
D = cdist(x, centers)
3131
cluster_index = np.argmin(D, axis=1)
32-
cluster_index = I[cluster_index]
33-
centers = np.sum(X[:, None, :] * cluster_index[:, :, None], axis=0) / np.sum(cluster_index, axis=0)[:, None]
32+
cluster_index = eye[cluster_index]
33+
centers = np.sum(x[:, None, :] * cluster_index[:, :, None], axis=0) / np.sum(cluster_index, axis=0)[:, None]
3434
if np.allclose(prev_centers, centers):
3535
break
3636
self.centers = centers
3737

38-
def predict(self, X):
38+
def predict(self, x):
3939
"""
4040
calculate closest cluster center index
4141
4242
Parameters
4343
----------
44-
X : (sample_size, n_features) ndarray
44+
x : (sample_size, n_features) ndarray
4545
input data
4646
4747
Returns
4848
-------
4949
index : (sample_size,) ndarray
5050
indicates which cluster they belong
5151
"""
52-
D = cdist(X, self.centers)
52+
D = cdist(x, self.centers)
5353
return np.argmin(D, axis=1)

prml/dimreduction/autoencoder.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import numpy as np
2+
23
from prml import nn
34

45

prml/dimreduction/bayesian_pca.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import numpy as np
2+
23
from prml.dimreduction.pca import PCA
34

45

@@ -26,7 +27,7 @@ def fit(self, X, iter_max=100, initial="random"):
2627
"""
2728
initial_list = ["random", "eigen"]
2829
self.mean = np.mean(X, axis=0)
29-
self.I = np.eye(self.n_components)
30+
self.eye = np.eye(self.n_components)
3031
if initial not in initial_list:
3132
print("availabel initializations are {}".format(initial_list))
3233
if initial == "random":

prml/dimreduction/pca.py

Lines changed: 40 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ def __init__(self, n_components):
1515
assert isinstance(n_components, int)
1616
self.n_components = n_components
1717

18-
def fit(self, X, method="eigen", iter_max=100):
19-
"""
20-
maximum likelihood estimate of pca parameters
18+
def fit(self, x, method="eigen", iter_max=100):
19+
r"""Maximum likelihood estimate of pca parameters.
20+
2121
x ~ \int_z N(x|Wz+mu,sigma^2)N(z|0,I)dz
2222
2323
Parameters
2424
----------
25-
X : (sample_size, n_features) ndarray
25+
x : (sample_size, n_features) ndarray
2626
input data
2727
method : str
2828
method to estimate the parameters
@@ -46,111 +46,111 @@ def fit(self, X, method="eigen", iter_max=100):
4646
method_list = ["eigen", "em"]
4747
if method not in method_list:
4848
print("availabel methods are {}".format(method_list))
49-
self.mean = np.mean(X, axis=0)
50-
getattr(self, method)(X - self.mean, iter_max)
49+
self.mean = np.mean(x, axis=0)
50+
getattr(self, method)(x - self.mean, iter_max)
5151

52-
def eigen(self, X, *arg):
53-
sample_size, n_features = X.shape
52+
def eigen(self, x, *arg):
53+
sample_size, n_features = x.shape
5454
if sample_size >= n_features:
55-
cov = np.cov(X, rowvar=False)
55+
cov = np.cov(x, rowvar=False)
5656
values, vectors = np.linalg.eigh(cov)
5757
index = n_features - self.n_components
5858
else:
59-
cov = np.cov(X)
59+
cov = np.cov(x)
6060
values, vectors = np.linalg.eigh(cov)
61-
vectors = (X.T @ vectors) / np.sqrt(sample_size * values)
61+
vectors = (x.T @ vectors) / np.sqrt(sample_size * values)
6262
index = sample_size - self.n_components
63-
self.I = np.eye(self.n_components)
63+
self.eye = np.eye(self.n_components)
6464
if index == 0:
6565
self.var = 0
6666
else:
6767
self.var = np.mean(values[:index])
6868

69-
self.W = vectors[:, index:].dot(np.sqrt(np.diag(values[index:]) - self.var * self.I))
70-
self.__M = self.W.T @ self.W + self.var * self.I
69+
self.W = vectors[:, index:].dot(np.sqrt(np.diag(values[index:]) - self.var * self.eye))
70+
self.__M = self.W.T @ self.W + self.var * self.eye
7171
self.C = self.W @ self.W.T + self.var * np.eye(n_features)
7272
if index == 0:
7373
self.Cinv = np.linalg.inv(self.C)
7474
else:
7575
self.Cinv = np.eye(n_features) / np.sqrt(self.var) - self.W @ np.linalg.inv(self.__M) @ self.W.T / self.var
7676

77-
def em(self, X, iter_max):
78-
self.I = np.eye(self.n_components)
79-
self.W = np.eye(np.size(X, 1), self.n_components)
77+
def em(self, x, iter_max):
78+
self.eye = np.eye(self.n_components)
79+
self.W = np.eye(np.size(x, 1), self.n_components)
8080
self.var = 1.
8181
for i in range(iter_max):
8282
W = np.copy(self.W)
83-
stats = self._expectation(X)
84-
self._maximization(X, *stats)
83+
stats = self._expectation(x)
84+
self._maximization(x, *stats)
8585
if np.allclose(W, self.W):
8686
break
87-
self.C = self.W @ self.W.T + self.var * np.eye(np.size(X, 1))
87+
self.C = self.W @ self.W.T + self.var * np.eye(np.size(x, 1))
8888
self.Cinv = np.linalg.inv(self.C)
8989

90-
def _expectation(self, X):
91-
self.__M = self.W.T @ self.W + self.var * self.I
90+
def _expectation(self, x):
91+
self.__M = self.W.T @ self.W + self.var * self.eye
9292
Minv = np.linalg.inv(self.__M)
93-
Ez = X @ self.W @ Minv
93+
Ez = x @ self.W @ Minv
9494
Ezz = self.var * Minv + Ez[:, :, None] * Ez[:, None, :]
9595
return Ez, Ezz
9696

97-
def _maximization(self, X, Ez, Ezz):
98-
self.W = X.T @ Ez @ np.linalg.inv(np.sum(Ezz, axis=0))
97+
def _maximization(self, x, Ez, Ezz):
98+
self.W = x.T @ Ez @ np.linalg.inv(np.sum(Ezz, axis=0))
9999
self.var = np.mean(
100-
np.mean(X ** 2, axis=1)
101-
- 2 * np.mean(Ez @ self.W.T * X, axis=1)
102-
+ np.trace((Ezz @ self.W.T @ self.W).T) / np.size(X, 1))
100+
np.mean(x ** 2, axis=1)
101+
- 2 * np.mean(Ez @ self.W.T * x, axis=1)
102+
+ np.trace((Ezz @ self.W.T @ self.W).T) / np.size(x, 1))
103103

104-
def transform(self, X):
104+
def transform(self, x):
105105
"""
106106
project input data into latent space
107-
p(Z|X) = N(Z|(X-mu)WMinv, sigma^-2M)
107+
p(Z|x) = N(Z|(x-mu)WMinv, sigma^-2M)
108108
109109
Parameters
110110
----------
111-
X : (sample_size, n_features) ndarray
111+
x : (sample_size, n_features) ndarray
112112
input data
113113
114114
Returns
115115
-------
116116
Z : (sample_size, n_components) ndarray
117117
projected input data
118118
"""
119-
return np.linalg.solve(self.__M, ((X - self.mean) @ self.W).T).T
119+
return np.linalg.solve(self.__M, ((x - self.mean) @ self.W).T).T
120120

121-
def fit_transform(self, X, method="eigen"):
121+
def fit_transform(self, x, method="eigen"):
122122
"""
123123
perform pca and whiten the input data
124124
125125
Parameters
126126
----------
127-
X : (sample_size, n_features) ndarray
127+
x : (sample_size, n_features) ndarray
128128
input data
129129
130130
Returns
131131
-------
132132
Z : (sample_size, n_components) ndarray
133133
projected input data
134134
"""
135-
self.fit(X, method)
136-
return self.transform(X)
135+
self.fit(x, method)
136+
return self.transform(x)
137137

138-
def proba(self, X):
138+
def proba(self, x):
139139
"""
140140
the marginal distribution of the observed variable
141141
142142
Parameters
143143
----------
144-
X : (sample_size, n_features) ndarray
144+
x : (sample_size, n_features) ndarray
145145
input data
146146
147147
Returns
148148
-------
149149
p : (sample_size,) ndarray
150150
value of the marginal distribution
151151
"""
152-
d = X - self.mean
152+
d = x - self.mean
153153
return (
154154
np.exp(-0.5 * np.sum(d @ self.Cinv * d, axis=-1))
155155
/ np.sqrt(np.linalg.det(self.C))
156-
/ np.power(2 * np.pi, 0.5 * np.size(X, 1)))
156+
/ np.power(2 * np.pi, 0.5 * np.size(x, 1)))

prml/kernel/__init__.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
from prml.kernel.polynomial import PolynomialKernel
2-
from prml.kernel.rbf import RBF
3-
41
from prml.kernel.gaussian_process_classifier import GaussianProcessClassifier
52
from prml.kernel.gaussian_process_regressor import GaussianProcessRegressor
3+
from prml.kernel.polynomial import PolynomialKernel
4+
from prml.kernel.rbf import RBF
65
from prml.kernel.relevance_vector_classifier import RelevanceVectorClassifier
76
from prml.kernel.relevance_vector_regressor import RelevanceVectorRegressor
87
from prml.kernel.support_vector_classifier import SupportVectorClassifier

0 commit comments

Comments
 (0)