Repository: milaan9/Clustering_Algorithms_from_Scratch
Branch: main
Commit: 2dcef05b087a
Files: 60
Total size: 15.5 MB
Directory structure:
gitextract_1u4gek_a/
├── 01_MATLAB/
│ ├── Clustering.m
│ ├── README.md
│ ├── data/
│ │ ├── toy_clustering.mat
│ │ └── toy_subspace_clustering.mat
│ ├── lib/
│ │ ├── DBSCAN.m
│ │ ├── Entropy_Weighting_Subspace_Kmeans.m
│ │ ├── Gaussian_Mixture.m
│ │ ├── ISODATA.m
│ │ ├── Kmeans.m
│ │ ├── Kmeanspp.m
│ │ ├── LVQ.m
│ │ ├── Mean_Shift.m
│ │ └── Subspace_Kmeans.m
│ └── tool/
│ ├── GenerateDataset.m
│ └── PlotData.m
├── 02_Python/
│ ├── A_Star.py
│ ├── Collaborative_Filtering.py
│ ├── DBSCAN.py
│ ├── Decision_Trees.py
│ ├── Dimensionality_Reduction/
│ │ └── Dimensionality_Reduction.ipynb
│ ├── Discrete_Cosine_Transform_(DCT)/
│ │ └── Discrete_Cosine_Transform.ipynb
│ ├── FP_Growth.py
│ ├── Genetic_Algorithm.py
│ ├── K-Means_Implementation/
│ │ ├── Iris.csv
│ │ ├── K-Means_Clustering_on_Iris_Dataset.ipynb
│ │ ├── Links.txt
│ │ └── README.md
│ ├── K_Means.py
│ ├── K_Nearest_Neighbours.py
│ ├── K_Nearest_Neighbours_In_Parallel.py
│ ├── Linear_Regression.py
│ ├── Logistic_Regression.py
│ ├── MSCRED/
│ │ ├── cnn_lstm/
│ │ │ ├── Untitled.ipynb
│ │ │ ├── __init__.py
│ │ │ ├── convlstm-update.py
│ │ │ ├── convlstm.ipynb
│ │ │ ├── convlstm.py
│ │ │ ├── evaluation.ipynb
│ │ │ ├── evalution.py
│ │ │ ├── generation_signature_matrice.ipynb
│ │ │ ├── generation_signature_matrice.py
│ │ │ ├── report.txt
│ │ │ └── utils.py
│ │ └── data/
│ │ └── synthetic_data_with_anomaly-s-1.csv
│ ├── Mean_Shift.py
│ ├── Naive_Bayes.py
│ ├── README.md
│ ├── Random_Forest_Classifier.py
│ ├── Support_Vector_Machine.py
│ └── data/
│ ├── chronic_kidney_disease.csv
│ ├── concentric_circles.csv
│ ├── cron_jobs_schedule.csv
│ ├── graph.in
│ ├── ipl.csv
│ ├── iris.csv
│ ├── logistic_regression_data.txt
│ ├── titanic-subset.csv
│ └── titanic.csv
├── LICENSE
└── README.md
================================================
FILE CONTENTS
================================================
================================================
FILE: 01_MATLAB/Clustering.m
================================================
function [centroid, result] = Clustering(data, method, varargin)
% Currently, following clustering algorithms are supported:
% 1. Kmeans
% 2. Kmeans++
% 3. ISODATA (Iterative Self-Organizing Data Analysis)
% 4. Mean Shift
% 5. DBSCAN (Density-Based Spatial Clustering of Application with Noise)
% 6. Gaussian Mixture Model /* Numerical instability problem not completely solved*/
% 7. LVQ (Learning Vector Quantization)
addpath('.\lib');
addpath('.\tool');
% Validate input parameters
if((strcmp(method,'kmeans') || strcmp(method,'kmeans++')) && (size(varargin,2) ~= 2))
error('The value of K should be predefined when using k-means and k-means++.');
elseif((strcmp(method,'isodata') || strcmp(method,'ISODATA')) && (size(varargin,2) < 5))
error('Not enough input arguments for ISODATA. Please use help for more information.');
elseif((strcmp(method,'mean_shift') || strcmp(method,'Mean_Shift')) && (size(varargin,2) ~= 1))
error('Invalid number of input arguments for mean shift.');
elseif((strcmp(method,'dbscan') || strcmp(method,'DBSCAN')) && (size(varargin, 2) ~= 2))
error('Invalid number of input arguments for dbscan.');
elseif((strcmp(method,'GMM') || strcmp(method,'gmm')) && (size(varargin, 2) ~= 2))
error('Invalid number of input arguments for Gaussian Mixture Model');
elseif((strcmp(method,'LVQ') || strcmp(method,'lvq')) && (size(varargin, 2) ~= 5))
error('Invalid number of input arguments for Learning Vector Quantization');
end
% Method entries
% Kmeans
if(strcmp(method,'kmeans'))
k = varargin{1,1};
iteration = varargin{1,2};
[centroid, result] = Kmeans(data, k, iteration);
PlotData(data, result, centroid);
% Kmeans++
elseif(strcmp(method,'kmeans++') || strcmp(method,'kmeanspp'))
k = varargin{1,1};
iteration = varargin{1,2};
[centroid, result] = Kmeanspp(data, k, iteration);
PlotData(data, result, centroid);
% ISODATA
elseif(strcmp(method,'ISODATA') || strcmp(method,'isodata'))
desired_k = varargin{1,1}; % desired number of classes
iteration = varargin{1,2}; % maximum iteration time
minimum_n = varargin{1,3}; % minimum number of samples in one class
maximum_variance = varargin{1,4}; % maximum allowed variance of samples in one class
minimum_d = varargin{1,5}; % minimum distance between two classes
[centroid, result] = ISODATA(data, iteration, desired_k, minimum_n, maximum_variance, minimum_d);
PlotData(data, result, centroid);
% Mean Shift
elseif(strcmp(method,'mean_shift') || strcmp(method,'Mean_Shift'))
thr = varargin{1,1}; % distance threshold
[centroid, result] = Mean_Shift(data, thr);
PlotData(data, result, centroid);
% DBSCAN
elseif(strcmp(method,'dbscan') || strcmp(method,'DBSCAN'))
epsilon = varargin{1,1}; % distance threshold for finding neighbors
minPts = varargin{1,2}; % minimum required number of neighbor points for adding one core object
centroid = nan; % DBSCAN will not calculate centroid
result = DBSCAN(data, epsilon, minPts);
PlotData(data, result);
% Gaussian Mixture Model
elseif(strcmp(method,'GMM') || strcmp(method,'gmm'))
k = varargin{1,1}; % the number of Guassian components
iter = varargin{1,2}; % maximum number of iterations
[result, ~, centroid, ~] = Gaussian_Mixture(data, k, iter);
PlotData(data, result, centroid);
% Learning Vector Quantization
elseif(strcmp(method,'LVQ') || strcmp(method,'lvq'))
q = varargin{1,1}; % the number of prototypes
neta = varargin{1,2}; % learning rate
x = varargin{1,3}; % training data
y = varargin{1,4}; % label of x
iter = varargin{1,5}; % maximum number of iterations
[centroid, result] = LVQ(data, q, neta, x, y, iter);
PlotData(data, result, centroid);
else
error('NotImplementedError!');
end
end
================================================
FILE: 01_MATLAB/README.md
================================================
# Clustering Algorithms with MATLAB
## 1. Clustering Algorithms
- **K-means**
- **K-means** algorithm performs the division of data points into 'K' clusters that share similarities and are dissimilar to the objects belonging to another cluster where, each data point belongs to the cluster with the nearest mean (cluster centers or cluster centroids), serving as a prototype of the cluster. The term 'K' is a number. You need to tell the system how many clusters you need to create. For example, K = 2 refers to two clusters.
- **K-means++**
- Generally speaking, **K-means++** algorithm is similar to **K-means**;
- Unlike classic K-means randomly choosing initial centroids, a better initialization procedure is integrated into **K-means++**, where observations far from existing centroids have higher probabilities of being chosen as the next centroid.
- The initializeation procedure can be achieved using Fitness Proportionate Selection.
- **ISODATA (Iterative Self-Organizing Data Analysis)**
- To be brief, **ISODATA** introduces two additional operations: Splitting and Merging;
- When the number of observations within one class is less than one pre-defined threshold, **ISODATA** merges two classes with minimum between-class distance;
- When the within-class variance of one class exceeds one pre-defined threshold, **ISODATA** splits this class into two different sub-classes.
- **Mean Shift**
- For each point *x*, find neighbors, calculate mean vector *m*, update *x = m*, until *x == m*;
- Non-parametric model, no need to specify the number of classes;
- No structure priori.
- **DBSCAN (Density-Based Spatial Clustering of Application with Noise)**
- Starting with pre-selected core objects, DBSCAN extends each cluster based on the connectivity between data points;
- DBSCAN takes noisy data into consideration, hence robust to outliers;
- Choosing good parameters can be hard without prior knowledge;
- **Gaussian Mixture Model (GMM)**
- **LVQ (Learning Vector Quantization)**
## 2. Subspace Clustering Algorithms
- **Subspace K-means**
- This algorithm directly extends **K-means** to Subspace Clustering through multiplying each dimension *dj* by one weight *mj* (s.t. sum(*mj*)=1, *j*=1,2,...,*p*);
- It can be efficiently sovled in an Expectation-Maximization (EM) fashion. In each E-step, it updates weights, centroids using Lagrange Multiplier;
- This rough algorithm suffers from the problem on its favor of using just a few dimensions when clustering sparse data;
- **Entropy-Weighting Subspace K-means**
- Generally speaking, this algorithm is similar to **Subspace K-means**;
- In addition, it introduces one regularization item related to weight entropy into the objective function, in order to mitigate the aforementioned problem in **Subspace K-means**.
- Apart from its succinctness and efficiency, it works well on a broad range of real-world datasets.
================================================
FILE: 01_MATLAB/lib/DBSCAN.m
================================================
function label = DBSCAN(data, eps, minPts)
% label = DBSCAN(data, epsilon, minPts)
% Main part of DBSCAN (Density-Based Spatial Clustering of Application with
% Noise)clustering algorithm.
% ----
% Args:
% data: data to be clustered (n * p)
% eps: distance threshold for finding neighbors
% minPts: minimum required number of neighbor observations for one core object
% ----
% Returns:
% label: corresponding class for each observation
% Initialization
core_object = [];
count = 1;
k = 1; % label index
vmask = ones(size(data, 1), 1); % variable used to record whether one observation has been visited (1: not visited, 0: visited)
label = zeros(size(data, 1), 1); % pre-allocate result
% Find core objects
for i = 1:size(data, 1)
x = data(i, :); % current observation of interests
[~, neighbors] = Find_Neighbor(data, x, eps);
% Check if the number of observations in neighbors of x is larger than minPts
if((size(neighbors,1)-1) >= minPts)
% Add the index of x to the set of core object
core_object(count, 1) = i;
count = count + 1;
end
end
fprintf('---- DBSCAN finds a total number of %i core objects ----\n', size(core_object, 1));
while(~isempty(core_object))
% Construct one queue for further use
queue = [];
qcount = 1;
% Update core_object, observations have been visited should be deleted
tcount = 1;
list = [];
for i = 1:size(core_object, 1)
if(vmask(core_object(i, 1),1) == 0)
list(tcount ,1) = i;
tcount = tcount + 1;
end
end
core_object(list,:) = [];
if(isempty(core_object))
break;
end
% Randomly choose one core object
index = core_object(randi(size(core_object, 1)), 1);
queue(qcount, 1) = index; % add the selected core object to the queue
qcount = qcount + 1;
vmask(index, 1) = 0; % update vmask
label(index, 1) = k; % assign result
core_object(core_object == index, :) = []; % remove the selected core object from the set
while(~isempty(queue))
pivot = queue(1, 1);
queue(1, :) = []; % remove the first element in queue
qcount = qcount - 1;
% Find neighbors for current observation of interests
[tindex, tneighbors] = Find_Neighbor(data, data(pivot, :), eps);
if(size(tneighbors, 1) >= minPts)
for i = 1 : size(tindex, 1)
% If one neighbor has not been visited, add it to the queue
if(vmask(tindex(i, 1),1) == 1)
queue(qcount, 1) = tindex(i, 1);
qcount = qcount + 1;
vmask(tindex(i, 1),1) = 0; % update vmask
label(tindex(i, 1),1) = k; % assign result
end
end
end
end
fprintf('---- Finish finding observations for class %i ----\n', k);
k = k + 1; % next class
end
end
function d = Eculidean_Distance(x1, x2)
% Calculate eculidean distance between x1 and x2.
%
% Args:
% x1: observation 1
% x2: observation 2
%
% Returns:
% d: Eculidean distance between x1 and x2
d = sqrt((x1 - x2) * (x1 - x2)');
end
function [index, neighbors] = Find_Neighbor(data, x, eps)
% Find neighbors for x, where neighbors are defined to be observations in data
% with eculidean distance from x smaller than epsilon.
%
% Args:
% data: dataset
% x: current observation of interests
% eps: pre-defined distance threshold
%
% Returns:
% index: the index of these neighbors in data
% neighbors: neighbor set of x
neighbors = []; % pre-allocate neighbor result
count = 1;
for i = 1 : size(data,1)
d = Eculidean_Distance(data(i,:), x);
if(d <= eps)
index(count, 1) = i;
neighbors(count,:) = data(i,:);
count = count + 1;
end
end
end
================================================
FILE: 01_MATLAB/lib/Entropy_Weighting_Subspace_Kmeans.m
================================================
function [centroid, dimension_weight, class] = Entropy_Weighting_Subspace_Kmeans(data, iteration, K, beta, lambda, verbose)
% Pre-allocate weights
centroid = zeros(K,size(data,2)); % centroid for each class
class = zeros(size(data,1),1); % classification result for each observation
dimension_weight = ones(K,size(data,2)); % weights for each dimension in each class
% Initialization
n = size(data,1);
J = 0; % used to record objective function value
% First round
centroid = data(unidrnd(n,K,1),:); % randomly choose K initial centroids
dimension_weight = 1/size(data,2) * dimension_weight; % initialize weights for each dimension using uniform distribution
% Partially optimization
for i = 1:iteration
J0 = J;
% body part
class = classify(centroid,dimension_weight,data);
centroid = centroid_update(centroid,data,class);
[dimension_weight,J] = dimension_weight_update(K,centroid,class,dimension_weight,data,beta,lambda);
% whether display intermediate information
if(verbose == 1)
disp(['Objective Function(J) Value: ',num2str(J)]);
end
% early stop condition
if(abs(J-J0)<1e-9)
fprintf('*** Clustering terminates after %i iterations ***\n',i);
break;
end
end
end
% Details on the scheme of updating dimension weights
function [alpha,J] = dimension_weight_update(K,m,c,alpha,data,beta)
% Under writting...
end
function [result] = classify(m,alpha,data)
result = zeros(size(data,1),1);
% Construct temporary matrix for efficiently computing dimention-weighted distance
matrix = zeros(size(m,1),size(data,2));
for i = 1:size(result,1)
for j = 1:size(m,1)
matrix(j,:) = (m(j,:)-data(i,:)) .* (m(j,:)-data(i,:));
end
temp = sum(alpha .* matrix,2);
% To avoid more than one class having the minimum distance.
t_index = find(temp == min(temp));
result(i,1) = t_index(1,1);
end
end
function [m] = centroid_update(m,data,c)
for i = 1:size(m,1)
if(~isempty(data(c==i,:)))
m(i,:) = mean(data(c==i,:),1);
else
continue;
end
end
end
================================================
FILE: 01_MATLAB/lib/Gaussian_Mixture.m
================================================
function [label, alpha, miu, sigma] = Gaussian_Mixture(data, k, iter)
% function [label, alpha, miu, sigma] = Gaussian_Mixture(data, k)
% Use gaussian mixture model (GMM) to conduct data clustering. GMM uses
% probability model to characterize prototypes for each class.
% ----
% Args:
% data: data to be clustered (n * p)
% k: the number of guassian components (scalar)
% iter: maximum number of iterations (scalar)
% ----
% Returns:
% label: corresponding class for each observation (n * 1)
% alpha: mixing coefficient for each gaussian component (k * 1) && (sum(alpha) == 1)
% miu: mean value for each gaussian component (k * p)
% sigma: coefficient matrix for each gaussian component (cell: k * n * n)
% Initialization
alpha = ones(k, 1) / k;
miu = data(randperm(size(data,1),k)',:);
for i = 1 : k
sigma{i, 1} = rand * eye(size(data, 2));
end
label = zeros(size(data, 1), 1);
p = Posteriori(data, k, alpha, miu, sigma); % calculate posteriori probability
for i = 1 : iter
% M-Step
for j = 1 : k
sump = sum(p(:, j));
% Update parameters
tmiu = zeros(1, size(data, 2));
for num = 1 : size(data, 1)
tmiu = tmiu + p(num, j) * data(num, :);
end
miu(j, :) = tmiu / sump;
tsigma = zeros(size(data, 2));
for num = 1 : size(data, 1)
tsigma = tsigma + p(num, j) * (data(num, :) - miu(j, :))' * (data(num, :) - miu(j, :));
end
sigma{j, 1} = tsigma / sump;
alpha(j, 1) = sump / size(data, 1); % mixing coefficient
end
% E-Step
p = Posteriori(data, k, alpha, miu, sigma);
end
[~, label] = max(p,[], 2); % classification
end
function p = Posteriori(data, k, alpha, miu, sigma)
% function p = Posteriori(data, alpha, miu, sigma)
% Calculate posteriori probability for each observation and each class. The
% output p is of the size n * p, the entry (i,j) represents the probability
% that observation i belongs to class j.
% ----
% Args:
% data, k, alpha, miu, sigma: same to the function Gaussian_Mixture
% ----
% Returns:
% p: posteriori probability for each observation and each class (n * k)
% Pre-allocate result
p = zeros(size(data, 1), k);
for i = 1 : size(data, 1)
sump = 0; % normalizing factor
for j = 1 : k
tx = data(i, :) - miu(k, :); % x - miu
sigma{j,1} = sigma{j,1} + 1e-6*eye(size(data,2)); % for numerical stability
inv_sigma = inv(sigma{j, 1});
upper = -0.5 * tx * inv_sigma * tx';
p(i, j) = alpha(j, 1) * exp(upper) / sqrt((2*pi)^(size(data,2))*abs(det(sigma{j,1})));
sump = sump + p(i, j);
end
p(i, :) = p(i, :) / sump;
end
end
================================================
FILE: 01_MATLAB/lib/ISODATA.m
================================================
function [centroid, result] = ISODATA(data, iteration, desired_k, minimum_n, maximum_variance, minimum_d)
% Pre-allocate result
centroid = data(randperm(size(data,1),desired_k)', :);
distance_matrix = zeros(size(data,1), desired_k);
result = zeros(size(data,1),1);
for i = 1 : iteration
previous_centroid = centroid;
for j = 1 : size(distance_matrix,1)
for k = 1 : size(distance_matrix,2)
distance_matrix(j,k) = sqrt(sum((data(j,:)-centroid(k,:)) .^ 2));
end
end
[~,result] = min(distance_matrix,[],2);
% Whether the number of points in each class is smaller than minimum_n
for j = 1 : size(centroid, 1)
if(isempty(find(result == j,1)) || (size(find(result == j),1) < minimum_n))
% One class with number of points in it less than minimum_n
% should be deleted, along with records in the distance_matrix
centroid(j,:) = [];
distance_matrix(:,j) = [];
% Re-assign each point to its closet neighbor class
[~,result] = min(distance_matrix,[],2);
% Recalculate centroids
for k = 1:size(centroid,1)
centroid(k,:) = mean(data(result(:,1) == k,:));
end
end
end
% Check if combining and splitting are needed
% Case 1: too few classes
if(size(centroid,1) <= (desired_k/2))
% Split
[centroid] = ISODATA_split(data, centroid, result, minimum_n, maximum_variance);
% Case 2: too many classes
elseif(size(centroid,1) > (2*desired_k))
% Combine
[centroid] = ISODATA_combine(centroid, result, minimum_d);
end
if(previous_centroid == centroid)
fprintf('Clustering over after %i iterations...\n', i);
break;
end
end
end
% Splitting
function [centroid] = ISODATA_split(data, centroid, current_result, minimum_n, maximum_variance)
[centroid_x, centroid_y] = size(centroid);
variance_matrix = zeros(centroid_x, centroid_y); % pre-allocate the variance matrix
for i = 1 : centroid_x
for j = 1 : centroid_y
variance_matrix(i,j) = var(data(current_result == i,j));
end
end
class_variance = max(variance_matrix,[],2); % find the greatest one-dimension variance per class
for i = 1 : centroid_x
if((class_variance(i,1) > maximum_variance) && size(find(current_result == i),1) > (2*minimum_n))
% The current class should be splitted into two different classes
centroid(i,:) = centroid(i,:) + sqrt(maximum_variance);
centroid(end+1,:) = centroid(i,:) - sqrt(maximum_variance); % add one new class to centroid set
end
end
end
% Combining
function [centroid] = ISODATA_combine(centroid, current_result, minimum_d)
centroid_x = size(centroid,1);
class_distance_matrix = zeros(centroid_x, centroid_x);
% Calculate distances between two different classes
for i = 1 : x
for j = 1 : x
if(i ~= j)
class_distance_matrix(i,j) = sqrt(sum((centroid(i,:)-centroid(j,:)) .^ 2));
end
end
end
% Combining two classes
for i = 1 : x
for j = 1 : x
if((i ~= j) && (class_distance_matrix(i,j) < minimum_d))
n1 = size(find(current_result == i),1);
n2 = size(find(current_result == j),1);
centroid(i,:) = (1/(n1+n2)) * (n1 * centroid(i,:) + n2 * centroid(j,:));
centroid(j,:) = [];
break; % the number of combining operation is limited to 1 within each iteration
end
end
end
end
================================================
FILE: 01_MATLAB/lib/Kmeans.m
================================================
function [centroid, class] = Kmeans(data, k, iteration)
% Main part of Kmeans clustering algorithm.
%
% Args:
% data: data to be clustered (n * p)
% k: the number of classes
% iteration: maximum number of iterations
%
% Returns:
% centroid: clustering centroids for all classes
% class: corresponding class for all samples
% Choose k initial centroids randomly
centroid = data(randperm(size(data,1),k)', :);
% Record distances between samples and centroids
distance_matrix = zeros(size(data,1), k);
% Pre-allocate result
class = zeros(size(data,1),1);
for i = 1:iteration
previous_result = class; % for early termination
% Calculate eculidean distance between each sample and each centroid
for j = 1:size(distance_matrix,1)
for k = 1:size(distance_matrix,2)
distance_matrix(j,k) = sqrt((data(j,:)-centroid(k,:)) * (data(j,:)-centroid(k,:))');
end
end
% Assign each sample to the nearest controid
[~,class] = min(distance_matrix,[],2);
% Recalculate centroids
for j = 1:k
centroid(j,:) = mean(data(class(:,1) == j,:));
end
% Display
fprintf('---- %ith iteration completed ----\n',i);
% If classified results on all points do not change after an iteration,
% the clustering process will quit immediately.
if(class == previous_result)
fprintf('**** Clustering over after %i iterations ****\n',i);
break;
end
end
end
================================================
FILE: 01_MATLAB/lib/Kmeanspp.m
================================================
function [centroid, class] = Kmeanspp(data, k, iteration)
% Main part of Kmeans clustering algorithm.
%
% Args:
% data: data to be clustered (n * p)
% k: the number of classes
% iteration: maximum number of iterations
%
% Returns:
% centroid: clustering centroids for all classes
% class: corresponding class for all samples
% Choose the first inital centroid randomly
centroid = data(randperm(size(data,1),1)',:);
% Select remaining initial centroids (a total number of k-1)
for i = 2:k
distance_matrix = zeros(size(data,1),i-1);
for j = 1:size(distance_matrix,1)
for p = 1:size(distance_matrix,2)
distance_matrix(j,p) = sum((data(j,:)-centroid(p,:)) .^ 2);
end
end
% Choose next centroid according to distances between points and
% previous cluster centroids.
index = Roulettemethod(distance_matrix);
centroid(i,:) = data(index,:);
clear distance_matrix;
end
% Following steps are same to kmeans
class = zeros(size(data,1),1);
distance_matrix = zeros(size(data,1), k);
for i = 1:iteration
previous_result = class; % for early termination
% Calculate eculidean distance between each sample and each centroid
for j = 1:size(distance_matrix,1)
for k = 1:size(distance_matrix,2)
distance_matrix(j,k) = sqrt((data(j,:)-centroid(k,:)) * (data(j,:)-centroid(k,:))');
end
end
% Assign each sample to the nearest controid
[~,class] = min(distance_matrix,[],2);
% Recalculate centroids
for j = 1:k
centroid(j,:) = mean(data(class(:,1) == j,:));
end
% Display
fprintf('---- %ith iteration completed---- \n',i);
% If classified results on all points do not change after an iteration,
% the clustering process will quit immediately.
if(class == previous_result)
fprintf('**** Clustering over after %i iterations ****\n',i);
break;
end
end
end
function [index] = Roulettemethod(distance_matrix)
% Find shortest distance between one sample and its closest cluster centroid
[min_distance,~] = min(distance_matrix,[],2);
% Normalize for further operations
min_distance = min_distance ./ sum(min_distance);
% Construct roulette according to min_distance
temp_roulette = zeros(size(distance_matrix,1),1);
for i = 1:size(distance_matrix,1)
temp_roulette(i,1) = sum(min_distance(1:i,:));
end
% Generate a random number for selection
temp_rand = rand();
% Find the corresponding index
for i = 1:size(temp_roulette,1)
if((i == 1) && temp_roulette(i,1) > temp_rand)
index = 1;
elseif((temp_roulette(i,1) > temp_rand) && (temp_roulette(i-1,1) < temp_rand))
index = i;
end
end
end
================================================
FILE: 01_MATLAB/lib/LVQ.m
================================================
function [centroid, label] = LVQ(data, q, neta, x, y, iter)
% function [centroid, label] = LVQ(data, q, x, y)
% Unlike Kmeans, LVQ (Learning Vector Quantization) use labelled data
% to help clustering.After using LVQ, the feature space is split into
% a voronoi mesh.
% ----
% Args:
% data: data to be clustered (n * p)
% q: the number of prototypes (scalar)
% neta: learning rate
% x: training data (? * p, '?' is the size of training data)
% y: label of training data (? * 1)
% iter: maximum number of iterations (scalar)
% ----
% centroid: clustering centroids (q * p)
% label: corresponding class for each observation (n * 1)
% Initialization
centroid = x(randperm(size(x,1),q)', :); % randomly select q observations as initial prototypes
label = zeros(size(data, 1), 1);
for i = 1 : iter
s = randperm(size(x,1),1); % ramdomly select one training sample
tx = x(s, :);
% Calculate the distance between tx and all prototypes
distance = zeros(q, 1);
for j = 1 : q
distance(j, 1) = Eculidean_Distance(tx, centroid(j, :));
end
[~, index] = min(distance); % find the index of the nearest prototype
% Update the prototype
if(index == y(s, 1))
centroid(index, :) = centroid(index, :) + neta * (tx - centroid(index, :));
else
centroid(index, :) = centroid(index, :) - neta * (tx - centroid(index, :));
end
end
% Classification
for i = 1 : size(data, 1)
tx = data(i, :);
distance = zeros(q, 1);
for j = 1 : q
distance(j, 1) = Eculidean_Distance(tx, centroid(j, :));
end
[~, index] = min(distance); % find the index of the nearest prototype
label(i, 1) = index;
end
end
function d = Eculidean_Distance(x1, x2)
% Calculate eculidean distance between x1 and x2.
%
% Args:
% x1: observation 1
% x2: observation 2
%
% Returns:
% d: Eculidean distance between x1 and x2
d = sqrt((x1 - x2) * (x1 - x2)');
end
================================================
FILE: 01_MATLAB/lib/Mean_Shift.m
================================================
function [centroid, result] = Mean_Shift(data, thr)
% Main part of mean shift clustering algorithm.
%
% Args:
% data: data to be clustered (n * p)
% thr: distance threshold used to find neighbors
%
% Returns:
% centroids: clustering centroids for all classes
% result: corresponding class for each data point
%
% Comment:
% Note that there is no need to specify the number of classes in mean
% shift. In this function , I first record the destination point after
% shifting for each data point. Data points with same destination point
% are considered to be in the same class.
destination = zeros(size(data)); % variable used to record destination points
result = zeros(size(data,1),1); % pre-allocate classifying result
% Conduct shift for each data point
for i = 1 : size(data,1)
x = data(i, :); % current point of interests
mv_new = x;
mv_old = x * 10;
while(Eculidean_Distance(mv_new, mv_old) ~= 0)
mv_old = mv_new;
neighbors = Find_Neighbor(data, x, thr);
mv_new = Mean_Vector(neighbors, x, thr, '0/1'); % other weighting mechanisms are under writing
end
destination(i, :) = mv_new;
% display
fprintf('Shifting for %ith point finishes\n', i);
end
centroid = unique(destination, 'rows');
% Calssification
for i = 1 : size(centroid,1)
mask = destination == centroid(i,:); % logical index
mask = mask(:,1);
result(mask, 1) = i;
end
% Display
fprintf('Clustering over, a total number of %i classes\n', size(centroid,1));
end
function d = Eculidean_Distance(x1, x2)
% Calculate eculidean distance between x1 and x2.
%
% Args:
% x1: point1
% x2: point2
%
% Returns:
% d: Eculidean distance between x1 and x2
d = sqrt((x1 - x2) * (x1 - x2)');
end
function mv = Mean_Vector(neighbors, x, thr, method)
% Use neighbor set to calculate the mean vector for x.
%
% Args:
% neighbors: neighbor set of x
% x: current point of interests
% thr: distance threshold. In this case, also standrad deviation of Gaussean kernal
% method: weighting mechanism ('0/1' or 'Gaussian')
%
% Returns:
% mv: mean vector of x
flag = 1; % method index
% Check designated weighting machanism
if(strcmp(method, '0/1'))
flag = 0;
elseif(strcmp(method, 'Gaussian') || strcmp(method, 'gaussian'))
flag = 1;
else
fprintf('Unknown method, use default Gaussian weighting mechanism\n')
end
mv = zeros(1, size(x,2)); % pre-allocate result
% Calculate mean vector
if(flag == 0)
mv = mean(neighbors, 1);
elseif(flag == 1)
denominator = 0;
for i = 1 : size(neighbors,1)
weight = exp(-(Eculidean_Distance(neighbors(i,:), x)^2) / (2*thr^2));
denominator = denominator + weight;
mv = mv + weight * neighbors(i, :);
end
mv = mv / denominator;
end
end
function neighbors = Find_Neighbor(data, x, thr)
% Find neighbors for x, where neighbors are defined to be points in data
% with eculidean distance from x smaller than thr.
%
% Args:
% data: all data points
% x: current point of interests
% thr: pre-defined distance threshold
%
% Returns:
% neighbors: neighbor set of x
neighbors = []; % pre-allocate neighbor result
count = 1;
for i = 1 : size(data,1)
d = Eculidean_Distance(data(i,:), x);
if(d <= thr)
neighbors(count,:) = data(i,:);
count = count + 1;
end
end
end
================================================
FILE: 01_MATLAB/lib/Subspace_Kmeans.m
================================================
function [centroid, dimension_weight, class] = Subspace_Kmeans(data, iteration, K, beta, verbose)
% Pre-allocate weights
centroid = zeros(K,size(data,2)); % centroid for each class
class = zeros(size(data,1),1); % classification result for each observation
dimension_weight = ones(K,size(data,2)); % weights for each dimension in each class
% Initialization
n = size(data,1);
J = 0; % used to record objective function value
% First round
centroid = data(unidrnd(n,K,1),:); % randomly choose K initial centroids
dimension_weight = 1/size(data,2) * dimension_weight; % initialize weights for each dimension using uniform distribution
% Partially optimization
for i = 1:iteration
J0 = J;
% body part
class = classify(centroid,dimension_weight,data);
centroid = centroid_update(centroid,data,class);
[dimension_weight,J] = dimension_weight_update(K,centroid,class,dimension_weight,data,beta);
% whether display intermediate information
if(verbose == 1)
disp(['Objective Function(J) Value: ',num2str(J)]);
end
% early stop condition
if(abs(J-J0)<1e-9)
fprintf('*** Clustering terminates after %i iterations ***\n',i);
break;
end
end
end
% Details on the scheme of updating dimension weights
function [alpha,J] = dimension_weight_update(K,m,c,alpha,data,beta)
all_matrix = zeros(size(data,1),size(data,2));
for i = 1:size(data,1)
all_matrix(i,:) = (m(c(i,1),:)-data(i,:)) .* (m(c(i,1),:)-data(i,:));
end
J = 0;
for i = 1:K
class_matrix = all_matrix(c==i,:); % pick out data in all_matrix that corresponds to class i
t_sum = sum(class_matrix,1) + 1e-9; % adding a small positive constant to make weights computatable
J = J + (alpha(i,:).^beta) * t_sum';
if(size(class_matrix,1)>0)
for j = 1:size(alpha,2)
% variables used to avoid redundant calculation
tt_numerator = t_sum(1,j);
t_denominator = sum(tt_numerator./t_sum,2);
alpha(i,j) = 1/((t_denominator+1e-9)^(1/(beta-1)));
end
else
continue;
end
end
% Normalize
for i = 1:size(alpha,1)
alpha(i,:) = alpha(i,:)./(sum(alpha(i,:),2));
end
end
function [result] = classify(m,alpha,data)
result = zeros(size(data,1),1);
% Construct temporary matrix for efficiently computing dimention-weighted distance
matrix = zeros(size(m,1),size(data,2));
for i = 1:size(result,1)
for j = 1:size(m,1)
matrix(j,:) = (m(j,:)-data(i,:)) .* (m(j,:)-data(i,:));
end
temp = sum(alpha .* matrix,2);
% To avoid more than one class having the minimum distance.
t_index = find(temp == min(temp));
result(i,1) = t_index(1,1);
end
end
function [m] = centroid_update(m,data,c)
for i = 1:size(m,1)
if(~isempty(data(c==i,:)))
m(i,:) = mean(data(c==i,:),1);
else
continue;
end
end
end
================================================
FILE: 01_MATLAB/tool/GenerateDataset.m
================================================
function dataset = GenerateDataset(n, p, k, pd, varargin)
% dataset = GenerateDataset(n, p, k, pd, varargin)
% Generate synthetic dataset for further use.
% ----
% Args:
% n: the number of samples in each class (scalar)
% p: the number of features (scalar)
% k: the number of classes (scalar)
% pd: probability distribution of generated data (string)
% varargin: parameters on p
% ----
% Returns:
% dataset: generated dataset
% Pre-allocate dataset to avoid memory overflow
dataset = zeros(n * k, p);
% Generate dataset from gaussian distribution
if((strcmp(pd, 'Gaussian')) || strcmp(pd, 'gaussian'))
% Get parameters on gaussian distribution
mu = varargin{1, 1}; % (k * p)
sigma = varargin{1, 2}; % (k * p)
for i = 1 : k
dataset(n*(i-1)+1:n*i, :) = mvnrnd(mu(i,:), sigma(i,:), n);
end
end
% Random permutation
dataset = dataset(randperm(size(dataset, 1)), :);
end
================================================
FILE: 01_MATLAB/tool/PlotData.m
================================================
function PlotData(data, label, varargin)
% PlotData(data, label, varargin)
% Plot data, with different classes correspond to different colors.
% ----
% Args:
% data: original data (n * p)
% label: clustering result (n * 1), '-1' in label corresponds to noisy data
% varargin{1,1}: clustering centroid (k * p), k the number of classes
% varargin{1,...}: other parameters
% ----
% Returns:
isc = 0; % whether plot centroid
k = max(label); % the number of classes
p = size(data ,2); % the number of features
if(~isempty(varargin))
isc = 1;
centroid = varargin{1, 1};
end
if((p > 3) || (p < 1))
error('Unable to plot data exceeds 3-deminsion');
end
% Data
if(p == 2)
for i = 1 : k
scatter(data(label==i,1), data(label==i,2), 'filled', 'DisplayName', strcat('Class-',num2str(i)));
hold on;
end
elseif(p == 3)
for i = 1 : k
scatter3(data(label==i,1), data(label==i,2), data(label==i,3), 'filled', 'DisplayName', strcat('Class-',num2str(i)));
hold on;
end
end
% Centroid
if(isc == 1)
if(p == 2)
scatter(centroid(:,1), centroid(:,2), 150, 'd', 'filled', 'DisplayName', 'Centroid');
elseif(p == 3)
scatter3(centroid(:,1), centroid(:,2), centroid(:,3), 150, 'd', 'filled', 'DisplayName', 'Centroid');
end
end
% Legend
if(k < 10)
legend('show');
end
% Others
grid on;
end
================================================
FILE: 02_Python/A_Star.py
================================================
#!/usr/bin/env python3
#================================================================================================================
#----------------------------------------------------------------------------------------------------------------
# A STAR
#----------------------------------------------------------------------------------------------------------------
#================================================================================================================
import sys
import queue
# each Node in the Graph
class Node:
def __init__(self, key, i, j):
# Utility to easily check for presence in openList/ClosedList
self.__key = key
# Priority by which it is inserted to OpenList
self.__priority = 0.0
# Distance Travelled till current node
self.__distFromStart = 0
# set of neighbor nodes
self.__neighbors = set()
# node from which this was visited
self.__parent = None
self.__traversable = False
# required for calculating heuristic
# also used as key in graph.nodes
self.__pos = (i, j)
def addNeighbor(self, node):
self.__neighbors.add(node)
def setTraversability(self, isTraversable):
self.__traversable = isTraversable
def isTraversable(self):
return self.__traversable
def getKey(self):
return self.__key
def getPos(self):
return self.__pos
def setPriority(self, newPriority):
self.__priority = newPriority
def getPriority(self):
return self.__priority
def setParent(self, parent):
self.__parent = parent
def getParent(self):
return self.__parent;
def getDistFromStart(self):
return self.__distFromStart
def setDistFromStart(self, distFromStart):
self.__distFromStart = distFromStart
def getNeighbors(self):
return self.__neighbors
def setKey(self, key):
self.__key = key
# Requred by queue.PriorityQueue's use of heapq for comparing two nodes
def __lt__(self, node):
return self.__priority < node.getPriority()
class Graph:
def __init__(self):
self.__nodes = dict()
def addNode(self, node):
self.__nodes[node.getPos()] = node
def getNode(self, pos):
return self.__nodes.get(pos, None)
# Add an edge from node1 to node2
def addEdge(self, node1, node2):
if not (node1 in self.__nodes and node2 in self.__nodes):
node1.addNeighbor(node2)
class Map2D:
def __init__(self, filePath):
self.__graph = Graph()
self.__startNode = None
self.__endNode = None
with open(filePath) as inFile:
lines = inFile.readlines()
self.__dims = (len(lines), len(lines[0])-1)
# add Nodes to graph
for i in range(len(lines)):
nodeLine = list()
for j in range(len(lines[i])):
#each character is a node
char = lines[i][j]
if "\n" == char:
continue
node = Node(char,i,j)
# "#" for non traversable nodes
if "#" == char:
node.setTraversability(False)
else:
node.setTraversability(True)
if "S" == char:
self.__startNode = node
elif "E" == char:
self.__endNode = node
self.__graph.addNode(node)
if self.__startNode == None or self.__endNode == None:
sys.exit("No start or no end in map")
# for each node, for each neighbor, add edge between neighbor and node
for i in range(self.__dims[0]):
for j in range(self.__dims[1]):
currentNode = self.__graph.getNode((i,j))
if self.__isValid(i+1,j):
self.__graph.addEdge(currentNode,self.__graph.getNode((i+1,j)))
if self.__isValid(i-1,j):
self.__graph.addEdge(currentNode,self.__graph.getNode((i-1,j)))
if self.__isValid(i,j+1):
self.__graph.addEdge(currentNode,self.__graph.getNode((i,j+1)))
if self.__isValid(i,j-1):
self.__graph.addEdge(currentNode,self.__graph.getNode((i,j-1)))
def printMap(self):
if None == self.__dims:
print("ERROR: map not initialized")
return
for i in range(self.__dims[0]):
for j in range(self.__dims[1]):
print(self.__graph.getNode((i,j)).getKey(), end="")
print()
def __isValid(self, i, j):
node = self.__graph.getNode((i,j))
# if i,j are valid indices and the node is traversable
if node != None and node.isTraversable():
return True
return False
def getStart(self):
return self.__startNode
def getEnd(self):
return self.__endNode
class AStar:
def __init__(self, inMap):
# holds list of nodes from which the next node is chosen
self.__openList = queue.PriorityQueue()
# put start node in openList
start = inMap.getStart()
start.setDistFromStart(0)
start.setPriority(self.__heuristic(start, inMap.getEnd()))
start.setParent(None)
self.__openList.put((start.getPriority(),start))
self.__map = inMap
# list of visited nodes
self.__closedList = dict()
# setting this to return 0, will comvert this to Dijkistra's Algorithm
# manhattan distance
def __heuristic(self, node, targetNode):
i1,j1 = node.getPos()
i2,j2 = targetNode.getPos()
return abs(i1-i2)+abs(j1-j2)
def findPath(self):
while True:
# OL is empty implies, no route, stop
if self.__openList.empty():
print("No route!")
return
# get highest priority element from OL
priority, currentNode = self.__openList.get()
# if we reached end node, follow parents to get path
if currentNode == self.__map.getEnd():
# follow parents till startNode
while currentNode != self.__map.getStart():
# set "*" for visual output
currentNode.setKey("*")
currentNode = currentNode.getParent()
currentNode.setKey("*")
return
# unweighted graph should add 1, otherwise replace 1 with edge weight
newLevel = currentNode.getDistFromStart() + 1
# add neighbors to OL
for neighbor in currentNode.getNeighbors():
# if it has already been visited
if self.__closedList.get(neighbor.getPos(), None) != None:
continue
# if it is in OL but the new path is longer than the already existing one
if "O" == neighbor.getKey() and newLevel >= neighbor.getDistFromStart():
continue
# add neighbor to OL
neighbor.setKey("O")
neighbor.setParent(currentNode)
neighbor.setDistFromStart(newLevel)
neighbor.setPriority(neighbor.getDistFromStart() + self.__heuristic(neighbor,self.__map.getEnd()))
self.__openList.put((neighbor.getPriority(), neighbor))
# mark node as visited
self.__closedList[currentNode.getPos()] = True
currentNode.setKey("C")
# un-comment following 2 lines to see how algorithm works
# self.__map.printMap()
# input()
def getMap(self):
return self.__map
if "__main__" == __name__:
inpMap = Map2D("./data/graph.in")
print("Initial Map:")
inpMap.printMap()
aStar = AStar(inpMap)
aStar.findPath()
print("Map with route(*), unvisited nodes(-/O/#), visited nodes(C)")
aStar.getMap().printMap()
================================================
FILE: 02_Python/Collaborative_Filtering.py
================================================
from math import sqrt
data = {
"Manish": {
"Interstellar": 4,
"The Dark Knight": 5,
"Wanted": 3,
"Sucker Punch": 2,
"Inception": 5,
"The Conjuring": 3,
"21 Jump Street": 4,
"The Prestige": 5
},
"Madhu": {
"Interstellar": 5,
"The Dark Knight": 5,
"Wanted": 1,
"Devil": 3,
"The Conjuring": 1,
"21 Jump Street": 4,
"Men in Black": 2
},
"Mansukh": {
"Hot Tub Time Machine": 1,
"Inception": 5,
"Revenant": 3,
"Avengers 1": 4,
"Iron Man 2": 3,
"Batman v Superman": 5,
"Wanted": 4,
},
"Imran": {
"Inception": 5,
},
"Kumar": {
"Hot Tub Time Machine": 1,
"Avengers 1": 4,
"Avengers 2": 3,
"The Departed": 5,
"Interstellar": 4,
"Fight Club": 5,
"Vampires Suck": 1,
"Twilight": 1
},
"Tori": {
"Notebook": 5,
"The Terminal": 4,
"Twilight": 5,
"Inception": 2,
"The Dark Knight": 1,
"Hot Tub Time Machine": 2,
"The Vow": 4
},
"Jatin": {
"Inception":5,
"The Conjuring":4
},
"Latha": {
"Twilight": 1
}
}
itemNames = [
"Interstellar",
"The Dark Knight",
"Wanted",
"Sucker Punch",
"Inception",
"The Conjuring",
"21 Jump Street",
"The Prestige",
"Devil",
"Men in Black",
"Hot Tub Time Machine",
"Revenant",
"Avengers 1",
"Iron Man 2",
"Batman v Superman",
"Avengers 2",
"The Departed",
"Fight Club",
"Vampires Suck",
"Twilight",
"Notebook",
"The Terminal",
"The Vow",
"Focus"
]
MAXrating = 5
MINrating = 1
def compute_similarity(item1,item2,userRatings):
averages = {}
for (key,ratings) in userRatings.items():
averages[key] = (float(sum(ratings.values()))/len(ratings.values()))
num = 0
dem1 = 0
dem2 = 0
for (user,ratings) in userRatings.items():
if item1 in ratings and item2 in ratings:
avg = averages[user]
num += (ratings[item1] - avg) * (ratings[item2] - avg)
dem1 += (ratings[item1] - avg) ** 2
dem2 += (ratings[item2] - avg) ** 2
if dem1*dem2 == 0:
return 0
return num / (sqrt(dem1 * dem2))
def build_similarity_matrix(userRatings):
similarity_matrix = {}
for i in range(0,len(itemNames)):
band = {}
for j in range(0,len(itemNames)):
if itemNames[i] != itemNames[j]:
band[itemNames[j]] = compute_similarity(itemNames[i],itemNames[j],data)
similarity_matrix[itemNames[i]] = band
return similarity_matrix
def normalize(rating):
num = 2 * (rating - MINrating) - (MAXrating - MINrating)
den = (MAXrating - MINrating)
return num / den
def denormalize(rating):
return (((rating + 1) * (MAXrating - MINrating))/2 ) + MINrating
def prediction(username,item):
num = 0
den = 0
for band,rating in data[username].items():
num += sm[item][band] * normalize(rating)
den += abs(sm[item][band])
if den == 0:
return 0
return denormalize(num/den)
def recommendation(username,userRatings):
recommend = []
for item in itemNames:
if item not in userRatings[username].keys():
if prediction(username,item) >= 3.5:
recommend.append(item)
return recommend
sm = build_similarity_matrix(data)
# for k,i in sm.items():
# print(k , i)
print("Recommendation for Jatin: ")
print(recommendation("Jatin",data))
print("Recommendation for Latha: ")
print(recommendation("Latha",data))
================================================
FILE: 02_Python/DBSCAN.py
================================================
# ================================================================================================================
# ----------------------------------------------------------------------------------------------------------------
# DBSCAN
# ----------------------------------------------------------------------------------------------------------------
# ================================================================================================================
import numpy as np
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from itertools import cycle, islice
import matplotlib.pyplot as plt
import queue
import pandas as pd
class CustomDBSCAN():
def __init__(self):
self.core = -1
self.border = -2
# Find all neighbour points at epsilon distance
def neighbour_points(self, data, pointId, epsilon):
points = []
for i in range(len(data)):
# Euclidian distance
if np.linalg.norm([a_i - b_i for a_i, b_i in zip(data[i], data[pointId])]) <= epsilon:
points.append(i)
return points
# Fit the data into the DBSCAN model
def fit(self, data, Eps, MinPt):
# initialize all points as outliers
point_label = [0] * len(data)
point_count = []
# initilize list for core/border points
core = []
border = []
# Find the neighbours of each individual point
for i in range(len(data)):
point_count.append(self.neighbour_points(data, i, Eps))
# Find all the core points, border points and outliers
for i in range(len(point_count)):
if (len(point_count[i]) >= MinPt):
point_label[i] = self.core
core.append(i)
else:
border.append(i)
for i in border:
for j in point_count[i]:
if j in core:
point_label[i] = self.border
break
# Assign points to a cluster
cluster = 1
# Here we use a queue to find all the neighbourhood points of a core point and find the indirectly reachable points
# We are essentially performing Breadth First search of all points which are within Epsilon distance for each other
for i in range(len(point_label)):
q = queue.Queue()
if (point_label[i] == self.core):
point_label[i] = cluster
for x in point_count[i]:
if(point_label[x] == self.core):
q.put(x)
point_label[x] = cluster
elif(point_label[x] == self.border):
point_label[x] = cluster
while not q.empty():
neighbors = point_count[q.get()]
for y in neighbors:
if (point_label[y] == self.core):
point_label[y] = cluster
q.put(y)
if (point_label[y] == self.border):
point_label[y] = cluster
cluster += 1 # Move on to the next cluster
return point_label, cluster
# Visualize the clusters
def visualize(self, data, cluster, numberOfClusters):
N = len(data)
colors = np.array(list(islice(cycle(['#FE4A49', '#2AB7CA']), 3)))
for i in range(numberOfClusters):
if (i == 0):
# Plot all outliers point as black
color = '#000000'
else:
color = colors[i % len(colors)]
x, y = [], []
for j in range(N):
if cluster[j] == i:
x.append(data[j, 0])
y.append(data[j, 1])
plt.scatter(x, y, c=color, alpha=1, marker='.')
plt.show()
def main():
# Reading from the data file
df = pd.read_csv("./data/concentric_circles.csv")
dataset = df.astype(float).values.tolist()
# normalize dataset
X = StandardScaler().fit_transform(dataset)
custom_DBSCAN = CustomDBSCAN()
point_labels, clusters = custom_DBSCAN.fit(X, 0.25, 4)
print(point_labels, clusters)
custom_DBSCAN.visualize(X, point_labels, clusters)
if __name__ == "__main__":
main()
================================================
FILE: 02_Python/Decision_Trees.py
================================================
# ================================================================================================================
# ----------------------------------------------------------------------------------------------------------------
# DECISION TREES
# ----------------------------------------------------------------------------------------------------------------
# ================================================================================================================
from math import log
import pandas as pd
import random
class CustomDecisionTree():
def __init__(self):
pass
def majorityCnt(self, classList):
classCount = {}
for vote in classList:
if vote not in classCount.keys():
classCount[vote] = 0
classCount[vote] += 1
sortedClassCount = sorted(classCount.items(), reverse=True)
return sortedClassCount[0][0]
# for calculting entropy
def calcShannonEnt(self, dataSet):
numEntries = len(dataSet)
labelCounts = {}
for featVec in dataSet:
currentLabel = featVec[-1]
if currentLabel not in labelCounts.keys():
labelCounts[currentLabel] = 0
labelCounts[currentLabel] += 1
shannonEnt = 0.0
for key in labelCounts:
prob = float(labelCounts[key])/numEntries
shannonEnt -= prob * log(prob, 2)
return shannonEnt
def splitDataSet(self, dataSet, axis, value):
retDataSet = []
for featVec in dataSet:
if featVec[axis] == value:
reducedFeatVec = featVec[:axis]
reducedFeatVec.extend(featVec[axis+1:])
retDataSet.append(reducedFeatVec)
return retDataSet
# choosing the best feature to split
def chooseBestFeatureToSplit(self, dataSet, labels):
numFeatures = len(dataSet[0]) - 1
baseEntropy = self.calcShannonEnt(dataSet)
bestInfoGain = -1
bestFeature = 0
for i in range(numFeatures):
featList = [example[i] for example in dataSet]
uniqueVals = set(featList)
newEntropy = 0.0
for value in uniqueVals:
subDataSet = self.splitDataSet(dataSet, i, value)
prob = len(subDataSet)/float(len(dataSet))
newEntropy += prob * self.calcShannonEnt(subDataSet)
infoGain = baseEntropy - newEntropy
print(infoGain, bestInfoGain)
if (infoGain > bestInfoGain):
bestInfoGain = infoGain
bestFeature = i
print("the best feature to split is", labels[bestFeature])
return bestFeature
# function to build tree recursively
def createTree(self, dataSet, labels):
classList = [example[-1] for example in dataSet]
if len(classList) is 0:
return
if classList.count(classList[0]) == len(classList):
return classList[0]
if len(dataSet[0]) == 1:
return self.majorityCnt(classList)
featureVectorList = [row[:len(row)-1] for row in dataSet]
bestFeat = self.chooseBestFeatureToSplit(featureVectorList, labels)
bestFeatLabel = labels[bestFeat]
myTree = {bestFeatLabel: {}}
del(labels[bestFeat])
featValues = [example[bestFeat] for example in dataSet]
uniqueVals = set(featValues)
for value in uniqueVals:
subLabels = labels[:]
myTree[bestFeatLabel][value] = self.createTree(
self.splitDataSet(dataSet, bestFeat, value), subLabels)
return myTree
def main():
df = pd.read_csv("./data/test.csv") # Reading from the data file
# Sex param
df.replace('male', 0, inplace=True)
df.replace('female', 1, inplace=True)
# Embarked param
df.replace('S', 0, inplace=True)
df.replace('C', 1, inplace=True)
df.replace('Q', 2, inplace=True)
df['embarked'] = df['embarked'].fillna(1)
dataset = df.astype(float).values.tolist()
labels = ['pclass', 'sex', 'embarked', 'survived']
# Shuffle the dataset
random.shuffle(dataset) # import random for this
custom_DTree = CustomDecisionTree()
print(custom_DTree.createTree(dataset, labels))
if __name__ == "__main__":
main()
================================================
FILE: 02_Python/Dimensionality_Reduction/Dimensionality_Reduction.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"All the IPython Notebooks in **Clustering Algorithms** lecture series by **[Dr. Milaan Parmar](https://www.linkedin.com/in/milaanparmar/)** are available @ **[GitHub](https://github.com/milaan9/Clustering_Algorithms)**\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Dimensionality Reduction"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2021-09-18T15:40:28.921358Z",
"start_time": "2021-09-18T15:40:21.087390Z"
},
"colab": {
"base_uri": "https://localhost:8080/",
"height": 104
},
"colab_type": "code",
"executionInfo": {
"elapsed": 5681,
"status": "ok",
"timestamp": 1546259198259,
"user": {
"displayName": "Bob Li",
"photoUrl": "",
"userId": "13034580972517925389"
},
"user_tz": -480
},
"id": "cb9XEtCKNnh-",
"outputId": "04b24b82-bb55-4e98-b09f-5a32cf27fa3a"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: sklearn in c:\\programdata\\anaconda3\\lib\\site-packages (0.0)\n",
"Requirement already satisfied: scikit-learn in c:\\programdata\\anaconda3\\lib\\site-packages (from sklearn) (0.24.1)\n",
"Requirement already satisfied: joblib>=0.11 in c:\\programdata\\anaconda3\\lib\\site-packages (from scikit-learn->sklearn) (1.0.1)\n",
"Requirement already satisfied: scipy>=0.19.1 in c:\\programdata\\anaconda3\\lib\\site-packages (from scikit-learn->sklearn) (1.6.2)\n",
"Requirement already satisfied: numpy>=1.13.3 in c:\\programdata\\anaconda3\\lib\\site-packages (from scikit-learn->sklearn) (1.20.1)\n",
"Requirement already satisfied: threadpoolctl>=2.0.0 in c:\\programdata\\anaconda3\\lib\\site-packages (from scikit-learn->sklearn) (2.1.0)\n"
]
}
],
"source": [
"!pip install sklearn"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2021-09-18T15:40:29.264130Z",
"start_time": "2021-09-18T15:40:28.924289Z"
},
"colab": {},
"colab_type": "code",
"id": "yr45GEzAOtq6"
},
"outputs": [],
"source": [
"import numpy as np\n",
"import os\n",
"\n",
"# making random output stable\n",
"np.random.seed(42)\n",
"m = 60\n",
"w1, w2 = 0.1, 0.3\n",
"noise = 0.1\n",
"\n",
"# Create an array of the given shape \n",
"# and populate it with random samples from a uniform distribution over [0, 1).\n",
"angles = np.random.rand(m) * 3 * np.pi / 2 - 0.5\n",
"# print('angles: {}\\nsize of dataset: {}'.format(angles, angles.shape))\n",
"\n",
"X = np.empty((m, 3))\n",
"# print(X)\n",
"X[:, 0] = np.cos(angles) + np.sin(angles)/2 + noise * np.random.randn(m) / 2\n",
"X[:, 1] = np.sin(angles) * 0.7 + noise * np.random.randn(m) / 2\n",
"X[:, 2] = X[:, 0] * w1 + X[:, 1] * w2 + noise * np.random.randn(m)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "ehCixfYWYgBc"
},
"source": [
"## PCA using Scikit-Learn\n",
"With Scikit-Learn, PCA is really trivial. It even takes care of mean centering for you, which has been perfectly packaged and easy to incorporate"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2021-09-18T15:40:31.663542Z",
"start_time": "2021-09-18T15:40:29.269502Z"
},
"colab": {},
"colab_type": "code",
"id": "d6tMz_zjY_Jz"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"pca = PCA(n_components = 0.99)\n",
"\n",
"First 5 Projection Points:\n",
"[[ 0.690074 0.36150744]\n",
" [-1.39636097 -0.34497714]\n",
" [-1.00728461 0.35025708]\n",
" [-0.2736333 0.50516373]\n",
" [ 0.91324535 -0.26290852]]\n",
"\n",
"\n",
"Principal Components:\n",
"[[-0.95250178 -0.24902446 -0.17529172]\n",
" [ 0.29267159 -0.9076305 -0.30091563]]\n",
"\n",
"\n",
"Explained Variance Ratio:\n",
"[0.85406025 0.13622918]\n",
"\n"
]
}
],
"source": [
"from sklearn.decomposition import PCA\n",
"\n",
"pca = PCA(n_components = 0.99)\n",
"\n",
"# you have to call 'fit' with appropriate arguments before using transrom method.\n",
"# a = pca.fit(X)\n",
"# b = pca.transform(X)\n",
"# or simply use fit_transform()\n",
"\n",
"# 2-D\n",
"X_decorrelated_DR = pca.fit_transform(X)\n",
"X_decorrelated_DR[:] = X_decorrelated_DR[:]*(-1) \n",
"\n",
"# reconstruct dataset from X_decorrelated_DR\n",
"X_reconstructed = pca.inverse_transform(X_decorrelated_DR)\n",
"\n",
"print(\"pca = PCA(n_components = 0.99)\\n\")\n",
"print(\"First 5 Projection Points:\\n{}\\n\\n\".format(X_decorrelated_DR[:5]))\n",
"print(\"Principal Components:\\n{}\\n\\n\".format(pca.components_))\n",
"print(\"Explained Variance Ratio:\\n{}\\n\".format(pca.explained_variance_ratio_))\n",
"# print('reconstructed dataset:\\n{}\\n'.format(X_reconstructed))"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "YPJErcHIfeWp"
},
"source": [
"***We can visibly tell that we can reduce our dimensions from 3 to 2 while preserving 99% of the variance***"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2021-09-18T15:40:31.711397Z",
"start_time": "2021-09-18T15:40:31.674284Z"
},
"colab": {
"base_uri": "https://localhost:8080/",
"height": 252
},
"colab_type": "code",
"executionInfo": {
"elapsed": 684,
"status": "ok",
"timestamp": 1546322325444,
"user": {
"displayName": "Bob Li",
"photoUrl": "",
"userId": "13034580972517925389"
},
"user_tz": -480
},
"id": "_jJIoUzlf6oa",
"outputId": "45ed6c46-eb02-4d40-e324-eee30b51620f"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"pca = PCA(n_components = 0.999)\n",
"\n",
"First 5 Projection Points:\n",
"[[-0.690074 -0.36150744 0.05176509]\n",
" [ 1.39636097 0.34497714 0.04887253]\n",
" [ 1.00728461 -0.35025708 0.04753837]\n",
" [ 0.2736333 -0.50516373 0.13786693]\n",
" [-0.91324535 0.26290852 -0.03027986]]\n",
"\n",
"\n",
"Principal Components:\n",
"[[-0.95250178 -0.24902446 -0.17529172]\n",
" [ 0.29267159 -0.9076305 -0.30091563]\n",
" [-0.08416476 -0.33792558 0.93740205]]\n",
"\n",
"\n",
"Explained Variance Ratio:\n",
"[0.85406025 0.13622918 0.00971057]\n",
"\n"
]
}
],
"source": [
"# preserving 99.9% of the variance\n",
"pca = PCA(n_components = 0.999)\n",
"\n",
"# 3-D\n",
"X_decorrelated = pca.fit_transform(X)\n",
"\n",
"print(\"pca = PCA(n_components = 0.999)\\n\")\n",
"print(\"First 5 Projection Points:\\n{}\\n\\n\".format(X_decorrelated[:5]))\n",
"print(\"Principal Components:\\n{}\\n\\n\".format(pca.components_))\n",
"print(\"Explained Variance Ratio:\\n{}\\n\".format(pca.explained_variance_ratio_))"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2021-09-18T15:40:32.577605Z",
"start_time": "2021-09-18T15:40:31.721159Z"
},
"colab": {},
"colab_type": "code",
"id": "zmUyRlSPmse_"
},
"outputs": [],
"source": [
"from matplotlib.patches import FancyArrowPatch\n",
"from mpl_toolkits.mplot3d import proj3d\n",
"\n",
"class Arrow3D(FancyArrowPatch):\n",
" def __init__(self, xs, ys, zs, *args, **kwargs):\n",
" FancyArrowPatch.__init__(self, (0,0), (0,0), *args, **kwargs)\n",
" self._verts3d = xs, ys, zs\n",
"\n",
" def draw(self, renderer):\n",
" xs3d, ys3d, zs3d = self._verts3d\n",
" xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M)\n",
" self.set_positions((xs[0],ys[0]),(xs[1],ys[1]))\n",
" FancyArrowPatch.draw(self, renderer)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2021-09-18T15:40:32.659633Z",
"start_time": "2021-09-18T15:40:32.609343Z"
},
"colab": {
"base_uri": "https://localhost:8080/",
"height": 454
},
"colab_type": "code",
"executionInfo": {
"elapsed": 694,
"status": "ok",
"timestamp": 1546328037918,
"user": {
"displayName": "Bob Li",
"photoUrl": "",
"userId": "13034580972517925389"
},
"user_tz": -480
},
"id": "tQT8YSDxA1f8",
"outputId": "3a43b0ba-0cb8-47e1-b019-2db84631fc6b"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Principal Components:\n",
"[[-0.95250178 -0.24902446 -0.17529172]\n",
" [ 0.29267159 -0.9076305 -0.30091563]\n",
" [-0.08416476 -0.33792558 0.93740205]]\n",
"\n",
"\n",
"Z value of the hyperplane:\n",
"[[-0.63025233 -0.59433828 -0.55842423 -0.52251018 -0.48659612 -0.45068207\n",
" -0.41476802 -0.37885397 -0.34293992 -0.30702587]\n",
" [-0.52611031 -0.49019626 -0.45428221 -0.41836815 -0.3824541 -0.34654005\n",
" -0.310626 -0.27471195 -0.2387979 -0.20288384]\n",
" [-0.42196829 -0.38605424 -0.35014018 -0.31422613 -0.27831208 -0.24239803\n",
" -0.20648398 -0.17056993 -0.13465587 -0.09874182]\n",
" [-0.31782626 -0.28191221 -0.24599816 -0.21008411 -0.17417006 -0.13825601\n",
" -0.10234196 -0.0664279 -0.03051385 0.0054002 ]\n",
" [-0.21368424 -0.17777019 -0.14185614 -0.10594209 -0.07002804 -0.03411399\n",
" 0.00180007 0.03771412 0.07362817 0.10954222]\n",
" [-0.10954222 -0.07362817 -0.03771412 -0.00180007 0.03411399 0.07002804\n",
" 0.10594209 0.14185614 0.17777019 0.21368424]\n",
" [-0.0054002 0.03051385 0.0664279 0.10234196 0.13825601 0.17417006\n",
" 0.21008411 0.24599816 0.28191221 0.31782626]\n",
" [ 0.09874182 0.13465587 0.17056993 0.20648398 0.24239803 0.27831208\n",
" 0.31422613 0.35014018 0.38605424 0.42196829]\n",
" [ 0.20288384 0.2387979 0.27471195 0.310626 0.34654005 0.3824541\n",
" 0.41836815 0.45428221 0.49019626 0.52611031]\n",
" [ 0.30702587 0.34293992 0.37885397 0.41476802 0.45068207 0.48659612\n",
" 0.52251018 0.55842423 0.59433828 0.63025233]]\n",
"\n"
]
}
],
"source": [
"axes = [-1.8, 1.8, -1.3, 1.3, -1.0, 1.0]\n",
"\n",
"x1s = np.linspace(axes[0], axes[1], 10)\n",
"x2s = np.linspace(axes[2], axes[3], 10)\n",
"x1, x2 = np.meshgrid(x1s, x2s)\n",
"# principal components (orthogonal vectors that decide the hyperplane)\n",
"C = pca.components_\n",
"print(\"Principal Components:\\n{}\\n\\n\".format(C))\n",
"# normal-vector of the hyperplane\n",
"normal_vector = np.cross(C[0,:], C[1,:])\n",
"\n",
"# calculate z-value of the dataset\n",
"z = np.empty((10, 10))\n",
"for i in range(0,10):\n",
" for j in range(0,10):\n",
" z[i, j] = -(normal_vector[0]*x1[i, j]+normal_vector[1]*x2[i ,j])/normal_vector[2]\n",
"\n",
"print(\"Z value of the hyperplane:\\n{}\\n\".format(z))"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2021-09-18T15:40:34.718707Z",
"start_time": "2021-09-18T15:40:32.664516Z"
},
"colab": {
"base_uri": "https://localhost:8080/",
"height": 357
},
"colab_type": "code",
"executionInfo": {
"elapsed": 1767,
"status": "ok",
"timestamp": 1546330698940,
"user": {
"displayName": "Bob Li",
"photoUrl": "",
"userId": "13034580972517925389"
},
"user_tz": -480
},
"id": "9BqcncFeKY7o",
"outputId": "f72323ec-0f97-4219-c00a-c892e3b55912",
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Ok, lets try for a more interesting frequency\n",
"freq = np.zeros((8, 8))\n",
"freq[2,3] = 1\n",
"freq_img = idct(idct(freq, axis=0), axis=1)\n",
"plt.imshow(freq_img)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Alright sweet, that worked. (Side point: that plot looks wiggly haha)\n",
"\n",
"Now lets try... ALL OF THEM"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"saved to output/components-0-0.png\n",
"saved to output/components-0-1.png\n",
"saved to output/components-0-2.png\n",
"saved to output/components-0-3.png\n",
"saved to output/components-0-4.png\n",
"saved to output/components-0-5.png\n",
"saved to output/components-0-6.png\n",
"saved to output/components-0-7.png\n",
"saved to output/components-1-0.png\n",
"saved to output/components-1-1.png\n",
"saved to output/components-1-2.png\n",
"saved to output/components-1-3.png\n",
"saved to output/components-1-4.png\n",
"saved to output/components-1-5.png\n",
"saved to output/components-1-6.png\n",
"saved to output/components-1-7.png\n",
"saved to output/components-2-0.png\n",
"saved to output/components-2-1.png\n",
"saved to output/components-2-2.png\n",
"saved to output/components-2-3.png\n",
"saved to output/components-2-4.png\n",
"saved to output/components-2-5.png\n",
"saved to output/components-2-6.png\n",
"saved to output/components-2-7.png\n",
"saved to output/components-3-0.png\n",
"saved to output/components-3-1.png\n",
"saved to output/components-3-2.png\n",
"saved to output/components-3-3.png\n",
"saved to output/components-3-4.png\n",
"saved to output/components-3-5.png\n",
"saved to output/components-3-6.png\n",
"saved to output/components-3-7.png\n",
"saved to output/components-4-0.png\n",
"saved to output/components-4-1.png\n",
"saved to output/components-4-2.png\n",
"saved to output/components-4-3.png\n",
"saved to output/components-4-4.png\n",
"saved to output/components-4-5.png\n",
"saved to output/components-4-6.png\n",
"saved to output/components-4-7.png\n",
"saved to output/components-5-0.png\n",
"saved to output/components-5-1.png\n",
"saved to output/components-5-2.png\n",
"saved to output/components-5-3.png\n",
"saved to output/components-5-4.png\n",
"saved to output/components-5-5.png\n",
"saved to output/components-5-6.png\n",
"saved to output/components-5-7.png\n",
"saved to output/components-6-0.png\n",
"saved to output/components-6-1.png\n",
"saved to output/components-6-2.png\n",
"saved to output/components-6-3.png\n",
"saved to output/components-6-4.png\n",
"saved to output/components-6-5.png\n",
"saved to output/components-6-6.png\n",
"saved to output/components-6-7.png\n",
"saved to output/components-7-0.png\n",
"saved to output/components-7-1.png\n",
"saved to output/components-7-2.png\n",
"saved to output/components-7-3.png\n",
"saved to output/components-7-4.png\n",
"saved to output/components-7-5.png\n",
"saved to output/components-7-6.png\n",
"saved to output/components-7-7.png\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Convert forward and backwards\n",
"freqs = dct(dct(img, axis=0, norm='ortho'), axis=1, norm='ortho')\n",
"reconstructed_img = idct(idct(freqs, axis=0, norm='ortho'), axis=1, norm='ortho')\n",
"plt.imshow(reconstructed_img)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"saved to output/img-components-0-0.png\n",
"saved to output/img-components-0-1.png\n",
"saved to output/img-components-0-2.png\n",
"saved to output/img-components-0-3.png\n",
"saved to output/img-components-0-4.png\n",
"saved to output/img-components-0-5.png\n",
"saved to output/img-components-0-6.png\n",
"saved to output/img-components-0-7.png\n",
"saved to output/img-components-1-0.png\n",
"saved to output/img-components-1-1.png\n",
"saved to output/img-components-1-2.png\n",
"saved to output/img-components-1-3.png\n",
"saved to output/img-components-1-4.png\n",
"saved to output/img-components-1-5.png\n",
"saved to output/img-components-1-6.png\n",
"saved to output/img-components-1-7.png\n",
"saved to output/img-components-2-0.png\n",
"saved to output/img-components-2-1.png\n",
"saved to output/img-components-2-2.png\n",
"saved to output/img-components-2-3.png\n",
"saved to output/img-components-2-4.png\n",
"saved to output/img-components-2-5.png\n",
"saved to output/img-components-2-6.png\n",
"saved to output/img-components-2-7.png\n",
"saved to output/img-components-3-0.png\n",
"saved to output/img-components-3-1.png\n",
"saved to output/img-components-3-2.png\n",
"saved to output/img-components-3-3.png\n",
"saved to output/img-components-3-4.png\n",
"saved to output/img-components-3-5.png\n",
"saved to output/img-components-3-6.png\n",
"saved to output/img-components-3-7.png\n",
"saved to output/img-components-4-0.png\n",
"saved to output/img-components-4-1.png\n",
"saved to output/img-components-4-2.png\n",
"saved to output/img-components-4-3.png\n",
"saved to output/img-components-4-4.png\n",
"saved to output/img-components-4-5.png\n",
"saved to output/img-components-4-6.png\n",
"saved to output/img-components-4-7.png\n",
"saved to output/img-components-5-0.png\n",
"saved to output/img-components-5-1.png\n",
"saved to output/img-components-5-2.png\n",
"saved to output/img-components-5-3.png\n",
"saved to output/img-components-5-4.png\n",
"saved to output/img-components-5-5.png\n",
"saved to output/img-components-5-6.png\n",
"saved to output/img-components-5-7.png\n",
"saved to output/img-components-6-0.png\n",
"saved to output/img-components-6-1.png\n",
"saved to output/img-components-6-2.png\n",
"saved to output/img-components-6-3.png\n",
"saved to output/img-components-6-4.png\n",
"saved to output/img-components-6-5.png\n",
"saved to output/img-components-6-6.png\n",
"saved to output/img-components-6-7.png\n",
"saved to output/img-components-7-0.png\n",
"saved to output/img-components-7-1.png\n",
"saved to output/img-components-7-2.png\n",
"saved to output/img-components-7-3.png\n",
"saved to output/img-components-7-4.png\n",
"saved to output/img-components-7-5.png\n",
"saved to output/img-components-7-6.png\n",
"saved to output/img-components-7-7.png\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Lets draw the compnents that come out\n",
"\n",
"# first need this function\n",
"def lerp(a, b, amt):\n",
" '''Linear interpolate between a and b'''\n",
" return a + (b - a) * amt\n",
"\n",
"freqs = dct(dct(img, axis=0, norm='ortho'), axis=1, norm='ortho')\n",
"\n",
"fig, axes = plt.subplots(8, 8)\n",
"\n",
"for (x, y) in itertools.product(range(8), range(8)):\n",
" freq_select = np.zeros((8, 8))\n",
" freq_select[x, y] = 1\n",
" \n",
" new_freqs = np.multiply(freqs, freq_select)\n",
" \n",
" freq_img = idct(idct(new_freqs, axis=0, norm='ortho'), axis=1, norm='ortho')\n",
" \n",
" # If we draw everything with in the same scale it's hard to see the smaller patterns\n",
" # because they're so small and come out as mostly grey.\n",
" # But if we draw them all with their own scale we can't see the relative size.\n",
" # So we go somewhere between.\n",
" scale_adjust_amt = 0.1\n",
" vmin = lerp(freq_img.min(), -1, scale_adjust_amt)\n",
" vmax = lerp(freq_img.max(), 1, scale_adjust_amt)\n",
" \n",
" ax = axes[x, y]\n",
" ax.imshow(freq_img, vmin=vmin, vmax=vmax)\n",
" ax.axis('off')\n",
" save_image(freq_img, name='output/img-components-{}-{}.png'.format(x, y), vmin=vmin, vmax=vmax)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Now lets draw the image being built up\n",
"freqs = dct(dct(img, axis=0, norm='ortho'), axis=1, norm='ortho')\n",
"\n",
"fig, axes = plt.subplots(8, 8)\n",
"\n",
"for (i, (x, y)) in enumerate(itertools.product(range(8), range(8))):\n",
" freq_select = np.zeros(8 * 8)\n",
" freq_select[:i+1] = 1\n",
" freq_select = freq_select.reshape((8, 8))\n",
" \n",
" new_freqs = np.multiply(freqs, freq_select)\n",
" \n",
" freq_img = idct(idct(new_freqs, axis=0, norm='ortho'), axis=1, norm='ortho')\n",
" \n",
" ax = axes[x, y]\n",
" ax.imshow(freq_img, vmin=0, vmax=1)\n",
" ax.axis('off')"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0., 1., 5., 6.],\n",
" [ 2., 4., 7., 12.],\n",
" [ 3., 8., 11., 13.],\n",
" [ 9., 10., 14., 15.]])"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Fill in a similar way to how jpegs do it?\n",
"\n",
"def loop_like_a_jpeg(size):\n",
" \"\"\"Generates a bunch of tuples that loop over a matrix in a zig-zag way\n",
" \"\"\"\n",
" flip_dir = False\n",
" for i in range(size):\n",
" r = range(i + 1)\n",
" if flip_dir:\n",
" r = reversed(r)\n",
" \n",
" for j in r:\n",
" # Start at the right edge (0, i), and go upwards to the right\n",
" yield (0 + j, i - j)\n",
" flip_dir = not flip_dir\n",
"\n",
" for i in range(1, size):\n",
" r = range(size - i)\n",
" if flip_dir:\n",
" r = reversed(r)\n",
" \n",
" for j in r:\n",
" # Start the the bottom edge (i, size-1) and go upwards to the right\n",
" yield(i + j, (size - 1) - j)\n",
" flip_dir = not flip_dir\n",
"\n",
"arr = np.zeros((4, 4))\n",
"for (i, (x, y)) in enumerate(loop_like_a_jpeg(4)):\n",
"# print(x, y)\n",
" arr[y, x] = i\n",
"arr"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"saved to output/img-buildup-0-0.png\n",
"saved to output/img-buildup-0-1.png\n",
"saved to output/img-buildup-1-0.png\n",
"saved to output/img-buildup-2-0.png\n",
"saved to output/img-buildup-1-1.png\n",
"saved to output/img-buildup-0-2.png\n",
"saved to output/img-buildup-0-3.png\n",
"saved to output/img-buildup-1-2.png\n",
"saved to output/img-buildup-2-1.png\n",
"saved to output/img-buildup-3-0.png\n",
"saved to output/img-buildup-4-0.png\n",
"saved to output/img-buildup-3-1.png\n",
"saved to output/img-buildup-2-2.png\n",
"saved to output/img-buildup-1-3.png\n",
"saved to output/img-buildup-0-4.png\n",
"saved to output/img-buildup-0-5.png\n",
"saved to output/img-buildup-1-4.png\n",
"saved to output/img-buildup-2-3.png\n",
"saved to output/img-buildup-3-2.png\n",
"saved to output/img-buildup-4-1.png\n",
"saved to output/img-buildup-5-0.png\n",
"saved to output/img-buildup-6-0.png\n",
"saved to output/img-buildup-5-1.png\n",
"saved to output/img-buildup-4-2.png\n",
"saved to output/img-buildup-3-3.png\n",
"saved to output/img-buildup-2-4.png\n",
"saved to output/img-buildup-1-5.png\n",
"saved to output/img-buildup-0-6.png\n",
"saved to output/img-buildup-0-7.png\n",
"saved to output/img-buildup-1-6.png\n",
"saved to output/img-buildup-2-5.png\n",
"saved to output/img-buildup-3-4.png\n",
"saved to output/img-buildup-4-3.png\n",
"saved to output/img-buildup-5-2.png\n",
"saved to output/img-buildup-6-1.png\n",
"saved to output/img-buildup-7-0.png\n",
"saved to output/img-buildup-7-1.png\n",
"saved to output/img-buildup-6-2.png\n",
"saved to output/img-buildup-5-3.png\n",
"saved to output/img-buildup-4-4.png\n",
"saved to output/img-buildup-3-5.png\n",
"saved to output/img-buildup-2-6.png\n",
"saved to output/img-buildup-1-7.png\n",
"saved to output/img-buildup-2-7.png\n",
"saved to output/img-buildup-3-6.png\n",
"saved to output/img-buildup-4-5.png\n",
"saved to output/img-buildup-5-4.png\n",
"saved to output/img-buildup-6-3.png\n",
"saved to output/img-buildup-7-2.png\n",
"saved to output/img-buildup-7-3.png\n",
"saved to output/img-buildup-6-4.png\n",
"saved to output/img-buildup-5-5.png\n",
"saved to output/img-buildup-4-6.png\n",
"saved to output/img-buildup-3-7.png\n",
"saved to output/img-buildup-4-7.png\n",
"saved to output/img-buildup-5-6.png\n",
"saved to output/img-buildup-6-5.png\n",
"saved to output/img-buildup-7-4.png\n",
"saved to output/img-buildup-7-5.png\n",
"saved to output/img-buildup-6-6.png\n",
"saved to output/img-buildup-5-7.png\n",
"saved to output/img-buildup-6-7.png\n",
"saved to output/img-buildup-7-6.png\n",
"saved to output/img-buildup-7-7.png\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
],
"text/plain": [
" SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm\n",
"count 150.000000 150.000000 150.000000 150.000000\n",
"mean 5.843333 3.054000 3.758667 1.198667\n",
"std 0.828066 0.433594 1.764420 0.763161\n",
"min 4.300000 2.000000 1.000000 0.100000\n",
"25% 5.100000 2.800000 1.600000 0.300000\n",
"50% 5.800000 3.000000 4.350000 1.300000\n",
"75% 6.400000 3.300000 5.100000 1.800000\n",
"max 7.900000 4.400000 6.900000 2.500000"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Getting the Statistical Information\n",
"iris.describe()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"RangeIndex: 150 entries, 0 to 149\n",
"Data columns (total 5 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 SepalLengthCm 150 non-null float64\n",
" 1 SepalWidthCm 150 non-null float64\n",
" 2 PetalLengthCm 150 non-null float64\n",
" 3 PetalWidthCm 150 non-null float64\n",
" 4 Species 150 non-null object \n",
"dtypes: float64(4), object(1)\n",
"memory usage: 6.0+ KB\n"
]
}
],
"source": [
"# Lets check for datatypes\n",
"iris.info()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Using Pairplots for better understanding of the data points distribution"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"sns.pairplot(data=iris,hue=\"Species\",palette=\"Set1\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"From above visuals iris-setosa is easily separable from the other two."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.cluster import KMeans\n",
"features = iris.loc[:,[\"SepalLengthCm\",\"SepalWidthCm\",\"PetalLengthCm\",\"PetalWidthCm\"]]"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "q_pPmK9GIKMz"
},
"source": [
"#### Below snippet shows how we can find the optimum number of clusters for K Means and how can we determine the value of K?"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 376
},
"colab_type": "code",
"executionInfo": {
"elapsed": 1649,
"status": "ok",
"timestamp": 1544110062756,
"user": {
"displayName": "A M Aditya",
"photoUrl": "https://lh3.googleusercontent.com/-WI8p7JNWLic/AAAAAAAAAAI/AAAAAAAAAfs/vS8ElgH0p0c/s64/photo.jpg",
"userId": "15341571102300750919"
},
"user_tz": -480
},
"id": "WevSKogFEalU",
"outputId": "d0161248-67f2-48a4-cf4b-224f8faae045"
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Finding the optimum number of clusters for k-means classification\n",
"\n",
"x = iris.iloc[:, [0, 1, 2, 3]].values\n",
"\n",
"from sklearn.cluster import KMeans\n",
"wcss = []\n",
"\n",
"for i in range(1, 11):\n",
" kmeans = KMeans(n_clusters = i, init = 'k-means++', \n",
" max_iter = 300, n_init = 10, random_state = 0)\n",
" kmeans.fit(x)\n",
" wcss.append(kmeans.inertia_)\n",
" \n",
"# Plotting the results onto a line graph, \n",
"# `allowing us to observe 'The elbow'\n",
"plt.plot(range(1, 11), wcss)\n",
"plt.title('The elbow method')\n",
"plt.xlabel('Number of clusters')\n",
"plt.ylabel('WCSS') # Within cluster sum of squares\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "IUXmLTh4Ih6r"
},
"source": [
"We can clearly see why it is called 'The elbow method' from the above graph, the optimum clusters is where the elbow occurs. This is when the within cluster sum of squares (WCSS) doesn't decrease significantly with every iteration.\n",
"\n",
"From this we choose the number of clusters as **3**."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Verifying visually that with which cluster number, K-means will be optimum"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(24,4))\n",
"\n",
"plt.suptitle(\"K Means Clustering\",fontsize=20)\n",
"\n",
"\n",
"plt.subplot(1,5,1)\n",
"plt.title(\"K = 1\",fontsize=16)\n",
"plt.xlabel(\"PetalLengthCm\")\n",
"plt.ylabel(\"PetalWidthCm\")\n",
"plt.scatter(features.PetalLengthCm,features.PetalWidthCm)\n",
"\n",
"\n",
"plt.subplot(1,5,2)\n",
"plt.title(\"K = 2\",fontsize=16)\n",
"plt.xlabel(\"PetalLengthCm\")\n",
"kmeans = KMeans(n_clusters=2)\n",
"features[\"labels\"] = kmeans.fit_predict(features)\n",
"plt.scatter(features.PetalLengthCm[features.labels == 0],features.PetalWidthCm[features.labels == 0])\n",
"plt.scatter(features.PetalLengthCm[features.labels == 1],features.PetalWidthCm[features.labels == 1])\n",
"\n",
"# dropping labels we only want to use features.\n",
"features.drop([\"labels\"],axis=1,inplace=True)\n",
"\n",
"plt.subplot(1,5,4)\n",
"plt.title(\"K = 3\",fontsize=16)\n",
"plt.xlabel(\"PetalLengthCm\")\n",
"kmeans = KMeans(n_clusters=3)\n",
"features[\"labels\"] = kmeans.fit_predict(features)\n",
"plt.scatter(features.PetalLengthCm[features.labels == 0],features.PetalWidthCm[features.labels == 0])\n",
"plt.scatter(features.PetalLengthCm[features.labels == 1],features.PetalWidthCm[features.labels == 1])\n",
"plt.scatter(features.PetalLengthCm[features.labels == 2],features.PetalWidthCm[features.labels == 2])\n",
"\n",
"# dropping labels as we only want to use features.\n",
"features.drop([\"labels\"],axis=1,inplace=True)\n",
"\n",
"plt.subplot(1,5,3)\n",
"plt.title(\"K = 4\",fontsize=16)\n",
"plt.xlabel(\"PetalLengthCm\")\n",
"kmeans = KMeans(n_clusters=4)\n",
"features[\"labels\"] = kmeans.fit_predict(features)\n",
"plt.scatter(features.PetalLengthCm[features.labels == 0],features.PetalWidthCm[features.labels == 0])\n",
"plt.scatter(features.PetalLengthCm[features.labels == 1],features.PetalWidthCm[features.labels == 1])\n",
"plt.scatter(features.PetalLengthCm[features.labels == 2],features.PetalWidthCm[features.labels == 2])\n",
"plt.scatter(features.PetalLengthCm[features.labels == 3],features.PetalWidthCm[features.labels == 3])\n",
"\n",
"# dropping labels as we only want to use features.\n",
"features.drop([\"labels\"],axis=1,inplace=True)\n",
"\n",
"plt.subplot(1,5,5)\n",
"plt.title(\"Original Labels\",fontsize=16)\n",
"plt.xlabel(\"PetalLengthCm\")\n",
"plt.scatter(iris.PetalLengthCm[iris.Species == \"Iris-setosa\"],iris.PetalWidthCm[iris.Species == \"Iris-setosa\"])\n",
"plt.scatter(iris.PetalLengthCm[iris.Species == \"Iris-versicolor\"],iris.PetalWidthCm[iris.Species == \"Iris-versicolor\"])\n",
"plt.scatter(iris.PetalLengthCm[iris.Species == \"Iris-virginica\"],iris.PetalWidthCm[iris.Species == \"Iris-virginica\"])\n",
"\n",
"plt.subplots_adjust(top=0.8)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "aJbyXuNGIXI9"
},
"outputs": [],
"source": [
"# Applying kmeans to the dataset / Creating the kmeans classifier\n",
"kmeans = KMeans(n_clusters = 3, init = 'k-means++',\n",
" max_iter = 300, n_init = 10, random_state = 0)\n",
"y_kmeans = kmeans.fit_predict(x)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 364
},
"colab_type": "code",
"executionInfo": {
"elapsed": 670,
"status": "ok",
"timestamp": 1544110172140,
"user": {
"displayName": "A M Aditya",
"photoUrl": "https://lh3.googleusercontent.com/-WI8p7JNWLic/AAAAAAAAAAI/AAAAAAAAAfs/vS8ElgH0p0c/s64/photo.jpg",
"userId": "15341571102300750919"
},
"user_tz": -480
},
"id": "Q42-XPJjIyXv",
"outputId": "12284613-40c5-41c6-93ba-6b66fae0aa5f"
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Visualising the clusters - On the first two columns\n",
"plt.scatter(x[y_kmeans == 0, 0], x[y_kmeans == 0, 1], \n",
" s = 100, c = 'red', label = 'Iris-setosa')\n",
"plt.scatter(x[y_kmeans == 1, 0], x[y_kmeans == 1, 1], \n",
" s = 100, c = 'blue', label = 'Iris-versicolour')\n",
"plt.scatter(x[y_kmeans == 2, 0], x[y_kmeans == 2, 1],\n",
" s = 100, c = 'green', label = 'Iris-virginica')\n",
"\n",
"# Plotting the centroids of the clusters\n",
"plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:,1], \n",
" s = 100, c = 'yellow', label = 'Centroids')\n",
"\n",
"plt.legend()"
]
}
],
"metadata": {
"colab": {
"collapsed_sections": [],
"name": "KMeans_Clustering.ipynb",
"provenance": [],
"version": "0.3.2"
},
"hide_input": false,
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.8"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 1
}
================================================
FILE: 02_Python/K-Means_Implementation/Links.txt
================================================
https://www.machinelearningplus.com/predictive-modeling/k-means-clustering/
================================================
FILE: 02_Python/K-Means_Implementation/README.md
================================================
# K-Means-Clustering
It is a Unsupervised Machine Learning Algorithm. In this notebook we to predict the optimum number of
clusters in Iris dataset and represent it visually.
================================================
FILE: 02_Python/K_Means.py
================================================
#================================================================================================================
#----------------------------------------------------------------------------------------------------------------
# K MEANS CLUSTERING
#----------------------------------------------------------------------------------------------------------------
#================================================================================================================
# K means clustering is applied to normalized ipl player data
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style
import pandas as pd
style.use('ggplot')
class K_Means:
def __init__(self, k =3, tolerance = 0.0001, max_iterations = 500):
self.k = k
self.tolerance = tolerance
self.max_iterations = max_iterations
def fit(self, data):
self.centroids = {}
#initialize the centroids, the first 'k' elements in the dataset will be our initial centroids
for i in range(self.k):
self.centroids[i] = data[i]
#begin iterations
for i in range(self.max_iterations):
self.classes = {}
for i in range(self.k):
self.classes[i] = []
#find the distance between the point and cluster; choose the nearest centroid
for features in data:
distances = [np.linalg.norm(features - self.centroids[centroid]) for centroid in self.centroids]
classification = distances.index(min(distances))
self.classes[classification].append(features)
previous = dict(self.centroids)
#average the cluster datapoints to re-calculate the centroids
for classification in self.classes:
self.centroids[classification] = np.average(self.classes[classification], axis = 0)
isOptimal = True
for centroid in self.centroids:
original_centroid = previous[centroid]
curr = self.centroids[centroid]
if np.sum((curr - original_centroid)/original_centroid * 100.0) > self.tolerance:
isOptimal = False
#break out of the main loop if the results are optimal, ie. the centroids don't change their positions much(more than our tolerance)
if isOptimal:
break
def pred(self, data):
distances = [np.linalg.norm(data - self.centroids[centroid]) for centroid in self.centroids]
classification = distances.index(min(distances))
return classification
def main():
df = pd.read_csv(r".\data\ipl.csv")
df = df[['one', 'two']]
dataset = df.astype(float).values.tolist()
X = df.values #returns a numpy array
km = K_Means(3)
km.fit(X)
# Plotting starts here
colors = 10*["r", "g", "c", "b", "k"]
for centroid in km.centroids:
plt.scatter(km.centroids[centroid][0], km.centroids[centroid][1], s = 130, marker = "x")
for classification in km.classes:
color = colors[classification]
for features in km.classes[classification]:
plt.scatter(features[0], features[1], color = color,s = 30)
plt.show()
if __name__ == "__main__":
main()
================================================
FILE: 02_Python/K_Nearest_Neighbours.py
================================================
#================================================================================================================
#----------------------------------------------------------------------------------------------------------------
# K NEAREST NEIGHBOURS
#----------------------------------------------------------------------------------------------------------------
#================================================================================================================
# Details of implementation/tutorial is in : http://madhugnadig.com/articles/machine-learning/2017/01/13/implementing-k-nearest-neighbours-from-scratch-in-python.html
import math
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style
import pandas as pd
import random
from collections import Counter
from sklearn import preprocessing
import time
#for plotting
plt.style.use('ggplot')
class CustomKNN:
def __init__(self):
self.accurate_predictions = 0
self.total_predictions = 0
self.accuracy = 0.0
def predict(self, training_data, to_predict, k = 3):
if len(training_data) >= k:
print("K cannot be smaller than the total voting groups(ie. number of training data points)")
return
distributions = []
for group in training_data:
for features in training_data[group]:
euclidean_distance = np.linalg.norm(np.array(features)- np.array(to_predict))
distributions.append([euclidean_distance, group])
results = [i[1] for i in sorted(distributions)[:k]]
result = Counter(results).most_common(1)[0][0]
confidence = Counter(results).most_common(1)[0][1]/k
return result, confidence
def test(self, test_set, training_set):
for group in test_set:
for data in test_set[group]:
predicted_class,confidence = self.predict(training_set, data, k =3)
if predicted_class == group:
self.accurate_predictions += 1
else:
print("Wrong classification with confidence " + str(confidence * 100) + " and class " + str(predicted_class))
self.total_predictions += 1
self.accuracy = 100*(self.accurate_predictions/self.total_predictions)
print("\nAcurracy :", str(self.accuracy) + "%")
def mod_data(df):
df.replace('?', -999999, inplace = True)
df.replace('yes', 4, inplace = True)
df.replace('no', 2, inplace = True)
df.replace('notpresent', 4, inplace = True)
df.replace('present', 2, inplace = True)
df.replace('abnormal', 4, inplace = True)
df.replace('normal', 2, inplace = True)
df.replace('poor', 4, inplace = True)
df.replace('good', 2, inplace = True)
df.replace('ckd', 4, inplace = True)
df.replace('notckd', 2, inplace = True)
def main():
df = pd.read_csv(r".\data\chronic_kidney_disease.csv")
mod_data(df)
dataset = df.astype(float).values.tolist()
#Normalize the data
x = df.values #returns a numpy array
min_max_scaler = preprocessing.MinMaxScaler()
x_scaled = min_max_scaler.fit_transform(x)
df = pd.DataFrame(x_scaled) #Replace df with normalized values
#Shuffle the dataset
random.shuffle(dataset)
#20% of the available data will be used for testing
test_size = 0.2
#The keys of the dict are the classes that the data is classfied into
training_set = {2: [], 4:[]}
test_set = {2: [], 4:[]}
#Split data into training and test for cross validation
training_data = dataset[:-int(test_size * len(dataset))]
test_data = dataset[-int(test_size * len(dataset)):]
#Insert data into the training set
for record in training_data:
training_set[record[-1]].append(record[:-1]) # Append the list in the dict will all the elements of the record except the class
#Insert data into the test set
for record in test_data:
test_set[record[-1]].append(record[:-1]) # Append the list in the dict will all the elements of the record except the class
s = time.clock()
knn = CustomKNN()
knn.test(test_set, training_set)
e = time.clock()
print("Exec Time:" ,e-s)
if __name__ == "__main__":
main()
================================================
FILE: 02_Python/K_Nearest_Neighbours_In_Parallel.py
================================================
#================================================================================================================
#----------------------------------------------------------------------------------------------------------------
# K NEAREST NEIGHBOURS
#----------------------------------------------------------------------------------------------------------------
#================================================================================================================
# Details of implementation/tutorial is in : http://madhugnadig.com/articles/machine-learning/parallel-processing/2017/02/10/implementing-k-nearest-neighbours-in-parallel-from-scratch.html
import math
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style
import pandas as pd
import random
from collections import Counter
from sklearn import preprocessing
from itertools import repeat
import multiprocessing as mp
import time
#for plotting
plt.style.use('ggplot')
class CustomKNN:
def __init__(self):
self.accurate_predictions = 0
self.total_predictions = 0
self.accuracy = 0.0
def predict(self, training_data, to_predict, k = 3):
if len(training_data) >= k:
print("K cannot be smaller than the total voting groups(ie. number of training data points)")
return
distributions = []
for group in training_data:
for features in training_data[group]:
#Calculate Euclidean distance
euclidean_distance = np.linalg.norm(np.array(features)- np.array(to_predict))
distributions.append([euclidean_distance, group])
#Find the class of K nearest points
results = [i[1] for i in sorted(distributions)[:k]]
result = Counter(results).most_common(1)[0][0]
confidence = Counter(results).most_common(1)[0][1]/k
return result, to_predict
def test(self, test_set, training_set):
pool = mp.Pool(processes= 8)
arr = {}
s = time.clock()
# 'Parallelization' happens here
for group in test_set:
arr[group] = pool.starmap(self.predict, zip(repeat(training_set), test_set[group], repeat(3)))
e = time.clock()
#Calculating Accuracy
for group in test_set:
for data in test_set[group]:
for i in arr[group]:
if data == i[1]:
self.total_predictions += 1
#If accuracte -> predicted class = original class
if group == i[0]:
self.accurate_predictions+=1
self.accuracy = 100*(self.accurate_predictions/self.total_predictions)
print("\nAcurracy :", str(self.accuracy) + "%")
def mod_data(df):
df.replace('?', -999999, inplace = True)
df.replace('yes', 4, inplace = True)
df.replace('no', 2, inplace = True)
df.replace('notpresent', 4, inplace = True)
df.replace('present', 2, inplace = True)
df.replace('abnormal', 4, inplace = True)
df.replace('normal', 2, inplace = True)
df.replace('poor', 4, inplace = True)
df.replace('good', 2, inplace = True)
df.replace('ckd', 4, inplace = True)
df.replace('notckd', 2, inplace = True)
def main():
#Load the dataset
df = pd.read_csv(r".\data\chronic_kidney_disease.csv")
mod_data(df)
dataset = df.astype(float).values.tolist()
#Normalize the data
x = df.values #returns a numpy array
min_max_scaler = preprocessing.MinMaxScaler()
x_scaled = min_max_scaler.fit_transform(x)
df = pd.DataFrame(x_scaled) #Replace df with normalized values
#Shuffle the dataset
random.shuffle(dataset)
#10% of the available data will be used for testing
test_size = 0.1
#The keys of the dict are the classes that the data is classfied into
training_set = {2: [], 4:[]}
test_set = {2: [], 4:[]}
#Split data into training and test for cross validation
training_data = dataset[:-int(test_size * len(dataset))]
test_data = dataset[-int(test_size * len(dataset)):]
#Insert data into the training set
for record in training_data:
training_set[record[-1]].append(record[:-1]) # Append the list in the dict will all the elements of the record except the class
#Insert data into the test set
for record in test_data:
test_set[record[-1]].append(record[:-1]) # Append the list in the dict will all the elements of the record except the class
s = time.clock()
knn = CustomKNN()
knn.test(test_set, training_set)
e = time.clock()
print("Exec Time: ", e-s)
if __name__ == "__main__":
main()
================================================
FILE: 02_Python/Linear_Regression.py
================================================
#================================================================================================================
#----------------------------------------------------------------------------------------------------------------
# SIMPLE LINEAR REGRESSION
#----------------------------------------------------------------------------------------------------------------
#================================================================================================================
#Simple linear regression is applied to stock data, where the x values are time and y values are the stock closing price.
#This is not an ideal application of simple linear regression, but it suffices to be a good experiment.
import math
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style
import pandas
import datetime
#Quandl for getting stock data
import quandl
#for plotting
plt.style.use('ggplot')
class CustomLinearRegression:
def __init__(self):
self.intercept = 0
self.slope = 0
#arithmetic mean
def am(self, arr):
tot = 0.0
for i in arr:
tot+= i
return tot/len(arr)
#finding the slope in best fit line
def best_fit(self, dimOne, dimTwo):
self.slope = ( (self.am(dimOne) * self.am(dimTwo) ) - self.am(dimOne*dimTwo) ) / ( self.am(dimOne)**2 - self.am(dimOne**2) ) #formula for finding slope
return self.slope
#finding the best fit intercept
def y_intercept(self, dimOne ,dimTwo):
self.intercept = self.am( dimTwo ) - ( self.slope * self.am(dimOne) )
return self.intercept
#predict for future values based on model
def predict(self, ip):
ip = np.array(ip)
predicted = [(self.slope*param) + self.intercept for param in ip] #create a "predicted" array where the index corresponds to the index of the input
return predicted
#find the squared error
def squared_error(self, original, model):
return sum((model - original) **2)
#find co-efficient of determination for R^2
def cod(self, original, model):
am_line = [self.am(original) for y in original]
sq_error = self.squared_error(original, model)
sq_error_am = self.squared_error(original, am_line)
return 1 - (sq_error/sq_error_am) #R^2 is nothing but 1 - of squared error for our model / squared error if the model only consisted of the mean
def main():
stk = quandl.get("WIKI/TSLA")
simpl_linear_regression = CustomLinearRegression()
#reset index to procure date - date was the initial default index
stk = stk.reset_index()
#Add them headers
stk = stk[['Date','Adj. Open','Adj. High','Adj. Low','Adj. Close', 'Volume']]
stk['Date'] = pandas.to_datetime(stk['Date'])
stk['Date'] = (stk['Date'] - stk['Date'].min()) / np.timedelta64(1,'D')
#The column that needs to be forcasted using linear regression
forecast_col = 'Adj. Close'
#take care of NA's
stk.fillna(-999999, inplace = True)
stk['label'] = stk[forecast_col]
#IN CASE THE INPUT IS TO BE TAKEN IN FROM THE COMMAND PROMPT UNCOMMENT THE LINES BELOW
#takes in input from the user
#x = list(map(int, input("Enter x: \n").split()))
#y = list(map(int, input("Enter y: \n").split()))
#convert to an numpy array with datatype as 64 bit float.
#x = np.array(x, dtype = np.float64)
#y = np.array(y, dtype = np.float64)
stk.dropna(inplace = True)
x = np.array(stk['Date'])
y = np.array(stk['label'])
#Always in the order: first slope, then intercept
slope = simpl_linear_regression.best_fit(x, y) #find slope
intercept = simpl_linear_regression.y_intercept(x, y) #find the intercept
ip = list(map(int, input("Enter x to predict y: \n").split()))
line = simpl_linear_regression.predict(ip) #predict based on model
reg = [(slope*param) + intercept for param in x]
print("Predicted value(s) after linear regression :", line)
r_sqrd = simpl_linear_regression.cod(y, reg)
print("R^2 Value: " ,r_sqrd)
plt.scatter(x, y)
plt.scatter(ip, line, color = "red")
plt.plot(x, reg)
plt.show()
if __name__ == "__main__":
main()
================================================
FILE: 02_Python/Logistic_Regression.py
================================================
#================================================================================================================
#----------------------------------------------------------------------------------------------------------------
# LOGISTIC REGRESSION
#----------------------------------------------------------------------------------------------------------------
#================================================================================================================
import math
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style
import pandas as pd
import datetime
from sklearn.cross_validation import train_test_split
#for plotting
plt.style.use('ggplot')
#Using gradient decent here to arrive at the optimal.
class CustomLogisticRegression:
def __init__(self, x, y, tolerence = 0.00001):
self.tolerence = tolerence
self.cost = []
self.alpha = 0.1
self.lambd = 0.25
self.iter = 2500
self.x = x
self.y = y
#initialie theta
self.theta = np.random.rand(x.shape[1],1)
#the cost function
def cost_fn(self, m):
h = self.sigmoid_function(np.dot(self.x, self.theta)) #get the hypothesis
J = ( 1.0/m ) * np.sum( -self.y * (np.log (h)) - ( 1.0 -self.y ) * (np.log(1.0 -h)) ) #This is the cost that needs to be paid by the learning algorithm if the outcome is hθ(x) and the actual outcome is y
return J
#The sigmoid function
def sigmoid_function(z):
return 1.0 / ( 1.0 + math.e**(-1*z) ) #Using 1.0 to make it a floating point type
#Gradient function
def gradients(self, m):
zrd = self.theta
zrd[0, :] = 0
h = self.sigmoid_function(np.dot(self.x, self.theta)) #get the hypothesis
return ( 1.0/m ) * np.dot(self.x.T, ( h - self.y ) ) + (float(self.lambd)/m) * zrd
#This is batch
def descent(self):
for i in range(self.iter):
self.cost.append( self.cost_fn(self.x.shape[0]))
gradientz = self.gradients(x.shape[0])
#Change theta based on the "gradientz"
self.theta[0, :] = gradientz[0, :] - self.alpha * gradientz[0, :]
self.theta[1, :] = gradientz[1:, :] - self.alpha * gradientz[1:, :]
pred = np.dot(self.x, self.theta)
pred[ pred >= 0.5 ] = 1
pred[ pred < 0.5 ] = 0
def main():
#IN CASE THE INPUT IS TO BE TAKEN IN FROM THE COMMAND PROMPT
#takes in input from the user
#x = list(map(int, input("Enter x: \n").split()))
#y = list(map(int, input("Enter y: \n").split()))
#convert to an numpy array with datatype as 64 bit float.
#x = np.array(x, dtype = np.float64)
#y = np.array(y, dtype = np.float64)
df = pd.read_table('.\data\logistic_regression_data.txt', sep = ',', names = ('featureOne', 'featureTwo', 'label'))
y = np.array(df['label']).T
df = np.array(df)
x = df[:,:2]
#normalize the data
df = (df - df.mean()) / (df.max() - df.min())
x_test, y_test, x_train, y_train = train_test_split(x,y, test_size = 0.1, random_state = 0)
glm = CustomLogisticRegression(x, y)
glm.descent()
plt.scatter(x[:,0], y)
plt.show()
if __name__ == "__main__":
main()
================================================
FILE: 02_Python/MSCRED/cnn_lstm/Untitled.ipynb
================================================
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import tensorflow as tf\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"INFO line 17:13: Renamed keyword argument for tf.nn.conv2d from filter to filters\n",
"INFO line 33:72: Changing tf.contrib.layers xavier initializer to a tf.compat.v1.keras.initializers.VarianceScaling and converting arguments.\n",
"\n",
"WARNING line 73:21: Using member tf.contrib.rnn.ConvLSTMCell in deprecated module tf.contrib.rnn. (Manual edit required) tf.contrib.rnn.* has been deprecated, and widely used cells/functions will be moved to tensorflow/addons repository. Please check it there and file Github issues if necessary.\n",
"ERROR line 73:21: Using member tf.contrib.rnn.ConvLSTMCell in deprecated module tf.contrib. tf.contrib.rnn.ConvLSTMCell cannot be converted automatically. tf.contrib will not be distributed with TensorFlow 2.0, please consider an alternative in non-contrib TensorFlow, a community-maintained repository such as tensorflow/addons, or fork the required code.\n",
"INFO line 84:21: Renamed 'tf.nn.dynamic_rnn' to 'tf.compat.v1.nn.dynamic_rnn'\n",
"INFO line 89:27: Added keywords to args of function 'tf.reduce_sum'\n",
"INFO line 109:13: Renamed keyword argument for tf.nn.conv2d_transpose from value to input\n",
"INFO line 109:13: Renamed keyword argument for tf.nn.conv2d_transpose from filter to filters\n",
"INFO line 143:11: Renamed 'tf.Session' to 'tf.compat.v1.Session'"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2020-07-29 12:50:45.162844: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_101.dll\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"INFO line 164:11: Added keywords to args of function 'tf.reduce_mean'\n",
"INFO line 168:11: Renamed 'tf.global_variables_initializer' to 'tf.compat.v1.global_variables_initializer'\n",
"WARNING line 198:4: *.save requires manual check. (This warning is only applicable if the code saves a tf.Keras model) Keras model.save now saves to the Tensorflow SavedModel format by default, instead of HDF5. To continue saving to HDF5, add the argument save_format='h5' to the save() function.\n",
"TensorFlow 2.0 Upgrade Script\n",
"-----------------------------\n",
"Converted 1 files\n",
"Detected 3 issues that require attention\n",
"--------------------------------------------------------------------------------\n",
"--------------------------------------------------------------------------------\n",
"File: convlstm.py\n",
"--------------------------------------------------------------------------------\n",
"convlstm.py:73:21: WARNING: Using member tf.contrib.rnn.ConvLSTMCell in deprecated module tf.contrib.rnn. (Manual edit required) tf.contrib.rnn.* has been deprecated, and widely used cells/functions will be moved to tensorflow/addons repository. Please check it there and file Github issues if necessary.\n",
"convlstm.py:73:21: ERROR: Using member tf.contrib.rnn.ConvLSTMCell in deprecated module tf.contrib. tf.contrib.rnn.ConvLSTMCell cannot be converted automatically. tf.contrib will not be distributed with TensorFlow 2.0, please consider an alternative in non-contrib TensorFlow, a community-maintained repository such as tensorflow/addons, or fork the required code.\n",
"convlstm.py:198:4: WARNING: *.save requires manual check. (This warning is only applicable if the code saves a tf.Keras model) Keras model.save now saves to the Tensorflow SavedModel format by default, instead of HDF5. To continue saving to HDF5, add the argument save_format='h5' to the save() function.\n",
"\n",
"\n",
"Make sure to read the detailed log 'report.txt'\n",
"\n"
]
}
],
"source": [
"!tf_upgrade_v2 \\\n",
" --infile convlstm.py \\\n",
" --outfile convlstm-update.py "
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.7"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
================================================
FILE: 02_Python/MSCRED/cnn_lstm/__init__.py
================================================
================================================
FILE: 02_Python/MSCRED/cnn_lstm/convlstm-update.py
================================================
import tensorflow as tf
import cnn_lstm.utils as util
import numpy as np
import os
def cnn_encoder_layer(data, filter_layer, strides):
"""
:param data: the input data, when it is the first layer is 5 * 30 * 30 * 3, the second layer is 30 * 30 * 32,
the third layer is 15 * 15 * 64, the fourth layer is 8 * 8 * 128
:param filter_layer:
:param strides:
:return: the result after conv, the first layer is 30 * 30 * 32, the second layer is 15 * 15 * 64, the third layer
is 8 * 8 * 128, the final layer is 4 * 4 * 256
"""
result = tf.nn.conv2d(
input=data,
filters=filter_layer,
strides=strides,
padding="SAME")
return tf.nn.selu(result)
def tensor_variable(shape, name):
"""
Tensor variable declaration initialization
:param shape:
:param name:
:return:
"""
variable = tf.Variable(tf.zeros(shape), name=name)
variable = tf.compat.v1.get_variable(name, shape=shape, initializer=tf.compat.v1.keras.initializers.VarianceScaling(scale=1.0, mode="fan_avg", distribution="uniform"))
return variable
def cnn_encoder(data):
"""
:param data: the input data size is 5 * 30 * 30 * 3
:return:
"""
# the first layer,the output size is 30 * 30 * 32
filter1 = tensor_variable([3, 3, 3, 32], "filter1")
strides1 = (1, 1, 1, 1)
cnn1_out = cnn_encoder_layer(data, filter1, strides1)
# the second layer, the output size is 15 * 15 * 64
filter2 = tensor_variable([3, 3, 32, 64], "filter2")
strides2 = (1, 2, 2, 1)
cnn2_out = cnn_encoder_layer(cnn1_out, filter2, strides2)
# the third layer, the output size is 8 * 8 * 128
filter3 = tensor_variable([2, 2, 64, 128], "filter3")
strides3 = (1, 2, 2, 1)
cnn3_out = cnn_encoder_layer(cnn2_out, filter3, strides3)
# the fourth layer, the output size is 4 * 4 * 256
filter4 = tensor_variable([2, 2, 128, 256], "filter4")
strides4 = (1, 2, 2, 1)
cnn4_out = cnn_encoder_layer(cnn3_out, filter4, strides4)
return cnn1_out, cnn2_out, cnn3_out, cnn4_out
def cnn_lstm_attention_layer(input_data, layer_number):
"""
:param input_data:
:param layer_number:
:return:
"""
convlstm_layer = tf.contrib.rnn.ConvLSTMCell(
conv_ndims=2,
input_shape=[input_data.shape[2], input_data.shape[3], input_data.shape[4]],
output_channels=input_data.shape[-1],
kernel_shape=[2, 2],
use_bias=True,
skip_connection=False,
forget_bias=1.0,
initializers=None,
name="conv_lstm_cell" + str(layer_number))
outputs, state = tf.compat.v1.nn.dynamic_rnn(convlstm_layer, input_data, dtype=input_data.dtype)
# attention based on inner-product between feature representation of last step and other steps
attention_w = []
for k in range(util.step_max):
attention_w.append(tf.reduce_sum(input_tensor=tf.multiply(outputs[0][k], outputs[0][-1])) / util.step_max)
attention_w = tf.reshape(tf.nn.softmax(tf.stack(attention_w)), [1, util.step_max])
outputs = tf.reshape(outputs[0], [util.step_max, -1])
outputs = tf.matmul(attention_w, outputs)
outputs = tf.reshape(outputs, [1, input_data.shape[2], input_data.shape[3], input_data.shape[4]])
return outputs, attention_w
def cnn_decoder_layer(conv_lstm_out_c, filter, output_shape, strides):
"""
:param conv_lstm_out_c:
:param filter:
:param output_shape:
:param strides:
:return:
"""
deconv = tf.nn.conv2d_transpose(
input=conv_lstm_out_c,
filters=filter,
output_shape=output_shape,
strides=strides,
padding="SAME")
deconv = tf.nn.selu(deconv)
return deconv
def cnn_decoder(lstm1_out, lstm2_out, lstm3_out, lstm4_out):
d_filter4 = tensor_variable([2, 2, 128, 256], "d_filter4")
dec4 = cnn_decoder_layer(lstm4_out, d_filter4, [1, 8, 8, 128], (1, 2, 2, 1))
dec4_concat = tf.concat([dec4, lstm3_out], axis=3)
d_filter3 = tensor_variable([2, 2, 64, 256], "d_filter3")
dec3 = cnn_decoder_layer(dec4_concat, d_filter3, [1, 15, 15, 64], (1, 2, 2, 1))
dec3_concat = tf.concat([dec3, lstm2_out], axis=3)
d_filter2 = tensor_variable([3, 3, 32, 128], "d_filter2")
dec2 = cnn_decoder_layer(dec3_concat, d_filter2, [1, 30, 30, 32], (1, 2, 2, 1))
dec2_concat = tf.concat([dec2, lstm1_out], axis=3)
d_filter1 = tensor_variable([3, 3, 3, 64], "d_filter1")
dec1 = cnn_decoder_layer(dec2_concat, d_filter1, [1, 30, 30, 3], (1, 1, 1, 1))
return dec1
def main():
# Read dataset from file
matrix_data_path = util.train_data_path + "train.npy"
matrix_gt_1 = np.load(matrix_data_path)
sess = tf.compat.v1.Session()
data_input = tf.compat.v1.placeholder(tf.float32, [util.step_max, 30, 30, 3])
# cnn encoder
conv1_out, conv2_out, conv3_out, conv4_out = cnn_encoder(data_input)
conv1_out = tf.reshape(conv1_out, [-1, 5, 30, 30, 32])
conv2_out = tf.reshape(conv2_out, [-1, 5, 15, 15, 64])
conv3_out = tf.reshape(conv3_out, [-1, 5, 8, 8, 128])
conv4_out = tf.reshape(conv4_out, [-1, 5, 4, 4, 256])
# lstm with attention
conv1_lstm_attention_out, atten_weight_1 = cnn_lstm_attention_layer(conv1_out, 1)
conv2_lstm_attention_out, atten_weight_2 = cnn_lstm_attention_layer(conv2_out, 2)
conv3_lstm_attention_out, atten_weight_3 = cnn_lstm_attention_layer(conv3_out, 3)
conv4_lstm_attention_out, atten_weight_4 = cnn_lstm_attention_layer(conv4_out, 4)
# cnn decoder
deconv_out = cnn_decoder(conv1_lstm_attention_out, conv2_lstm_attention_out, conv3_lstm_attention_out,
conv4_lstm_attention_out)
# loss function: reconstruction error of last step matrix
loss = tf.reduce_mean(input_tensor=tf.square(data_input[-1] - deconv_out))
optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=util.learning_rate).minimize(loss)
# variable initialization
init = tf.compat.v1.global_variables_initializer()
sess.run(init)
# training
for idx in range(util.train_start_id, util.train_end_id):
matrix_gt = matrix_gt_1[idx - util.train_start_id]
feed_dict = {data_input: np.asarray(matrix_gt)}
a, loss_value = sess.run([optimizer, loss], feed_dict)
print("mse of last train data: " + str(loss_value))
# test
# Read the data from test file.
matrix_data_path = util.test_data_path + "test.npy"
matrix_gt_1 = np.load(matrix_data_path)
result_all = []
for idx in range(util.test_start_id, util.test_end_id):
matrix_gt = matrix_gt_1[idx - util.test_start_id]
feed_dict = {data_input: np.asarray(matrix_gt)}
result, loss_value = sess.run([deconv_out, loss], feed_dict)
result_all.append(result)
print("mse of last test data: " + str(loss_value))
# Write the reconstructed matrix to the file
reconstructed_path = util.reconstructed_data_path
if not os.path.exists(reconstructed_path):
os.makedirs(reconstructed_path)
reconstructed_path = reconstructed_path + "test_reconstructed.npy"
result_all = np.asarray(result_all).reshape((-1, 30, 30, 3))
print(result_all.shape)
np.save(reconstructed_path, result_all)
if __name__ == '__main__':
main()
================================================
FILE: 02_Python/MSCRED/cnn_lstm/convlstm.ipynb
================================================
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"WARNING:tensorflow:\n",
"The TensorFlow contrib module will not be included in TensorFlow 2.0.\n",
"For more information, please see:\n",
" * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md\n",
" * https://github.com/tensorflow/addons\n",
" * https://github.com/tensorflow/io (for I/O related ops)\n",
"If you depend on functionality not listed there, please file an issue.\n",
"\n",
"WARNING:tensorflow:From :85: dynamic_rnn (from tensorflow.python.ops.rnn) is deprecated and will be removed in a future version.\n",
"Instructions for updating:\n",
"Please use `keras.layers.RNN(cell)`, which is equivalent to this API\n",
"WARNING:tensorflow:From c:\\programdata\\anaconda3\\envs\\tfdeeplearning\\lib\\site-packages\\tensorflow_core\\contrib\\rnn\\python\\ops\\rnn_cell.py:2244: calling Constant.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.\n",
"Instructions for updating:\n",
"Call initializer instance with the dtype argument instead of passing it to the constructor\n",
"mse of last train data: 0.00056191476\n",
"mse of last train data: 0.0008397814\n",
"mse of last train data: 0.0009788115\n",
"mse of last train data: 0.0015275143\n",
"mse of last train data: 0.0018960452\n",
"mse of last train data: 0.0015373339\n",
"mse of last train data: 0.0012186245\n",
"mse of last train data: 0.0009643246\n",
"mse of last train data: 0.00080712256\n",
"mse of last train data: 0.0006685078\n",
"mse of last train data: 0.00055669027\n",
"mse of last train data: 0.0004998121\n",
"mse of last train data: 0.00046998213\n",
"mse of last train data: 0.0004438546\n",
"mse of last train data: 0.00042290962\n",
"mse of last train data: 0.00040549517\n",
"mse of last train data: 0.00037338244\n",
"mse of last train data: 0.00034272377\n",
"mse of last train data: 0.0003186365\n",
"mse of last train data: 0.0002920385\n",
"mse of last train data: 0.00030394315\n",
"mse of last train data: 0.00040858088\n",
"mse of last train data: 0.000509995\n",
"mse of last train data: 0.00048521854\n",
"mse of last train data: 0.00054299145\n",
"mse of last train data: 0.00043364725\n",
"mse of last train data: 0.00037081417\n",
"mse of last train data: 0.00033152517\n",
"mse of last train data: 0.00030633438\n",
"mse of last train data: 0.00029974605\n",
"mse of last train data: 0.00028598175\n",
"mse of last train data: 0.00026241553\n",
"mse of last train data: 0.00023329386\n",
"mse of last train data: 0.0002067556\n",
"mse of last train data: 0.0001858864\n",
"mse of last train data: 0.00017865832\n",
"mse of last train data: 0.00017368651\n",
"mse of last train data: 0.00016670438\n",
"mse of last train data: 0.00016511032\n",
"mse of last train data: 0.00016638315\n",
"mse of last train data: 0.00017021292\n",
"mse of last train data: 0.00017659822\n",
"mse of last train data: 0.00016779697\n",
"mse of last train data: 0.00015695463\n",
"mse of last train data: 0.00015104574\n",
"mse of last train data: 0.00014608716\n",
"mse of last train data: 0.00014336465\n",
"mse of last train data: 0.00014475462\n",
"mse of last train data: 0.00014507821\n",
"mse of last train data: 0.0001450579\n",
"mse of last train data: 0.07205667\n",
"mse of last train data: 0.13893458\n",
"mse of last train data: 0.19796228\n",
"mse of last train data: 0.18094915\n",
"mse of last train data: 0.16069302\n",
"mse of last train data: 0.14240894\n",
"mse of last train data: 0.12506531\n",
"mse of last train data: 0.10823243\n",
"mse of last train data: 0.09251572\n",
"mse of last train data: 0.07781045\n",
"mse of last train data: 0.06467669\n",
"mse of last train data: 0.05363799\n",
"mse of last train data: 0.04450189\n",
"mse of last train data: 0.03728957\n",
"mse of last train data: 0.03174516\n",
"mse of last train data: 0.027739545\n",
"mse of last train data: 0.024777628\n",
"mse of last train data: 0.02266857\n",
"mse of last train data: 0.020791424\n",
"mse of last train data: 0.018834757\n",
"mse of last train data: 0.017007332\n",
"mse of last train data: 0.0152012\n",
"mse of last train data: 0.0136817675\n",
"mse of last train data: 0.012355283\n",
"mse of last train data: 0.011042081\n",
"mse of last train data: 0.009847156\n",
"mse of last train data: 0.008889004\n",
"mse of last train data: 0.008057881\n",
"mse of last train data: 0.0073360116\n",
"mse of last train data: 0.006629404\n",
"mse of last train data: 0.00603446\n",
"mse of last train data: 0.0055647404\n",
"mse of last train data: 0.005085784\n",
"mse of last train data: 0.004635579\n",
"mse of last train data: 0.0042376267\n",
"mse of last train data: 0.003809187\n",
"mse of last train data: 0.0034959386\n",
"mse of last train data: 0.003260653\n",
"mse of last train data: 0.0030721568\n",
"mse of last train data: 0.0029340317\n",
"mse of last train data: 0.0027605256\n",
"mse of last train data: 0.0026362352\n",
"mse of last train data: 0.0025475756\n",
"mse of last train data: 0.0024479274\n",
"mse of last train data: 0.0023544491\n",
"mse of last train data: 0.0022725554\n",
"mse of last train data: 0.0022665847\n",
"mse of last train data: 0.002288982\n",
"mse of last train data: 0.0023486267\n",
"mse of last train data: 0.0023323437\n",
"mse of last train data: 0.0022963672\n",
"mse of last train data: 0.002290437\n",
"mse of last train data: 0.0022051383\n",
"mse of last train data: 0.0022056552\n",
"mse of last train data: 0.0021482974\n",
"mse of last train data: 0.0022010433\n",
"mse of last train data: 0.0022223855\n",
"mse of last train data: 0.0021414428\n",
"mse of last train data: 0.0022304913\n",
"mse of last train data: 0.00230914\n",
"mse of last train data: 0.0022991085\n",
"mse of last train data: 0.0023407598\n",
"mse of last train data: 0.0024499984\n",
"mse of last train data: 0.0024665953\n",
"mse of last train data: 0.0026058878\n",
"mse of last train data: 0.002833584\n",
"mse of last train data: 0.0028792522\n",
"mse of last train data: 0.0030756914\n",
"mse of last train data: 0.0032068451\n",
"mse of last train data: 0.0033346848\n",
"mse of last train data: 0.0034521099\n",
"mse of last train data: 0.0035960434\n",
"mse of last train data: 0.0036712477\n",
"mse of last train data: 0.0037712127\n",
"mse of last train data: 0.0038479893\n",
"mse of last train data: 0.0038579563\n",
"mse of last train data: 0.0038726386\n",
"mse of last train data: 0.003964872\n",
"mse of last train data: 0.004026084\n",
"mse of last train data: 0.004028903\n",
"mse of last train data: 0.0039217984\n",
"mse of last train data: 0.0039538997\n",
"mse of last train data: 0.003897768\n",
"mse of last train data: 0.00384018\n",
"mse of last train data: 0.0037616906\n",
"mse of last train data: 0.0037353742\n",
"mse of last train data: 0.0037921062\n",
"mse of last train data: 0.0038140994\n",
"mse of last train data: 0.0039422265\n",
"mse of last train data: 0.004063493\n",
"mse of last train data: 0.0040876106\n",
"mse of last train data: 0.0041476134\n",
"mse of last train data: 0.004176664\n",
"mse of last train data: 0.004150423\n",
"mse of last train data: 0.0041735084\n",
"mse of last train data: 0.0041777953\n",
"mse of last train data: 0.0041922787\n",
"mse of last train data: 0.0041739466\n",
"mse of last train data: 0.0041439347\n",
"mse of last train data: 0.0040672407\n",
"mse of last train data: 0.0038785741\n",
"mse of last train data: 0.0038772987\n",
"mse of last train data: 0.0038318443\n",
"mse of last train data: 0.0037663344\n",
"mse of last train data: 0.003679201\n",
"mse of last train data: 0.0035277274\n",
"mse of last train data: 0.00346549\n",
"mse of last train data: 0.0034346743\n",
"mse of last train data: 0.0033462397\n",
"mse of last train data: 0.0032800194\n",
"mse of last train data: 0.0030959256\n",
"mse of last train data: 0.00294949\n",
"mse of last train data: 0.0027885023\n",
"mse of last train data: 0.002630386\n",
"mse of last train data: 0.0025397677\n",
"mse of last train data: 0.0024446982\n",
"mse of last train data: 0.0023684655\n",
"mse of last train data: 0.0023111373\n",
"mse of last train data: 0.0023532473\n",
"mse of last train data: 0.0023284957\n",
"mse of last train data: 0.0022286135\n",
"mse of last train data: 0.0021931112\n",
"mse of last train data: 0.0021555452\n",
"mse of last train data: 0.0020743778\n",
"mse of last train data: 0.0020993075\n",
"mse of last train data: 0.0022181568\n",
"mse of last train data: 0.0023018164\n",
"mse of last train data: 0.0022113312\n",
"mse of last train data: 0.0020134633\n",
"mse of last train data: 0.0019012\n",
"mse of last train data: 0.001853643\n",
"mse of last train data: 0.0018221489\n",
"mse of last train data: 0.0018716477\n",
"mse of last train data: 0.0018854032\n",
"mse of last train data: 0.001888388\n",
"mse of last train data: 0.0018411102\n",
"mse of last train data: 0.0018166936\n",
"mse of last train data: 0.0017583704\n",
"mse of last train data: 0.001752599\n",
"mse of last train data: 0.0016609089\n",
"mse of last train data: 0.0015661017\n",
"mse of last train data: 0.0015227802\n",
"mse of last train data: 0.0014839825\n",
"mse of last train data: 0.0014406227\n",
"mse of last train data: 0.0014063524\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"mse of last train data: 0.0013464914\n",
"mse of last train data: 0.0012574107\n",
"mse of last train data: 0.0011973963\n",
"mse of last train data: 0.0011483922\n",
"mse of last train data: 0.0010861779\n",
"mse of last train data: 0.0011279699\n",
"mse of last train data: 0.001181956\n",
"mse of last train data: 0.0011827709\n",
"mse of last train data: 0.0012015909\n",
"mse of last train data: 0.0012706444\n",
"mse of last train data: 0.0012969548\n",
"mse of last train data: 0.0013360518\n",
"mse of last train data: 0.0013549714\n",
"mse of last train data: 0.001344365\n",
"mse of last train data: 0.0013358138\n",
"mse of last train data: 0.0012971199\n",
"mse of last train data: 0.0012400298\n",
"mse of last train data: 0.0011351941\n",
"mse of last train data: 0.0011002468\n",
"mse of last train data: 0.0011178211\n",
"mse of last train data: 0.0011359766\n",
"mse of last train data: 0.001113067\n",
"mse of last train data: 0.0010521347\n",
"mse of last train data: 0.0010077746\n",
"mse of last train data: 0.0009265113\n",
"mse of last train data: 0.00095399655\n",
"mse of last train data: 0.0009676965\n",
"mse of last train data: 0.0009533392\n",
"mse of last train data: 0.0011021182\n",
"mse of last train data: 0.0011843981\n",
"mse of last train data: 0.0012056407\n",
"mse of last train data: 0.001262295\n",
"mse of last train data: 0.0012374771\n",
"mse of last train data: 0.0012458236\n",
"mse of last train data: 0.0012676963\n",
"mse of last train data: 0.0013123781\n",
"mse of last train data: 0.0014086295\n",
"mse of last train data: 0.0014814095\n",
"mse of last train data: 0.0015082511\n",
"mse of last train data: 0.0015982826\n",
"mse of last train data: 0.0016851957\n",
"mse of last train data: 0.0015878333\n",
"mse of last train data: 0.0015919523\n",
"mse of last train data: 0.0016622652\n",
"mse of last train data: 0.0015962254\n",
"mse of last train data: 0.0015314275\n",
"mse of last train data: 0.0015526952\n",
"mse of last train data: 0.0016658702\n",
"mse of last train data: 0.0018051107\n",
"mse of last train data: 0.0020628015\n",
"mse of last train data: 0.0025127074\n",
"mse of last train data: 0.0029573862\n",
"mse of last train data: 0.0031659596\n",
"mse of last train data: 0.0034723885\n",
"mse of last train data: 0.0037655572\n",
"mse of last train data: 0.0039095846\n",
"mse of last train data: 0.003840831\n",
"mse of last train data: 0.0040077097\n",
"mse of last train data: 0.0039965403\n",
"mse of last train data: 0.003927748\n",
"mse of last train data: 0.003750622\n",
"mse of last train data: 0.0036334356\n",
"mse of last train data: 0.003574275\n",
"mse of last train data: 0.0037313572\n",
"mse of last train data: 0.0037059211\n",
"mse of last train data: 0.0036447744\n",
"mse of last train data: 0.0035459776\n",
"mse of last train data: 0.0033301672\n",
"mse of last train data: 0.0031582052\n",
"mse of last train data: 0.0030207264\n",
"mse of last train data: 0.002874614\n",
"mse of last train data: 0.0027405953\n",
"mse of last train data: 0.0027124388\n",
"mse of last train data: 0.0026437847\n",
"mse of last train data: 0.0025770634\n",
"mse of last train data: 0.0025967045\n",
"mse of last train data: 0.0025350593\n",
"mse of last train data: 0.0024819104\n",
"mse of last train data: 0.0024936553\n",
"mse of last train data: 0.0024477043\n",
"mse of last train data: 0.002376865\n",
"mse of last train data: 0.0023258424\n",
"mse of last train data: 0.0022483987\n",
"mse of last train data: 0.0021567186\n",
"mse of last train data: 0.002107201\n",
"mse of last train data: 0.0020256473\n",
"mse of last train data: 0.00197632\n",
"mse of last train data: 0.0019731368\n",
"mse of last train data: 0.0019368684\n",
"mse of last train data: 0.0018914877\n",
"mse of last train data: 0.0018475738\n",
"mse of last train data: 0.0017605136\n",
"mse of last train data: 0.0016986358\n",
"mse of last train data: 0.001640756\n",
"mse of last train data: 0.0016501561\n",
"mse of last train data: 0.001645608\n",
"mse of last train data: 0.0016029997\n",
"mse of last train data: 0.0015904047\n",
"mse of last train data: 0.0016070447\n",
"mse of last train data: 0.0016007202\n",
"mse of last train data: 0.0015753297\n",
"mse of last train data: 0.0015429567\n",
"mse of last train data: 0.0015102365\n",
"mse of last train data: 0.0014876345\n",
"mse of last train data: 0.0014366853\n",
"mse of last train data: 0.0014381347\n",
"mse of last train data: 0.001439962\n",
"mse of last train data: 0.0014420307\n",
"mse of last train data: 0.0013792998\n",
"mse of last train data: 0.0013424249\n",
"mse of last train data: 0.001325422\n",
"mse of last train data: 0.0012873164\n",
"mse of last train data: 0.0012872552\n",
"mse of last train data: 0.0013417456\n",
"mse of last train data: 0.0013084626\n",
"mse of last train data: 0.0011857317\n",
"mse of last train data: 0.0011190426\n",
"mse of last train data: 0.0011062514\n",
"mse of last train data: 0.0010339685\n",
"mse of last train data: 0.0009947165\n",
"mse of last train data: 0.0010266803\n",
"mse of last train data: 0.0010349512\n",
"mse of last train data: 0.0010006244\n",
"mse of last train data: 0.0010220367\n",
"mse of last train data: 0.0010284391\n",
"mse of last train data: 0.0010194151\n",
"mse of last train data: 0.001005341\n",
"mse of last train data: 0.00097332476\n",
"mse of last train data: 0.00093010295\n",
"mse of last train data: 0.0010120556\n",
"mse of last train data: 0.0010774386\n",
"mse of last train data: 0.0011652409\n",
"mse of last train data: 0.0012128444\n",
"mse of last train data: 0.0012056258\n",
"mse of last train data: 0.0011465251\n",
"mse of last train data: 0.0011025794\n",
"mse of last train data: 0.0010495858\n",
"mse of last train data: 0.001023266\n",
"mse of last train data: 0.0010484938\n",
"mse of last train data: 0.0010513911\n",
"mse of last train data: 0.0011392012\n",
"mse of last train data: 0.001153798\n",
"mse of last train data: 0.0011481759\n",
"mse of last train data: 0.0011563408\n",
"mse of last train data: 0.0011308886\n",
"mse of last train data: 0.0011234374\n",
"mse of last train data: 0.0010046205\n",
"mse of last train data: 0.0009797511\n",
"mse of last train data: 0.0010366986\n",
"mse of last train data: 0.0010408676\n",
"mse of last train data: 0.001068525\n",
"mse of last train data: 0.0011224989\n",
"mse of last train data: 0.0011295491\n",
"mse of last train data: 0.0011397352\n",
"mse of last train data: 0.0011080813\n",
"mse of last train data: 0.0010421994\n",
"mse of last train data: 0.001017464\n",
"mse of last train data: 0.0010206533\n",
"mse of last train data: 0.0010339763\n",
"mse of last train data: 0.0010672729\n",
"mse of last train data: 0.0010636908\n",
"mse of last train data: 0.001066436\n",
"mse of last train data: 0.0011004284\n",
"mse of last train data: 0.001122066\n",
"mse of last train data: 0.0011451798\n",
"mse of last train data: 0.0011026084\n",
"mse of last train data: 0.0010945576\n",
"mse of last train data: 0.0010818676\n",
"mse of last train data: 0.0010538438\n",
"mse of last train data: 0.0010126596\n",
"mse of last train data: 0.0009978677\n",
"mse of last train data: 0.0010448605\n",
"mse of last train data: 0.001026903\n",
"mse of last train data: 0.0010198418\n",
"mse of last train data: 0.0010114628\n",
"mse of last train data: 0.00095845683\n",
"mse of last train data: 0.0009462939\n",
"mse of last train data: 0.00091534853\n",
"mse of last train data: 0.00093770504\n",
"mse of last train data: 0.00095898425\n",
"mse of last train data: 0.0009854428\n",
"mse of last train data: 0.0010664935\n",
"mse of last train data: 0.0011825607\n",
"mse of last train data: 0.0012450067\n",
"mse of last train data: 0.0013338435\n",
"mse of last train data: 0.001365015\n",
"mse of last train data: 0.0013943445\n",
"mse of last train data: 0.0014056767\n",
"mse of last train data: 0.0014466769\n",
"mse of last train data: 0.0014638149\n",
"mse of last train data: 0.0014998874\n",
"mse of last train data: 0.0015322582\n",
"mse of last train data: 0.0015588865\n",
"mse of last train data: 0.0015689052\n",
"mse of last train data: 0.0015233936\n",
"mse of last train data: 0.001539662\n",
"mse of last train data: 0.0015408073\n",
"mse of last train data: 0.0015340863\n",
"mse of last train data: 0.0015671833\n",
"mse of last train data: 0.0016000806\n",
"mse of last train data: 0.0016007663\n",
"mse of last train data: 0.0016410188\n",
"mse of last train data: 0.0016697388\n",
"mse of last train data: 0.00175197\n",
"mse of last train data: 0.0018563954\n",
"mse of last train data: 0.0018630403\n",
"mse of last train data: 0.0019535825\n",
"mse of last train data: 0.0020532196\n",
"mse of last train data: 0.0020106987\n",
"mse of last train data: 0.0019743433\n",
"mse of last train data: 0.002038095\n",
"mse of last train data: 0.0020216114\n",
"mse of last train data: 0.001970227\n",
"mse of last train data: 0.001974121\n",
"mse of last train data: 0.0019642294\n",
"mse of last train data: 0.0020083536\n",
"mse of last train data: 0.0020098195\n",
"mse of last train data: 0.0020158559\n",
"mse of last train data: 0.0020010343\n",
"mse of last train data: 0.0018690318\n",
"mse of last train data: 0.0017491846\n",
"mse of last train data: 0.0017250124\n",
"mse of last train data: 0.001702088\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"mse of last train data: 0.0016329982\n",
"mse of last train data: 0.0015298986\n",
"mse of last train data: 0.0015420592\n",
"mse of last train data: 0.001491368\n",
"mse of last train data: 0.0014125028\n",
"mse of last train data: 0.0013982751\n",
"mse of last train data: 0.0014319657\n",
"mse of last train data: 0.0014147809\n",
"mse of last train data: 0.0013569839\n",
"mse of last train data: 0.0012757038\n",
"mse of last train data: 0.0011809135\n",
"mse of last train data: 0.0011647923\n",
"mse of last train data: 0.001151103\n",
"mse of last train data: 0.001145226\n",
"mse of last train data: 0.0011862615\n",
"mse of last train data: 0.001189354\n",
"mse of last train data: 0.001171359\n",
"mse of last train data: 0.0011854062\n",
"mse of last train data: 0.0011679702\n",
"mse of last train data: 0.0011461786\n",
"mse of last train data: 0.0011005491\n",
"mse of last train data: 0.0010598543\n",
"mse of last train data: 0.0010017945\n",
"mse of last train data: 0.0009647608\n",
"mse of last train data: 0.0009159361\n",
"mse of last train data: 0.0008956352\n",
"mse of last train data: 0.00088806055\n",
"mse of last train data: 0.0008519254\n",
"mse of last train data: 0.0008260835\n",
"mse of last train data: 0.0008365163\n",
"mse of last train data: 0.0008214434\n",
"mse of last train data: 0.0008438503\n",
"mse of last train data: 0.0008232932\n",
"mse of last train data: 0.00079800043\n",
"mse of last train data: 0.0007680562\n",
"mse of last train data: 0.00074435334\n",
"mse of last train data: 0.00073817075\n",
"mse of last train data: 0.0007202183\n",
"mse of last train data: 0.0007133703\n",
"mse of last train data: 0.00071843615\n",
"mse of last train data: 0.000768639\n",
"mse of last train data: 0.0007931737\n",
"mse of last train data: 0.00075426634\n",
"mse of last train data: 0.000743786\n",
"mse of last train data: 0.0007255434\n",
"mse of last train data: 0.000679125\n",
"mse of last train data: 0.0006794581\n",
"mse of last train data: 0.00067914464\n",
"mse of last train data: 0.0006936631\n",
"mse of last train data: 0.00069016375\n",
"mse of last train data: 0.00071026816\n",
"mse of last train data: 0.0007423688\n",
"mse of last train data: 0.0007434516\n",
"mse of last train data: 0.000724178\n",
"mse of last train data: 0.0007543912\n",
"mse of last train data: 0.0007858621\n",
"mse of last train data: 0.00080036814\n",
"mse of last train data: 0.0008466258\n",
"mse of last train data: 0.0008750254\n",
"mse of last train data: 0.00086509157\n",
"mse of last train data: 0.00086944096\n",
"mse of last train data: 0.0008660486\n",
"mse of last train data: 0.00088088954\n",
"mse of last train data: 0.0008952701\n",
"mse of last train data: 0.00092487794\n",
"mse of last train data: 0.00091398106\n",
"mse of last train data: 0.00094530836\n",
"mse of last train data: 0.0009165718\n",
"mse of last train data: 0.000874996\n",
"mse of last train data: 0.0008461645\n",
"mse of last train data: 0.0008665467\n",
"mse of last train data: 0.0008962643\n",
"mse of last train data: 0.000867555\n",
"mse of last train data: 0.00085542275\n",
"mse of last train data: 0.00084130606\n",
"mse of last train data: 0.0008583149\n",
"mse of last train data: 0.0009010726\n",
"mse of last train data: 0.000943708\n",
"mse of last train data: 0.0009260789\n",
"mse of last train data: 0.0009556278\n",
"mse of last train data: 0.0009409341\n",
"mse of last train data: 0.00088871294\n",
"mse of last train data: 0.00085274776\n",
"mse of last train data: 0.0008155256\n",
"mse of last train data: 0.0007758231\n",
"mse of last train data: 0.0007605526\n",
"mse of last train data: 0.0007996544\n",
"mse of last train data: 0.0008727017\n",
"mse of last train data: 0.00087935326\n",
"mse of last train data: 0.0008888069\n",
"mse of last train data: 0.0009274797\n",
"mse of last train data: 0.0009084317\n",
"mse of last train data: 0.0009072056\n",
"mse of last train data: 0.00092767144\n",
"mse of last train data: 0.0009333326\n",
"mse of last train data: 0.000952322\n",
"mse of last train data: 0.00096932956\n",
"mse of last train data: 0.0009827061\n",
"mse of last train data: 0.0010207826\n",
"mse of last train data: 0.0010841498\n",
"mse of last train data: 0.0011546806\n",
"mse of last train data: 0.0012104256\n",
"mse of last train data: 0.0012216566\n",
"mse of last train data: 0.0012382811\n",
"mse of last train data: 0.001256439\n",
"mse of last train data: 0.001238168\n",
"mse of last train data: 0.0011961329\n",
"mse of last train data: 0.0012093284\n",
"mse of last train data: 0.0012249821\n",
"mse of last train data: 0.0012608183\n",
"mse of last train data: 0.0012794193\n",
"mse of last train data: 0.0012739777\n",
"mse of last train data: 0.0013050393\n",
"mse of last train data: 0.0012952167\n",
"mse of last train data: 0.0012893219\n",
"mse of last train data: 0.0013364957\n",
"mse of last train data: 0.0013219004\n",
"mse of last train data: 0.0013564738\n",
"mse of last train data: 0.0013818522\n",
"mse of last train data: 0.001437685\n",
"mse of last train data: 0.0014729805\n",
"mse of last train data: 0.0015169979\n",
"mse of last train data: 0.0015033745\n",
"mse of last train data: 0.0014634663\n",
"mse of last train data: 0.0015589262\n",
"mse of last train data: 0.0015290685\n",
"mse of last train data: 0.0015401517\n",
"mse of last train data: 0.0015024173\n",
"mse of last train data: 0.0015139772\n",
"mse of last train data: 0.0014650718\n",
"mse of last train data: 0.0014674219\n",
"mse of last train data: 0.0014168425\n",
"mse of last train data: 0.0013707344\n",
"mse of last train data: 0.0013549054\n",
"mse of last train data: 0.0013009903\n",
"mse of last train data: 0.0012954032\n",
"mse of last train data: 0.0013331287\n",
"mse of last train data: 0.0012916501\n",
"mse of last train data: 0.0012935335\n",
"mse of last train data: 0.0012434056\n",
"mse of last train data: 0.0012132756\n",
"mse of last train data: 0.0011929887\n",
"mse of last train data: 0.0011641278\n",
"mse of last train data: 0.0011291781\n",
"mse of last train data: 0.001105667\n",
"mse of last train data: 0.001068929\n",
"mse of last train data: 0.0010534077\n",
"mse of last train data: 0.0010043996\n",
"mse of last train data: 0.0010471272\n",
"mse of last train data: 0.0010445536\n",
"mse of last train data: 0.0010292436\n",
"mse of last train data: 0.0009952802\n",
"mse of last train data: 0.0009422138\n",
"mse of last train data: 0.00095950224\n",
"mse of last train data: 0.00096409523\n",
"mse of last train data: 0.0009150089\n",
"mse of last train data: 0.00091790827\n",
"mse of last train data: 0.00093758426\n",
"mse of last train data: 0.0008784499\n",
"mse of last train data: 0.0008645862\n",
"mse of last train data: 0.00087230065\n",
"mse of last train data: 0.00084728515\n",
"mse of last train data: 0.0007924842\n",
"mse of last train data: 0.0007767578\n",
"mse of last train data: 0.0007844462\n",
"mse of last train data: 0.0008004956\n",
"mse of last train data: 0.0007891942\n",
"mse of last train data: 0.0007798631\n",
"mse of last train data: 0.0007435473\n",
"mse of last train data: 0.0007671225\n",
"mse of last train data: 0.00077114406\n",
"mse of last train data: 0.0007509592\n",
"mse of last train data: 0.0007833343\n",
"mse of last train data: 0.0007639879\n",
"mse of last train data: 0.0007625261\n",
"mse of last train data: 0.0007714412\n",
"mse of last train data: 0.00075920875\n",
"mse of last train data: 0.0007519961\n",
"mse of last train data: 0.0007488591\n",
"mse of last train data: 0.000782313\n",
"mse of last train data: 0.0007965821\n",
"mse of last train data: 0.00081012276\n",
"mse of last train data: 0.0008296337\n",
"mse of last train data: 0.00075105747\n",
"mse of last train data: 0.0007071131\n",
"mse of last train data: 0.0007179317\n",
"mse of last train data: 0.00071533705\n",
"mse of last train data: 0.0006914794\n",
"mse of last train data: 0.00066226\n",
"mse of last train data: 0.0007012957\n",
"mse of last train data: 0.0006899659\n",
"mse of last train data: 0.0006702315\n",
"mse of last train data: 0.0006717992\n",
"mse of last train data: 0.0006725623\n",
"mse of last train data: 0.0007080733\n",
"mse of last train data: 0.000677911\n",
"mse of last train data: 0.0006701805\n",
"mse of last train data: 0.0006941974\n",
"mse of last train data: 0.0006673816\n",
"mse of last train data: 0.0006817229\n",
"mse of last train data: 0.0007079854\n",
"mse of last train data: 0.0007285663\n",
"mse of last train data: 0.00076610706\n",
"mse of last train data: 0.000765858\n",
"mse of last train data: 0.0007985458\n",
"mse of last train data: 0.0007853478\n",
"mse of last train data: 0.00078308955\n",
"mse of last train data: 0.0007895325\n",
"mse of last train data: 0.0007736814\n",
"mse of last train data: 0.0007822404\n",
"mse of last train data: 0.0007990075\n",
"mse of last train data: 0.0007671225\n",
"mse of last train data: 0.0007572188\n",
"mse of last train data: 0.0007455763\n",
"mse of last train data: 0.0007594815\n",
"mse of last train data: 0.00077661604\n",
"mse of last train data: 0.0007761848\n",
"mse of last train data: 0.0007980282\n",
"mse of last train data: 0.00084878586\n",
"mse of last train data: 0.00095800543\n",
"mse of last train data: 0.0009898231\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"mse of last train data: 0.0009541947\n",
"mse of last train data: 0.0010108207\n",
"mse of last train data: 0.0010364436\n",
"mse of last train data: 0.0009894947\n",
"mse of last train data: 0.00097643986\n",
"mse of last train data: 0.000925609\n",
"mse of last train data: 0.0009026852\n",
"mse of last train data: 0.00093772635\n",
"mse of last train data: 0.0009970642\n",
"mse of last train data: 0.0010504007\n",
"mse of last train data: 0.0011059847\n",
"mse of last train data: 0.0011673279\n",
"mse of last train data: 0.0011629892\n",
"mse of last train data: 0.0011685679\n",
"mse of last train data: 0.0012121707\n",
"mse of last train data: 0.0011760428\n",
"mse of last train data: 0.0011301434\n",
"mse of last train data: 0.0011292599\n",
"mse of last train data: 0.0012091325\n",
"mse of last train data: 0.0012273844\n",
"mse of last train data: 0.0012395179\n",
"mse of last train data: 0.0012739047\n",
"mse of last train data: 0.0013571507\n",
"mse of last train data: 0.0013433759\n",
"mse of last train data: 0.0013559854\n",
"mse of last train data: 0.0013994459\n",
"mse of last train data: 0.0014797584\n",
"mse of last train data: 0.0015326106\n",
"mse of last train data: 0.0015211492\n",
"mse of last train data: 0.0015538143\n",
"mse of last train data: 0.0016037362\n",
"mse of last train data: 0.0015823002\n",
"mse of last train data: 0.0015571585\n",
"mse of last train data: 0.001545502\n",
"mse of last train data: 0.0015368324\n",
"mse of last train data: 0.0014802022\n",
"mse of last train data: 0.0014094602\n",
"mse of last train data: 0.0013853377\n",
"mse of last train data: 0.0012809603\n",
"mse of last train data: 0.0012235981\n",
"mse of last train data: 0.0012257422\n",
"mse of last train data: 0.0012544547\n",
"mse of last train data: 0.0012399516\n",
"mse of last train data: 0.0012709155\n",
"mse of last train data: 0.0012713958\n",
"mse of last train data: 0.0012468753\n",
"mse of last train data: 0.0012133922\n",
"mse of last train data: 0.0011484857\n",
"mse of last train data: 0.001122947\n",
"mse of last train data: 0.0011318541\n",
"mse of last train data: 0.0010868455\n",
"mse of last train data: 0.0010498461\n",
"mse of last train data: 0.001072044\n",
"mse of last train data: 0.0010659883\n",
"mse of last train data: 0.0010233234\n",
"mse of last train data: 0.0009665305\n",
"mse of last train data: 0.00093571533\n",
"mse of last train data: 0.0009545754\n",
"mse of last train data: 0.000932956\n",
"mse of last train data: 0.00092874095\n",
"mse of last train data: 0.00093626074\n",
"mse of last train data: 0.0009557613\n",
"mse of last train data: 0.0009824438\n",
"mse of last train data: 0.0009876572\n",
"mse of last train data: 0.0009950006\n",
"mse of last train data: 0.0009688083\n",
"mse of last train data: 0.00096217537\n",
"mse of last train data: 0.0009313186\n",
"mse of last train data: 0.000918295\n",
"mse of last train data: 0.0009082833\n",
"mse of last train data: 0.0008865691\n",
"mse of last train data: 0.00086521485\n",
"mse of last train data: 0.0008536012\n",
"mse of last train data: 0.0008478385\n",
"mse of last train data: 0.0008322337\n",
"mse of last train data: 0.0008125947\n",
"mse of last train data: 0.0008112473\n",
"mse of last train data: 0.0007705171\n",
"mse of last train data: 0.0007348005\n",
"mse of last train data: 0.0007527921\n",
"mse of last train data: 0.0007673946\n",
"mse of last train data: 0.00075016933\n",
"mse of last train data: 0.00074245286\n",
"mse of last train data: 0.0007343074\n",
"mse of last train data: 0.00077942637\n",
"mse of last train data: 0.00078259496\n",
"mse of last train data: 0.00079123955\n",
"mse of last train data: 0.00080244197\n",
"mse of last train data: 0.0007918219\n",
"mse of last train data: 0.0007765784\n",
"mse of last train data: 0.0007558805\n",
"mse of last train data: 0.00078713265\n",
"mse of last train data: 0.0008180782\n",
"mse of last train data: 0.00081295223\n",
"mse of last train data: 0.0007907967\n",
"mse of last train data: 0.0007853339\n",
"mse of last train data: 0.00078770664\n",
"mse of last train data: 0.00077738496\n",
"mse of last train data: 0.00073202804\n",
"mse of last train data: 0.0007404461\n",
"mse of last train data: 0.0007666396\n",
"mse of last train data: 0.00081070245\n",
"mse of last train data: 0.0008375156\n",
"mse of last train data: 0.00087021873\n",
"mse of last train data: 0.0008757806\n",
"mse of last train data: 0.00089811\n",
"mse of last train data: 0.0008853341\n",
"mse of last train data: 0.00087567733\n",
"mse of last train data: 0.00089108734\n",
"mse of last train data: 0.0008722552\n",
"mse of last train data: 0.0008424445\n",
"mse of last train data: 0.0008453589\n",
"mse of last train data: 0.00085609156\n",
"mse of last train data: 0.0008375242\n",
"mse of last train data: 0.0007777993\n",
"mse of last train data: 0.0007801824\n",
"mse of last train data: 0.0007780854\n",
"mse of last train data: 0.00074772915\n",
"mse of last train data: 0.0008021815\n",
"mse of last train data: 0.000852052\n",
"mse of last train data: 0.0008834996\n",
"mse of last train data: 0.00088296935\n",
"mse of last train data: 0.0009120857\n",
"mse of last train data: 0.0009316169\n",
"mse of last train data: 0.00089627743\n",
"mse of last train data: 0.00087186054\n",
"mse of last train data: 0.0008672923\n",
"mse of last train data: 0.0008451662\n",
"mse of last train data: 0.0008207845\n",
"mse of last train data: 0.0007788843\n",
"mse of last train data: 0.00076644396\n",
"mse of last train data: 0.00078863965\n",
"mse of last train data: 0.0008183467\n",
"mse of last train data: 0.0008206188\n",
"mse of last train data: 0.0008191548\n",
"mse of last train data: 0.0008181697\n",
"mse of last train data: 0.0008295404\n",
"mse of last train data: 0.0008369502\n",
"mse of last train data: 0.00087504473\n",
"mse of last train data: 0.00094807264\n",
"mse of last train data: 0.00095168565\n",
"mse of last train data: 0.00093786785\n",
"mse of last train data: 0.0009494926\n",
"mse of last train data: 0.00095221156\n",
"mse of last train data: 0.00096416246\n",
"mse of last train data: 0.0010382076\n",
"mse of last train data: 0.0010461614\n",
"mse of last train data: 0.0010444447\n",
"mse of last train data: 0.0010638619\n",
"mse of last train data: 0.0010496473\n",
"mse of last train data: 0.0010483713\n",
"mse of last test data: 0.0010384414\n",
"mse of last test data: 0.001307694\n",
"mse of last test data: 0.0017374953\n",
"mse of last test data: 0.0023031589\n",
"mse of last test data: 0.0029748592\n",
"mse of last test data: 0.0037031618\n",
"mse of last test data: 0.0045573018\n",
"mse of last test data: 0.0055009406\n",
"mse of last test data: 0.006388207\n",
"mse of last test data: 0.007588866\n",
"mse of last test data: 0.00892342\n",
"mse of last test data: 0.009982019\n",
"mse of last test data: 0.011053708\n",
"mse of last test data: 0.012057285\n",
"mse of last test data: 0.013137471\n",
"mse of last test data: 0.014322686\n",
"mse of last test data: 0.015435629\n",
"mse of last test data: 0.0164074\n",
"mse of last test data: 0.017558564\n",
"mse of last test data: 0.018451324\n",
"mse of last test data: 0.019547584\n",
"mse of last test data: 0.020846648\n",
"mse of last test data: 0.022295011\n",
"mse of last test data: 0.023751698\n",
"mse of last test data: 0.025166908\n",
"mse of last test data: 0.026294477\n",
"mse of last test data: 0.027411463\n",
"mse of last test data: 0.028650785\n",
"mse of last test data: 0.029543892\n",
"mse of last test data: 0.03069337\n",
"mse of last test data: 0.031689584\n",
"mse of last test data: 0.032348324\n",
"mse of last test data: 0.032735217\n",
"mse of last test data: 0.032774836\n",
"mse of last test data: 0.033247374\n",
"mse of last test data: 0.033966284\n",
"mse of last test data: 0.034178574\n",
"mse of last test data: 0.034851965\n",
"mse of last test data: 0.03574161\n",
"mse of last test data: 0.03627641\n",
"mse of last test data: 0.037307043\n",
"mse of last test data: 0.03826935\n",
"mse of last test data: 0.039126046\n",
"mse of last test data: 0.040106446\n",
"mse of last test data: 0.040581167\n",
"mse of last test data: 0.040892914\n",
"mse of last test data: 0.041396786\n",
"mse of last test data: 0.04206962\n",
"mse of last test data: 0.042384546\n",
"mse of last test data: 0.04255963\n",
"mse of last test data: 0.042533204\n",
"mse of last test data: 0.042531297\n",
"mse of last test data: 0.04243757\n",
"mse of last test data: 0.042328015\n",
"mse of last test data: 0.04236642\n",
"mse of last test data: 0.042201947\n",
"mse of last test data: 0.042245027\n",
"mse of last test data: 0.04205504\n",
"mse of last test data: 0.041910607\n",
"mse of last test data: 0.041927192\n",
"mse of last test data: 0.0419992\n",
"mse of last test data: 0.042246398\n",
"mse of last test data: 0.042536404\n",
"mse of last test data: 0.042835034\n",
"mse of last test data: 0.042819537\n",
"mse of last test data: 0.04295462\n",
"mse of last test data: 0.043051228\n",
"mse of last test data: 0.043088567\n",
"mse of last test data: 0.043004733\n",
"mse of last test data: 0.042714253\n",
"mse of last test data: 0.042343702\n",
"mse of last test data: 0.04196994\n",
"mse of last test data: 0.041456442\n",
"mse of last test data: 0.041171037\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"mse of last test data: 0.04082334\n",
"mse of last test data: 0.040083185\n",
"mse of last test data: 0.03985819\n",
"mse of last test data: 0.039754167\n",
"mse of last test data: 0.039474037\n",
"mse of last test data: 0.039507117\n",
"mse of last test data: 0.039683733\n",
"mse of last test data: 0.039667007\n",
"mse of last test data: 0.03954234\n",
"mse of last test data: 0.03914306\n",
"mse of last test data: 0.0385736\n",
"mse of last test data: 0.038148172\n",
"mse of last test data: 0.037649598\n",
"mse of last test data: 0.037061617\n",
"mse of last test data: 0.036700785\n",
"mse of last test data: 0.036190856\n",
"mse of last test data: 0.035422195\n",
"mse of last test data: 0.034796197\n",
"mse of last test data: 0.034407858\n",
"mse of last test data: 0.034019623\n",
"mse of last test data: 0.033275053\n",
"mse of last test data: 0.03250243\n",
"mse of last test data: 0.031793736\n",
"mse of last test data: 0.03122516\n",
"mse of last test data: 0.030735435\n",
"mse of last test data: 0.030259106\n",
"mse of last test data: 0.030017732\n",
"mse of last test data: 0.02974167\n",
"mse of last test data: 0.02909848\n",
"mse of last test data: 0.02833938\n",
"mse of last test data: 0.02780824\n",
"mse of last test data: 0.027193166\n",
"mse of last test data: 0.026475754\n",
"mse of last test data: 0.025667634\n",
"mse of last test data: 0.024950879\n",
"mse of last test data: 0.024222\n",
"mse of last test data: 0.023429502\n",
"mse of last test data: 0.02254987\n",
"mse of last test data: 0.02196828\n",
"mse of last test data: 0.021193521\n",
"mse of last test data: 0.02028674\n",
"mse of last test data: 0.019646509\n",
"mse of last test data: 0.018891536\n",
"mse of last test data: 0.018168326\n",
"mse of last test data: 0.0175475\n",
"mse of last test data: 0.016908957\n",
"mse of last test data: 0.01619197\n",
"mse of last test data: 0.01544866\n",
"mse of last test data: 0.014649941\n",
"mse of last test data: 0.013815872\n",
"mse of last test data: 0.012977094\n",
"mse of last test data: 0.012175543\n",
"mse of last test data: 0.011358927\n",
"mse of last test data: 0.010680771\n",
"mse of last test data: 0.009901247\n",
"mse of last test data: 0.009313815\n",
"mse of last test data: 0.008677138\n",
"mse of last test data: 0.008175264\n",
"mse of last test data: 0.007842597\n",
"mse of last test data: 0.007610578\n",
"mse of last test data: 0.007446367\n",
"mse of last test data: 0.007328755\n",
"mse of last test data: 0.0072706873\n",
"mse of last test data: 0.0072315196\n",
"mse of last test data: 0.0072507737\n",
"mse of last test data: 0.0074456963\n",
"mse of last test data: 0.0076559093\n",
"mse of last test data: 0.007952152\n",
"mse of last test data: 0.008333183\n",
"mse of last test data: 0.008844702\n",
"mse of last test data: 0.009205255\n",
"mse of last test data: 0.009758698\n",
"mse of last test data: 0.010508039\n",
"mse of last test data: 0.011222202\n",
"mse of last test data: 0.012041376\n",
"mse of last test data: 0.013106552\n",
"mse of last test data: 0.014052004\n",
"mse of last test data: 0.014951649\n",
"mse of last test data: 0.01584717\n",
"mse of last test data: 0.016637348\n",
"mse of last test data: 0.017568303\n",
"mse of last test data: 0.01823545\n",
"mse of last test data: 0.018862344\n",
"mse of last test data: 0.01954903\n",
"mse of last test data: 0.020380951\n",
"mse of last test data: 0.021499444\n",
"mse of last test data: 0.022486042\n",
"mse of last test data: 0.023462072\n",
"mse of last test data: 0.024444459\n",
"mse of last test data: 0.025658702\n",
"mse of last test data: 0.026623877\n",
"mse of last test data: 0.027497932\n",
"mse of last test data: 0.028352885\n",
"mse of last test data: 0.029477308\n",
"mse of last test data: 0.030210283\n",
"mse of last test data: 0.03099371\n",
"mse of last test data: 0.031869322\n",
"mse of last test data: 0.032669522\n",
"mse of last test data: 0.03350015\n",
"mse of last test data: 0.034063555\n",
"mse of last test data: 0.034736462\n",
"mse of last test data: 0.035724353\n",
"mse of last test data: 0.036485925\n",
"mse of last test data: 0.036842436\n",
"mse of last test data: 0.037415814\n",
"mse of last test data: 0.037718218\n",
"mse of last test data: 0.03796529\n",
"mse of last test data: 0.038130216\n",
"mse of last test data: 0.038551964\n",
"mse of last test data: 0.038782805\n",
"mse of last test data: 0.038809787\n",
"mse of last test data: 0.0388401\n",
"mse of last test data: 0.038793024\n",
"mse of last test data: 0.03895594\n",
"mse of last test data: 0.03914743\n",
"mse of last test data: 0.039296836\n",
"mse of last test data: 0.039728686\n",
"mse of last test data: 0.040101677\n",
"mse of last test data: 0.040367268\n",
"mse of last test data: 0.040627647\n",
"mse of last test data: 0.040936448\n",
"mse of last test data: 0.041172534\n",
"mse of last test data: 0.041425318\n",
"mse of last test data: 0.04147524\n",
"mse of last test data: 0.04157543\n",
"mse of last test data: 0.041296557\n",
"mse of last test data: 0.041335024\n",
"mse of last test data: 0.041136358\n",
"mse of last test data: 0.040835697\n",
"mse of last test data: 0.04065752\n",
"mse of last test data: 0.04041579\n",
"mse of last test data: 0.040381014\n",
"mse of last test data: 0.04044666\n",
"mse of last test data: 0.04036908\n",
"mse of last test data: 0.040147748\n",
"mse of last test data: 0.04003042\n",
"mse of last test data: 0.03965651\n",
"mse of last test data: 0.03932365\n",
"mse of last test data: 0.03912295\n",
"mse of last test data: 0.038741607\n",
"mse of last test data: 0.038381852\n",
"mse of last test data: 0.038367312\n",
"mse of last test data: 0.03811866\n",
"mse of last test data: 0.037675697\n",
"mse of last test data: 0.037530858\n",
"mse of last test data: 0.03723132\n",
"mse of last test data: 0.03688892\n",
"mse of last test data: 0.03685664\n",
"mse of last test data: 0.03657884\n",
"mse of last test data: 0.03635766\n",
"mse of last test data: 0.03633707\n",
"mse of last test data: 0.036062397\n",
"mse of last test data: 0.035945144\n",
"mse of last test data: 0.035621196\n",
"mse of last test data: 0.03516288\n",
"mse of last test data: 0.03473452\n",
"mse of last test data: 0.03427851\n",
"mse of last test data: 0.0338027\n",
"mse of last test data: 0.03323697\n",
"mse of last test data: 0.032772798\n",
"mse of last test data: 0.032562565\n",
"mse of last test data: 0.032350477\n",
"mse of last test data: 0.032089394\n",
"mse of last test data: 0.031830788\n",
"mse of last test data: 0.031764828\n",
"mse of last test data: 0.03166443\n",
"mse of last test data: 0.03170151\n",
"mse of last test data: 0.031261694\n",
"mse of last test data: 0.030939216\n",
"mse of last test data: 0.03081177\n",
"mse of last test data: 0.030562615\n",
"mse of last test data: 0.030256944\n",
"mse of last test data: 0.030192852\n",
"mse of last test data: 0.029942954\n",
"mse of last test data: 0.029430553\n",
"mse of last test data: 0.028814787\n",
"mse of last test data: 0.028157063\n",
"mse of last test data: 0.027540611\n",
"mse of last test data: 0.027061442\n",
"mse of last test data: 0.026554784\n",
"mse of last test data: 0.026266748\n",
"mse of last test data: 0.025907198\n",
"mse of last test data: 0.025414491\n",
"mse of last test data: 0.024933107\n",
"mse of last test data: 0.024703918\n",
"mse of last test data: 0.0248048\n",
"mse of last test data: 0.024647307\n",
"mse of last test data: 0.024336813\n",
"mse of last test data: 0.023993976\n",
"mse of last test data: 0.023803623\n",
"mse of last test data: 0.023561517\n",
"mse of last test data: 0.023275027\n",
"mse of last test data: 0.022709692\n",
"mse of last test data: 0.022081068\n",
"mse of last test data: 0.021661425\n",
"mse of last test data: 0.021428918\n",
"mse of last test data: 0.021290788\n",
"mse of last test data: 0.021268034\n",
"mse of last test data: 0.021303197\n",
"mse of last test data: 0.021500012\n",
"mse of last test data: 0.021755792\n",
"mse of last test data: 0.021958767\n",
"mse of last test data: 0.022109263\n",
"mse of last test data: 0.022315828\n",
"mse of last test data: 0.022623992\n",
"mse of last test data: 0.022780182\n",
"mse of last test data: 0.023006381\n",
"mse of last test data: 0.023298213\n",
"mse of last test data: 0.023594327\n",
"mse of last test data: 0.023626985\n",
"mse of last test data: 0.023717942\n",
"mse of last test data: 0.024134878\n",
"mse of last test data: 0.024442924\n",
"mse of last test data: 0.024846632\n",
"mse of last test data: 0.025394179\n",
"mse of last test data: 0.026140306\n",
"mse of last test data: 0.026889877\n",
"mse of last test data: 0.027327998\n",
"mse of last test data: 0.027573977\n",
"mse of last test data: 0.02802628\n",
"mse of last test data: 0.028345205\n",
"mse of last test data: 0.02849541\n",
"mse of last test data: 0.028633604\n",
"mse of last test data: 0.029166307\n",
"mse of last test data: 0.029777998\n",
"mse of last test data: 0.030415766\n",
"mse of last test data: 0.030932292\n",
"mse of last test data: 0.03141561\n",
"mse of last test data: 0.031903934\n",
"mse of last test data: 0.032281023\n",
"mse of last test data: 0.0326458\n",
"mse of last test data: 0.033046126\n",
"mse of last test data: 0.03333811\n",
"mse of last test data: 0.033477485\n",
"mse of last test data: 0.033775162\n",
"mse of last test data: 0.034282345\n",
"mse of last test data: 0.03464786\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"mse of last test data: 0.035031658\n",
"mse of last test data: 0.035490207\n",
"mse of last test data: 0.03572595\n",
"mse of last test data: 0.03601049\n",
"mse of last test data: 0.03597831\n",
"mse of last test data: 0.036039367\n",
"mse of last test data: 0.03608627\n",
"mse of last test data: 0.03606685\n",
"mse of last test data: 0.03624761\n",
"mse of last test data: 0.036428586\n",
"mse of last test data: 0.03631103\n",
"mse of last test data: 0.036340993\n",
"mse of last test data: 0.036536086\n",
"mse of last test data: 0.036383446\n",
"mse of last test data: 0.03621247\n",
"mse of last test data: 0.03625416\n",
"mse of last test data: 0.036143474\n",
"mse of last test data: 0.036067598\n",
"mse of last test data: 0.036154605\n",
"mse of last test data: 0.03604631\n",
"mse of last test data: 0.0359825\n",
"mse of last test data: 0.036142346\n",
"mse of last test data: 0.036077425\n",
"mse of last test data: 0.03606107\n",
"mse of last test data: 0.036258876\n",
"mse of last test data: 0.03632675\n",
"mse of last test data: 0.036120854\n",
"mse of last test data: 0.036069844\n",
"mse of last test data: 0.036016762\n",
"mse of last test data: 0.03600339\n",
"mse of last test data: 0.036333516\n",
"mse of last test data: 0.036598675\n",
"mse of last test data: 0.036708616\n",
"mse of last test data: 0.03702915\n",
"mse of last test data: 0.03743927\n",
"mse of last test data: 0.037524562\n",
"mse of last test data: 0.037685137\n",
"mse of last test data: 0.037835393\n",
"mse of last test data: 0.037793335\n",
"mse of last test data: 0.03783053\n",
"mse of last test data: 0.03790146\n",
"mse of last test data: 0.03799495\n",
"mse of last test data: 0.038179226\n",
"mse of last test data: 0.03811621\n",
"mse of last test data: 0.037942342\n",
"mse of last test data: 0.03772454\n",
"mse of last test data: 0.037465274\n",
"mse of last test data: 0.03732606\n",
"mse of last test data: 0.037236284\n",
"mse of last test data: 0.037277386\n",
"mse of last test data: 0.037350263\n",
"mse of last test data: 0.037502833\n",
"mse of last test data: 0.037746042\n",
"mse of last test data: 0.038084935\n",
"mse of last test data: 0.038162284\n",
"mse of last test data: 0.037942823\n",
"mse of last test data: 0.037823606\n",
"mse of last test data: 0.037551586\n",
"mse of last test data: 0.037443716\n",
"mse of last test data: 0.037281357\n",
"mse of last test data: 0.037416983\n",
"mse of last test data: 0.037451915\n",
"mse of last test data: 0.037382595\n",
"mse of last test data: 0.037274934\n",
"mse of last test data: 0.037476376\n",
"mse of last test data: 0.03734141\n",
"mse of last test data: 0.037266914\n",
"mse of last test data: 0.037171412\n",
"mse of last test data: 0.037094492\n",
"mse of last test data: 0.036912702\n",
"mse of last test data: 0.036717176\n",
"mse of last test data: 0.03696139\n",
"mse of last test data: 0.037003577\n",
"mse of last test data: 0.037010066\n",
"mse of last test data: 0.037026666\n",
"mse of last test data: 0.037105616\n",
"mse of last test data: 0.037414543\n",
"mse of last test data: 0.037588768\n",
"mse of last test data: 0.037979055\n",
"mse of last test data: 0.03834311\n",
"mse of last test data: 0.03848743\n",
"mse of last test data: 0.038371816\n",
"mse of last test data: 0.038517695\n",
"mse of last test data: 0.03890951\n",
"mse of last test data: 0.039032325\n",
"mse of last test data: 0.038940143\n",
"mse of last test data: 0.039055612\n",
"mse of last test data: 0.03948929\n",
"mse of last test data: 0.039855823\n",
"mse of last test data: 0.039860543\n",
"mse of last test data: 0.039730966\n",
"mse of last test data: 0.039699364\n",
"mse of last test data: 0.039754596\n",
"mse of last test data: 0.039835285\n",
"mse of last test data: 0.039802346\n",
"mse of last test data: 0.03984447\n",
"mse of last test data: 0.0399325\n",
"mse of last test data: 0.04027743\n",
"mse of last test data: 0.04030818\n",
"mse of last test data: 0.040431373\n",
"mse of last test data: 0.04068201\n",
"mse of last test data: 0.041012682\n",
"mse of last test data: 0.04120658\n",
"mse of last test data: 0.041185886\n",
"mse of last test data: 0.041001167\n",
"mse of last test data: 0.041156203\n",
"mse of last test data: 0.041229323\n",
"mse of last test data: 0.04103733\n",
"mse of last test data: 0.04084468\n",
"mse of last test data: 0.040916957\n",
"mse of last test data: 0.041137584\n",
"mse of last test data: 0.04123667\n",
"mse of last test data: 0.04103982\n",
"mse of last test data: 0.040686384\n",
"mse of last test data: 0.04060656\n",
"mse of last test data: 0.04076821\n",
"mse of last test data: 0.04075272\n",
"mse of last test data: 0.040907077\n",
"mse of last test data: 0.040763214\n",
"mse of last test data: 0.04057824\n",
"mse of last test data: 0.040400766\n",
"mse of last test data: 0.04029853\n",
"mse of last test data: 0.04030188\n",
"mse of last test data: 0.04051611\n",
"mse of last test data: 0.040467434\n",
"mse of last test data: 0.04032812\n",
"mse of last test data: 0.040335715\n",
"mse of last test data: 0.0405933\n",
"mse of last test data: 0.040547967\n",
"mse of last test data: 0.04082879\n",
"mse of last test data: 0.04097587\n",
"mse of last test data: 0.040699992\n",
"mse of last test data: 0.040394023\n",
"mse of last test data: 0.040129915\n",
"mse of last test data: 0.039803337\n",
"mse of last test data: 0.039406665\n",
"mse of last test data: 0.039154865\n",
"mse of last test data: 0.03869359\n",
"mse of last test data: 0.0383316\n",
"mse of last test data: 0.0379935\n",
"mse of last test data: 0.03787038\n",
"mse of last test data: 0.037636872\n",
"mse of last test data: 0.037317097\n",
"mse of last test data: 0.037037548\n",
"mse of last test data: 0.03698923\n",
"mse of last test data: 0.037039768\n",
"mse of last test data: 0.036923762\n",
"mse of last test data: 0.03671856\n",
"mse of last test data: 0.03651316\n",
"mse of last test data: 0.036244605\n",
"mse of last test data: 0.036072135\n",
"mse of last test data: 0.035909202\n",
"mse of last test data: 0.035528228\n",
"mse of last test data: 0.03558189\n",
"mse of last test data: 0.035503305\n",
"mse of last test data: 0.035497822\n",
"mse of last test data: 0.035637442\n",
"mse of last test data: 0.035471745\n",
"mse of last test data: 0.035452746\n",
"mse of last test data: 0.03572343\n",
"mse of last test data: 0.0359579\n",
"mse of last test data: 0.03599089\n",
"mse of last test data: 0.03591044\n",
"mse of last test data: 0.036002126\n",
"mse of last test data: 0.03595816\n",
"mse of last test data: 0.035726678\n",
"mse of last test data: 0.035456814\n",
"mse of last test data: 0.035001807\n",
"mse of last test data: 0.034719385\n",
"mse of last test data: 0.03468811\n",
"mse of last test data: 0.034629267\n",
"mse of last test data: 0.034678638\n",
"mse of last test data: 0.034925133\n",
"mse of last test data: 0.035014037\n",
"mse of last test data: 0.03494468\n",
"mse of last test data: 0.035068564\n",
"mse of last test data: 0.035189286\n",
"mse of last test data: 0.035209198\n",
"mse of last test data: 0.035288822\n",
"mse of last test data: 0.035522904\n",
"mse of last test data: 0.035889734\n",
"mse of last test data: 0.03612873\n",
"mse of last test data: 0.036274746\n",
"mse of last test data: 0.03674327\n",
"mse of last test data: 0.037314296\n",
"mse of last test data: 0.037749104\n",
"mse of last test data: 0.03806662\n",
"mse of last test data: 0.038177904\n",
"mse of last test data: 0.038116015\n",
"mse of last test data: 0.038094003\n",
"mse of last test data: 0.038104504\n",
"mse of last test data: 0.03827262\n",
"mse of last test data: 0.038561925\n",
"mse of last test data: 0.038967945\n",
"mse of last test data: 0.039505426\n",
"mse of last test data: 0.040004343\n",
"mse of last test data: 0.040388074\n",
"mse of last test data: 0.04060459\n",
"mse of last test data: 0.041038353\n",
"mse of last test data: 0.04167475\n",
"mse of last test data: 0.04242282\n",
"mse of last test data: 0.042974524\n",
"mse of last test data: 0.043507062\n",
"mse of last test data: 0.043978337\n",
"mse of last test data: 0.044552732\n",
"mse of last test data: 0.044811197\n",
"mse of last test data: 0.044948854\n",
"mse of last test data: 0.0453248\n",
"mse of last test data: 0.045763493\n",
"mse of last test data: 0.045807287\n",
"mse of last test data: 0.04584695\n",
"mse of last test data: 0.045835588\n",
"mse of last test data: 0.046063326\n",
"mse of last test data: 0.046142258\n",
"mse of last test data: 0.04619061\n",
"mse of last test data: 0.04602862\n",
"mse of last test data: 0.046279095\n",
"mse of last test data: 0.04648937\n",
"mse of last test data: 0.046688378\n",
"mse of last test data: 0.047017314\n",
"mse of last test data: 0.04759529\n",
"mse of last test data: 0.048187714\n",
"mse of last test data: 0.04876649\n",
"mse of last test data: 0.049561806\n",
"mse of last test data: 0.050339673\n",
"mse of last test data: 0.050895724\n",
"mse of last test data: 0.051403012\n",
"mse of last test data: 0.051551413\n",
"mse of last test data: 0.05184145\n",
"mse of last test data: 0.05213111\n",
"mse of last test data: 0.05201789\n",
"mse of last test data: 0.05168149\n",
"mse of last test data: 0.05192534\n",
"mse of last test data: 0.05235551\n",
"mse of last test data: 0.052856937\n",
"mse of last test data: 0.053938713\n",
"mse of last test data: 0.054606132\n",
"mse of last test data: 0.055008397\n",
"mse of last test data: 0.055384487\n",
"mse of last test data: 0.05562475\n",
"mse of last test data: 0.05541428\n",
"mse of last test data: 0.055100046\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"mse of last test data: 0.054605152\n",
"mse of last test data: 0.054154\n",
"mse of last test data: 0.05385637\n",
"mse of last test data: 0.0536435\n",
"mse of last test data: 0.05328147\n",
"mse of last test data: 0.053027265\n",
"mse of last test data: 0.053042434\n",
"mse of last test data: 0.05267731\n",
"mse of last test data: 0.052673582\n",
"mse of last test data: 0.05239616\n",
"mse of last test data: 0.051708102\n",
"mse of last test data: 0.051275477\n",
"mse of last test data: 0.05111995\n",
"mse of last test data: 0.050987016\n",
"mse of last test data: 0.050700914\n",
"mse of last test data: 0.050172016\n",
"mse of last test data: 0.049366377\n",
"mse of last test data: 0.048903815\n",
"mse of last test data: 0.04788856\n",
"mse of last test data: 0.0470797\n",
"mse of last test data: 0.046200998\n",
"mse of last test data: 0.045548897\n",
"mse of last test data: 0.044755854\n",
"mse of last test data: 0.04399403\n",
"mse of last test data: 0.04330141\n",
"mse of last test data: 0.042683505\n",
"mse of last test data: 0.04236841\n",
"mse of last test data: 0.04186626\n",
"mse of last test data: 0.0416881\n",
"mse of last test data: 0.041540608\n",
"mse of last test data: 0.04154751\n",
"mse of last test data: 0.041715562\n",
"mse of last test data: 0.041812643\n",
"mse of last test data: 0.041822653\n",
"mse of last test data: 0.041784607\n",
"mse of last test data: 0.04144943\n",
"mse of last test data: 0.041050747\n",
"mse of last test data: 0.040759165\n",
"mse of last test data: 0.040293314\n",
"mse of last test data: 0.039935593\n",
"mse of last test data: 0.039261766\n",
"mse of last test data: 0.038622603\n",
"mse of last test data: 0.038196854\n",
"mse of last test data: 0.03789666\n",
"mse of last test data: 0.037674353\n",
"mse of last test data: 0.037321392\n",
"mse of last test data: 0.037049852\n",
"mse of last test data: 0.03672101\n",
"mse of last test data: 0.036547102\n",
"mse of last test data: 0.03663898\n",
"mse of last test data: 0.03675339\n",
"mse of last test data: 0.036771975\n",
"mse of last test data: 0.03672096\n",
"mse of last test data: 0.03690495\n",
"mse of last test data: 0.03713462\n",
"mse of last test data: 0.03707089\n",
"mse of last test data: 0.0369767\n",
"mse of last test data: 0.036843468\n",
"mse of last test data: 0.0366896\n",
"mse of last test data: 0.036693912\n",
"mse of last test data: 0.036737178\n",
"mse of last test data: 0.036925703\n",
"mse of last test data: 0.037359696\n",
"mse of last test data: 0.03801434\n",
"mse of last test data: 0.038453683\n",
"mse of last test data: 0.0388445\n",
"mse of last test data: 0.03943726\n",
"mse of last test data: 0.040112153\n",
"mse of last test data: 0.040496938\n",
"mse of last test data: 0.040723853\n",
"mse of last test data: 0.041014466\n",
"mse of last test data: 0.041356135\n",
"mse of last test data: 0.041903637\n",
"mse of last test data: 0.04234812\n",
"mse of last test data: 0.042939443\n",
"mse of last test data: 0.043498352\n",
"mse of last test data: 0.043968774\n",
"mse of last test data: 0.044493068\n",
"mse of last test data: 0.04521411\n",
"mse of last test data: 0.045771904\n",
"mse of last test data: 0.046629895\n",
"mse of last test data: 0.047299497\n",
"mse of last test data: 0.047667027\n",
"mse of last test data: 0.047989164\n",
"mse of last test data: 0.048167024\n",
"mse of last test data: 0.048462152\n",
"mse of last test data: 0.048996046\n",
"mse of last test data: 0.049763598\n",
"mse of last test data: 0.050080504\n",
"mse of last test data: 0.050239693\n",
"mse of last test data: 0.050378412\n",
"mse of last test data: 0.050598167\n",
"mse of last test data: 0.05105101\n",
"mse of last test data: 0.051576763\n",
"mse of last test data: 0.052223917\n",
"mse of last test data: 0.053182542\n",
"mse of last test data: 0.054220323\n",
"mse of last test data: 0.055362917\n",
"mse of last test data: 0.056611493\n",
"mse of last test data: 0.057848323\n",
"mse of last test data: 0.05854145\n",
"mse of last test data: 0.059256084\n",
"mse of last test data: 0.059849508\n",
"mse of last test data: 0.060376026\n",
"mse of last test data: 0.060621083\n",
"mse of last test data: 0.06094754\n",
"mse of last test data: 0.061078124\n",
"mse of last test data: 0.06154837\n",
"mse of last test data: 0.06218207\n",
"mse of last test data: 0.062612005\n",
"mse of last test data: 0.06316759\n",
"mse of last test data: 0.06364927\n",
"mse of last test data: 0.06395581\n",
"mse of last test data: 0.06490716\n",
"mse of last test data: 0.0659104\n",
"mse of last test data: 0.066883266\n",
"mse of last test data: 0.06799279\n",
"mse of last test data: 0.06883022\n",
"mse of last test data: 0.06999637\n",
"mse of last test data: 0.07040557\n",
"mse of last test data: 0.07055467\n",
"mse of last test data: 0.0704412\n",
"mse of last test data: 0.070556104\n",
"mse of last test data: 0.07039124\n",
"mse of last test data: 0.070203714\n",
"mse of last test data: 0.06943795\n",
"mse of last test data: 0.06905787\n",
"mse of last test data: 0.06877463\n",
"mse of last test data: 0.06792161\n",
"mse of last test data: 0.067531504\n",
"mse of last test data: 0.06737344\n",
"mse of last test data: 0.067189686\n",
"mse of last test data: 0.06694325\n",
"mse of last test data: 0.06666852\n",
"mse of last test data: 0.065830804\n",
"mse of last test data: 0.06537669\n",
"mse of last test data: 0.06491417\n",
"mse of last test data: 0.06468389\n",
"mse of last test data: 0.06437395\n",
"mse of last test data: 0.06392299\n",
"mse of last test data: 0.06348827\n",
"mse of last test data: 0.063527524\n",
"mse of last test data: 0.063115045\n",
"mse of last test data: 0.0627057\n",
"mse of last test data: 0.062102113\n",
"mse of last test data: 0.061501656\n",
"mse of last test data: 0.061108947\n",
"mse of last test data: 0.060269404\n",
"mse of last test data: 0.05914622\n",
"mse of last test data: 0.058618482\n",
"mse of last test data: 0.057946824\n",
"mse of last test data: 0.057315763\n",
"mse of last test data: 0.056833602\n",
"mse of last test data: 0.056032997\n",
"mse of last test data: 0.055409484\n",
"mse of last test data: 0.054566707\n",
"mse of last test data: 0.05363072\n",
"mse of last test data: 0.052835308\n",
"mse of last test data: 0.052092392\n",
"mse of last test data: 0.051302966\n",
"mse of last test data: 0.050705142\n",
"mse of last test data: 0.0497013\n",
"mse of last test data: 0.04873594\n",
"mse of last test data: 0.047886934\n",
"mse of last test data: 0.047256593\n",
"mse of last test data: 0.046389896\n",
"mse of last test data: 0.045826245\n",
"mse of last test data: 0.045038085\n",
"mse of last test data: 0.04472146\n",
"mse of last test data: 0.04450987\n",
"mse of last test data: 0.043820444\n",
"mse of last test data: 0.043335173\n",
"mse of last test data: 0.043237902\n",
"mse of last test data: 0.042693343\n",
"mse of last test data: 0.0420492\n",
"mse of last test data: 0.041761592\n",
"mse of last test data: 0.041558076\n",
"mse of last test data: 0.04113762\n",
"mse of last test data: 0.040989418\n",
"mse of last test data: 0.040603217\n",
"mse of last test data: 0.040685717\n",
"mse of last test data: 0.040991854\n",
"mse of last test data: 0.041050777\n",
"mse of last test data: 0.04132885\n",
"mse of last test data: 0.041440982\n",
"mse of last test data: 0.041547675\n",
"mse of last test data: 0.041578636\n",
"mse of last test data: 0.041851215\n",
"mse of last test data: 0.041640528\n",
"mse of last test data: 0.041732017\n",
"mse of last test data: 0.0419739\n",
"mse of last test data: 0.04194562\n",
"mse of last test data: 0.04221782\n",
"mse of last test data: 0.042523533\n",
"mse of last test data: 0.043012597\n",
"mse of last test data: 0.043684058\n",
"mse of last test data: 0.04402702\n",
"mse of last test data: 0.044481214\n",
"mse of last test data: 0.0450937\n",
"mse of last test data: 0.045700084\n",
"mse of last test data: 0.046173405\n",
"mse of last test data: 0.0467588\n",
"mse of last test data: 0.047187176\n",
"mse of last test data: 0.047719445\n",
"mse of last test data: 0.04842757\n",
"mse of last test data: 0.049238943\n",
"mse of last test data: 0.04988231\n",
"mse of last test data: 0.050821222\n",
"mse of last test data: 0.051694877\n",
"mse of last test data: 0.05214913\n",
"mse of last test data: 0.052437652\n",
"mse of last test data: 0.052969992\n",
"mse of last test data: 0.053789765\n",
"mse of last test data: 0.054559898\n",
"mse of last test data: 0.05517614\n",
"mse of last test data: 0.055931017\n",
"mse of last test data: 0.056781147\n",
"mse of last test data: 0.0573848\n",
"mse of last test data: 0.057863265\n",
"mse of last test data: 0.05891953\n",
"mse of last test data: 0.059961736\n",
"mse of last test data: 0.060802933\n",
"mse of last test data: 0.061579917\n",
"mse of last test data: 0.06266324\n",
"mse of last test data: 0.06371082\n",
"mse of last test data: 0.06462453\n",
"mse of last test data: 0.06564987\n",
"mse of last test data: 0.06654139\n",
"mse of last test data: 0.067626685\n",
"mse of last test data: 0.06854836\n",
"mse of last test data: 0.06957363\n",
"mse of last test data: 0.07085023\n",
"mse of last test data: 0.07175384\n",
"mse of last test data: 0.07260185\n",
"mse of last test data: 0.073333375\n",
"mse of last test data: 0.074260205\n",
"mse of last test data: 0.07508073\n",
"mse of last test data: 0.075647935\n",
"mse of last test data: 0.07631055\n",
"mse of last test data: 0.07694918\n",
"mse of last test data: 0.076984815\n",
"mse of last test data: 0.077071525\n",
"mse of last test data: 0.077484496\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"mse of last test data: 0.07809034\n",
"mse of last test data: 0.07847417\n",
"mse of last test data: 0.079089314\n",
"mse of last test data: 0.07933486\n",
"mse of last test data: 0.079938\n",
"mse of last test data: 0.08079829\n",
"mse of last test data: 0.081314266\n",
"mse of last test data: 0.08216548\n",
"mse of last test data: 0.0826575\n",
"mse of last test data: 0.08339308\n",
"mse of last test data: 0.083519086\n",
"mse of last test data: 0.0840565\n",
"mse of last test data: 0.084472895\n",
"mse of last test data: 0.08464473\n",
"mse of last test data: 0.08453613\n",
"mse of last test data: 0.083544716\n",
"mse of last test data: 0.082723804\n",
"mse of last test data: 0.08207079\n",
"mse of last test data: 0.08183347\n",
"mse of last test data: 0.0817586\n",
"mse of last test data: 0.081749596\n",
"mse of last test data: 0.08135106\n",
"mse of last test data: 0.08085264\n",
"mse of last test data: 0.08009475\n",
"mse of last test data: 0.07935655\n",
"mse of last test data: 0.07896202\n",
"mse of last test data: 0.07839527\n",
"mse of last test data: 0.07789573\n",
"mse of last test data: 0.077722974\n",
"mse of last test data: 0.07696794\n",
"mse of last test data: 0.07575168\n",
"mse of last test data: 0.074648835\n",
"mse of last test data: 0.073912315\n",
"mse of last test data: 0.07296068\n",
"mse of last test data: 0.072213\n",
"mse of last test data: 0.07117133\n",
"mse of last test data: 0.070252426\n",
"mse of last test data: 0.06944831\n",
"mse of last test data: 0.068270326\n",
"mse of last test data: 0.0670842\n",
"mse of last test data: 0.06638204\n",
"mse of last test data: 0.06568636\n",
"mse of last test data: 0.06470476\n",
"mse of last test data: 0.06364994\n",
"mse of last test data: 0.06275745\n",
"mse of last test data: 0.06165835\n",
"mse of last test data: 0.06073502\n",
"mse of last test data: 0.059538607\n",
"mse of last test data: 0.05833644\n",
"mse of last test data: 0.05694349\n",
"mse of last test data: 0.055479866\n",
"mse of last test data: 0.054633502\n",
"mse of last test data: 0.05381038\n",
"mse of last test data: 0.05303871\n",
"mse of last test data: 0.052432828\n",
"mse of last test data: 0.05182874\n",
"mse of last test data: 0.051080927\n",
"mse of last test data: 0.050386973\n",
"mse of last test data: 0.049565386\n",
"mse of last test data: 0.049125805\n",
"mse of last test data: 0.048725173\n",
"mse of last test data: 0.04790157\n",
"mse of last test data: 0.04716007\n",
"mse of last test data: 0.046846654\n",
"mse of last test data: 0.046007197\n",
"mse of last test data: 0.045369487\n",
"mse of last test data: 0.044932183\n",
"mse of last test data: 0.04426895\n",
"mse of last test data: 0.043891855\n",
"mse of last test data: 0.043293122\n",
"mse of last test data: 0.04309746\n",
"mse of last test data: 0.04310781\n",
"mse of last test data: 0.04271647\n",
"mse of last test data: 0.042131722\n",
"mse of last test data: 0.042267226\n",
"mse of last test data: 0.04246434\n",
"mse of last test data: 0.042620976\n",
"mse of last test data: 0.042942483\n",
"mse of last test data: 0.04303761\n",
"mse of last test data: 0.04349474\n",
"mse of last test data: 0.0437899\n",
"mse of last test data: 0.044176083\n",
"mse of last test data: 0.044732552\n",
"mse of last test data: 0.04543317\n",
"mse of last test data: 0.045993652\n",
"mse of last test data: 0.046672627\n",
"mse of last test data: 0.04723318\n",
"mse of last test data: 0.047575876\n",
"mse of last test data: 0.048151337\n",
"mse of last test data: 0.04898234\n",
"mse of last test data: 0.04950618\n",
"mse of last test data: 0.04985728\n",
"mse of last test data: 0.050079018\n",
"mse of last test data: 0.050002214\n",
"mse of last test data: 0.04996802\n",
"mse of last test data: 0.050199352\n",
"mse of last test data: 0.05039392\n",
"mse of last test data: 0.050659057\n",
"mse of last test data: 0.05120479\n",
"mse of last test data: 0.05144986\n",
"mse of last test data: 0.051979337\n",
"mse of last test data: 0.05278858\n",
"mse of last test data: 0.053678963\n",
"mse of last test data: 0.0549005\n",
"mse of last test data: 0.056104675\n",
"mse of last test data: 0.05728328\n",
"mse of last test data: 0.058226917\n",
"mse of last test data: 0.059043556\n",
"mse of last test data: 0.05978783\n",
"mse of last test data: 0.06066101\n",
"mse of last test data: 0.061586507\n",
"mse of last test data: 0.062372074\n",
"mse of last test data: 0.063418165\n",
"mse of last test data: 0.0644478\n",
"mse of last test data: 0.06523493\n",
"mse of last test data: 0.06619985\n",
"mse of last test data: 0.06691338\n",
"mse of last test data: 0.06766483\n",
"mse of last test data: 0.06823798\n",
"mse of last test data: 0.069028705\n",
"mse of last test data: 0.07040166\n",
"mse of last test data: 0.07137897\n",
"mse of last test data: 0.07202942\n",
"mse of last test data: 0.072754875\n",
"mse of last test data: 0.07371439\n",
"mse of last test data: 0.07483628\n",
"mse of last test data: 0.07592519\n",
"mse of last test data: 0.07681563\n",
"mse of last test data: 0.07812281\n",
"mse of last test data: 0.07933848\n",
"mse of last test data: 0.08018373\n",
"mse of last test data: 0.08074742\n",
"mse of last test data: 0.08127048\n",
"mse of last test data: 0.081600845\n",
"mse of last test data: 0.08173432\n",
"mse of last test data: 0.08185565\n",
"mse of last test data: 0.08203371\n",
"mse of last test data: 0.08234206\n",
"mse of last test data: 0.08275901\n",
"mse of last test data: 0.0827084\n",
"mse of last test data: 0.08287379\n",
"mse of last test data: 0.08255896\n",
"mse of last test data: 0.08321978\n",
"mse of last test data: 0.08352913\n",
"mse of last test data: 0.08377892\n",
"mse of last test data: 0.08411917\n",
"mse of last test data: 0.08434226\n",
"mse of last test data: 0.08462197\n",
"mse of last test data: 0.08449116\n",
"mse of last test data: 0.0841965\n",
"mse of last test data: 0.083713956\n",
"mse of last test data: 0.08332585\n",
"mse of last test data: 0.08333279\n",
"mse of last test data: 0.08346157\n",
"mse of last test data: 0.08324353\n",
"mse of last test data: 0.08334021\n",
"mse of last test data: 0.08322359\n",
"mse of last test data: 0.08286543\n",
"mse of last test data: 0.0823608\n",
"mse of last test data: 0.08179303\n",
"mse of last test data: 0.08076766\n",
"mse of last test data: 0.08036916\n",
"mse of last test data: 0.079468556\n",
"mse of last test data: 0.07863285\n",
"mse of last test data: 0.077711366\n",
"mse of last test data: 0.07701495\n",
"mse of last test data: 0.07648523\n",
"mse of last test data: 0.076334864\n",
"mse of last test data: 0.07590014\n",
"mse of last test data: 0.075278714\n",
"mse of last test data: 0.07451074\n",
"mse of last test data: 0.073665306\n",
"mse of last test data: 0.072604604\n",
"mse of last test data: 0.071306616\n",
"mse of last test data: 0.069950886\n",
"mse of last test data: 0.068437\n",
"mse of last test data: 0.067476794\n",
"mse of last test data: 0.0665985\n",
"mse of last test data: 0.0661967\n",
"mse of last test data: 0.06555315\n",
"mse of last test data: 0.064645395\n",
"mse of last test data: 0.06402787\n",
"mse of last test data: 0.063268885\n",
"mse of last test data: 0.06259369\n",
"mse of last test data: 0.061966043\n",
"mse of last test data: 0.061628904\n",
"mse of last test data: 0.06091293\n",
"mse of last test data: 0.060561795\n",
"mse of last test data: 0.059895515\n",
"mse of last test data: 0.0587479\n",
"mse of last test data: 0.058090683\n",
"mse of last test data: 0.0575988\n",
"mse of last test data: 0.0569736\n",
"mse of last test data: 0.056413162\n",
"mse of last test data: 0.055881493\n",
"mse of last test data: 0.055156387\n",
"mse of last test data: 0.054764092\n",
"mse of last test data: 0.05379415\n",
"mse of last test data: 0.05341845\n",
"mse of last test data: 0.052721445\n",
"mse of last test data: 0.051884793\n",
"mse of last test data: 0.051117186\n",
"mse of last test data: 0.050562695\n",
"mse of last test data: 0.05040292\n",
"mse of last test data: 0.050410375\n",
"mse of last test data: 0.050853588\n",
"mse of last test data: 0.051424023\n",
"mse of last test data: 0.051752765\n",
"mse of last test data: 0.05224338\n",
"mse of last test data: 0.052897\n",
"mse of last test data: 0.052691735\n",
"mse of last test data: 0.05253566\n",
"mse of last test data: 0.052735034\n",
"mse of last test data: 0.052889466\n",
"mse of last test data: 0.052931055\n",
"mse of last test data: 0.05241148\n",
"mse of last test data: 0.051971577\n",
"mse of last test data: 0.052343342\n",
"mse of last test data: 0.0528425\n",
"mse of last test data: 0.0532845\n",
"mse of last test data: 0.05380743\n",
"mse of last test data: 0.054178886\n",
"mse of last test data: 0.05485781\n",
"mse of last test data: 0.054932643\n",
"mse of last test data: 0.055016536\n",
"mse of last test data: 0.0553546\n",
"mse of last test data: 0.05567089\n",
"mse of last test data: 0.055940997\n",
"mse of last test data: 0.056046944\n",
"mse of last test data: 0.056290556\n",
"mse of last test data: 0.05663026\n",
"mse of last test data: 0.057073623\n",
"mse of last test data: 0.057451386\n",
"mse of last test data: 0.05813381\n",
"mse of last test data: 0.05874961\n",
"mse of last test data: 0.059299555\n",
"mse of last test data: 0.05980952\n",
"mse of last test data: 0.060260225\n",
"mse of last test data: 0.0608641\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"mse of last test data: 0.061568096\n",
"mse of last test data: 0.062518425\n",
"mse of last test data: 0.06325057\n",
"mse of last test data: 0.06402895\n",
"mse of last test data: 0.06497191\n",
"mse of last test data: 0.06579888\n",
"mse of last test data: 0.067111544\n",
"mse of last test data: 0.068179786\n",
"mse of last test data: 0.06903188\n",
"mse of last test data: 0.07017574\n",
"mse of last test data: 0.07141715\n",
"mse of last test data: 0.07240259\n",
"mse of last test data: 0.07312126\n",
"mse of last test data: 0.07356385\n",
"mse of last test data: 0.07393713\n",
"mse of last test data: 0.07472873\n",
"mse of last test data: 0.07574809\n",
"mse of last test data: 0.07669301\n",
"mse of last test data: 0.0775595\n",
"mse of last test data: 0.078188\n",
"mse of last test data: 0.07941976\n",
"mse of last test data: 0.080385394\n",
"mse of last test data: 0.08167663\n",
"mse of last test data: 0.08269441\n",
"mse of last test data: 0.08372783\n",
"mse of last test data: 0.084634386\n",
"mse of last test data: 0.08485869\n",
"mse of last test data: 0.085374646\n",
"mse of last test data: 0.085740976\n",
"mse of last test data: 0.08663443\n",
"mse of last test data: 0.08713622\n",
"mse of last test data: 0.08758123\n",
"mse of last test data: 0.08789659\n",
"mse of last test data: 0.08796546\n",
"mse of last test data: 0.0878321\n",
"mse of last test data: 0.087539405\n",
"mse of last test data: 0.08747789\n",
"mse of last test data: 0.088020965\n",
"mse of last test data: 0.08858664\n",
"mse of last test data: 0.088778175\n",
"mse of last test data: 0.089013495\n",
"mse of last test data: 0.08898069\n",
"mse of last test data: 0.08858915\n",
"mse of last test data: 0.08817425\n",
"mse of last test data: 0.08775721\n",
"mse of last test data: 0.08751199\n",
"mse of last test data: 0.08770336\n",
"mse of last test data: 0.08773042\n",
"mse of last test data: 0.08756273\n",
"mse of last test data: 0.087514915\n",
"mse of last test data: 0.087031506\n",
"mse of last test data: 0.08626881\n",
"mse of last test data: 0.08545341\n",
"mse of last test data: 0.08504947\n",
"mse of last test data: 0.08450457\n",
"mse of last test data: 0.08383059\n",
"mse of last test data: 0.082974434\n",
"mse of last test data: 0.08217745\n",
"mse of last test data: 0.08167454\n",
"mse of last test data: 0.08074595\n",
"mse of last test data: 0.08006667\n",
"mse of last test data: 0.078919806\n",
"mse of last test data: 0.07762168\n",
"mse of last test data: 0.07612659\n",
"mse of last test data: 0.07543544\n",
"mse of last test data: 0.07471285\n",
"mse of last test data: 0.07409527\n",
"mse of last test data: 0.07324239\n",
"mse of last test data: 0.07200914\n",
"mse of last test data: 0.07094035\n",
"mse of last test data: 0.06998237\n",
"mse of last test data: 0.0689911\n",
"mse of last test data: 0.06862763\n",
"mse of last test data: 0.068846315\n",
"mse of last test data: 0.06896952\n",
"mse of last test data: 0.069029845\n",
"mse of last test data: 0.06876393\n",
"mse of last test data: 0.06822805\n",
"mse of last test data: 0.067627475\n",
"mse of last test data: 0.066910386\n",
"mse of last test data: 0.06596285\n",
"mse of last test data: 0.06475239\n",
"mse of last test data: 0.06337351\n",
"mse of last test data: 0.06190893\n",
"mse of last test data: 0.060455818\n",
"mse of last test data: 0.05945335\n",
"mse of last test data: 0.058874406\n",
"mse of last test data: 0.058529194\n",
"mse of last test data: 0.05847619\n",
"mse of last test data: 0.058467004\n",
"mse of last test data: 0.058635216\n",
"mse of last test data: 0.05900268\n",
"mse of last test data: 0.05964228\n",
"mse of last test data: 0.060126405\n",
"mse of last test data: 0.06030947\n",
"mse of last test data: 0.06021211\n",
"mse of last test data: 0.060109865\n",
"mse of last test data: 0.05989852\n",
"mse of last test data: 0.059676565\n",
"mse of last test data: 0.058915537\n",
"mse of last test data: 0.05818829\n",
"mse of last test data: 0.05793772\n",
"mse of last test data: 0.057634525\n",
"mse of last test data: 0.05776301\n",
"mse of last test data: 0.05802423\n",
"mse of last test data: 0.058413498\n",
"mse of last test data: 0.05889824\n",
"mse of last test data: 0.059561614\n",
"mse of last test data: 0.05995116\n",
"mse of last test data: 0.060674265\n",
"mse of last test data: 0.061642237\n",
"mse of last test data: 0.062265716\n",
"mse of last test data: 0.06261126\n",
"mse of last test data: 0.06321956\n",
"mse of last test data: 0.06385407\n",
"mse of last test data: 0.06478457\n",
"mse of last test data: 0.06547407\n",
"mse of last test data: 0.06600813\n",
"mse of last test data: 0.066247664\n",
"mse of last test data: 0.06696937\n",
"mse of last test data: 0.06712928\n",
"mse of last test data: 0.067296825\n",
"mse of last test data: 0.06803123\n",
"mse of last test data: 0.068576775\n",
"mse of last test data: 0.068736695\n",
"mse of last test data: 0.06898644\n",
"mse of last test data: 0.06920508\n",
"mse of last test data: 0.06966729\n",
"mse of last test data: 0.07024488\n",
"mse of last test data: 0.0707083\n",
"mse of last test data: 0.071489014\n",
"mse of last test data: 0.072244056\n",
"mse of last test data: 0.072727054\n",
"mse of last test data: 0.07265602\n",
"mse of last test data: 0.07259401\n",
"mse of last test data: 0.07283661\n",
"mse of last test data: 0.07355048\n",
"mse of last test data: 0.07413451\n",
"mse of last test data: 0.07455221\n",
"mse of last test data: 0.074991226\n",
"mse of last test data: 0.07586654\n",
"mse of last test data: 0.07635737\n",
"mse of last test data: 0.0767616\n",
"mse of last test data: 0.07676927\n",
"mse of last test data: 0.07701653\n",
"mse of last test data: 0.07765571\n",
"mse of last test data: 0.07808881\n",
"mse of last test data: 0.07842322\n",
"mse of last test data: 0.0786469\n",
"mse of last test data: 0.07885746\n",
"mse of last test data: 0.078998715\n",
"mse of last test data: 0.079190984\n",
"mse of last test data: 0.07954396\n",
"mse of last test data: 0.079925425\n",
"mse of last test data: 0.0804836\n",
"mse of last test data: 0.080848426\n",
"mse of last test data: 0.08105866\n",
"mse of last test data: 0.081377424\n",
"mse of last test data: 0.081521235\n",
"mse of last test data: 0.08179761\n",
"mse of last test data: 0.08261895\n",
"mse of last test data: 0.08329921\n",
"mse of last test data: 0.083642446\n",
"mse of last test data: 0.08394619\n",
"mse of last test data: 0.08432225\n",
"(1200, 30, 30, 3)\n"
]
}
],
"source": [
"import tensorflow as tf\n",
"import utils as util\n",
"import numpy as np\n",
"import os\n",
"\n",
"\n",
"def cnn_encoder_layer(data, filter_layer, strides):\n",
" \"\"\"\n",
" :param data: the input data, when it is the first layer is 5 * 30 * 30 * 3, the second layer is 30 * 30 * 32,\n",
" the third layer is 15 * 15 * 64, the fourth layer is 8 * 8 * 128\n",
" :param filter_layer:\n",
" :param strides:\n",
" :return: the result after conv, the first layer is 30 * 30 * 32, the second layer is 15 * 15 * 64, the third layer\n",
" is 8 * 8 * 128, the final layer is 4 * 4 * 256\n",
" \"\"\"\n",
"\n",
" result = tf.nn.conv2d(\n",
" input=data,\n",
" filters=filter_layer,\n",
" strides=strides,\n",
" padding=\"SAME\")\n",
" return tf.nn.selu(result)\n",
"\n",
"\n",
"def tensor_variable(shape, name):\n",
" \"\"\"\n",
" Tensor variable declaration initialization\n",
" :param shape:\n",
" :param name:\n",
" :return:\n",
" \"\"\"\n",
" variable = tf.Variable(tf.zeros(shape), name=name)\n",
" variable = tf.compat.v1.get_variable(name, shape=shape, initializer=tf.compat.v1.keras.initializers.VarianceScaling(scale=1.0, mode=\"fan_avg\", distribution=\"uniform\"))\n",
" \n",
" return variable\n",
"\n",
"\n",
"def cnn_encoder(data):\n",
" \"\"\"\n",
"\n",
" :param data: the input data size is 5 * 30 * 30 * 3\n",
" :return:\n",
" \"\"\"\n",
" # the first layer,the output size is 30 * 30 * 32\n",
" filter1 = tensor_variable([3, 3, 3, 32], \"filter1\")\n",
" strides1 = (1, 1, 1, 1)\n",
" cnn1_out = cnn_encoder_layer(data, filter1, strides1)\n",
"\n",
" # the second layer, the output size is 15 * 15 * 64\n",
" filter2 = tensor_variable([3, 3, 32, 64], \"filter2\")\n",
" strides2 = (1, 2, 2, 1)\n",
" cnn2_out = cnn_encoder_layer(cnn1_out, filter2, strides2)\n",
"\n",
" # the third layer, the output size is 8 * 8 * 128\n",
" filter3 = tensor_variable([2, 2, 64, 128], \"filter3\")\n",
" strides3 = (1, 2, 2, 1)\n",
" cnn3_out = cnn_encoder_layer(cnn2_out, filter3, strides3)\n",
"\n",
" # the fourth layer, the output size is 4 * 4 * 256\n",
" filter4 = tensor_variable([2, 2, 128, 256], \"filter4\")\n",
" strides4 = (1, 2, 2, 1)\n",
" cnn4_out = cnn_encoder_layer(cnn3_out, filter4, strides4)\n",
"\n",
" return cnn1_out, cnn2_out, cnn3_out, cnn4_out\n",
"\n",
"\n",
"def cnn_lstm_attention_layer(input_data, layer_number):\n",
" \"\"\"\n",
"\n",
" :param input_data:\n",
" :param layer_number:\n",
" :return:\n",
" \"\"\"\n",
" convlstm_layer = tf.contrib.rnn.ConvLSTMCell(\n",
" conv_ndims=2,\n",
" input_shape=[input_data.shape[2], input_data.shape[3], input_data.shape[4]],\n",
" output_channels=input_data.shape[-1],\n",
" kernel_shape=[2, 2],\n",
" use_bias=True,\n",
" skip_connection=False,\n",
" forget_bias=1.0,\n",
" initializers=None,\n",
" name=\"conv_lstm_cell\" + str(layer_number))\n",
"\n",
" outputs, state = tf.compat.v1.nn.dynamic_rnn(convlstm_layer, input_data, dtype=input_data.dtype)\n",
"\n",
" # attention based on inner-product between feature representation of last step and other steps\n",
" attention_w = []\n",
" for k in range(util.step_max):\n",
" attention_w.append(tf.reduce_sum(input_tensor=tf.multiply(outputs[0][k], outputs[0][-1])) / util.step_max)\n",
" attention_w = tf.reshape(tf.nn.softmax(tf.stack(attention_w)), [1, util.step_max])\n",
"\n",
" outputs = tf.reshape(outputs[0], [util.step_max, -1])\n",
" outputs = tf.matmul(attention_w, outputs)\n",
" outputs = tf.reshape(outputs, [1, input_data.shape[2], input_data.shape[3], input_data.shape[4]])\n",
"\n",
" return outputs, attention_w\n",
"\n",
"\n",
"def cnn_decoder_layer(conv_lstm_out_c, filter, output_shape, strides):\n",
" \"\"\"\n",
"\n",
" :param conv_lstm_out_c:\n",
" :param filter:\n",
" :param output_shape:\n",
" :param strides:\n",
" :return:\n",
" \"\"\"\n",
"\n",
" deconv = tf.nn.conv2d_transpose(\n",
" input=conv_lstm_out_c,\n",
" filters=filter,\n",
" output_shape=output_shape,\n",
" strides=strides,\n",
" padding=\"SAME\")\n",
" deconv = tf.nn.selu(deconv)\n",
" return deconv\n",
"\n",
"\n",
"def cnn_decoder(lstm1_out, lstm2_out, lstm3_out, lstm4_out):\n",
" d_filter4 = tensor_variable([2, 2, 128, 256], \"d_filter4\")\n",
" dec4 = cnn_decoder_layer(lstm4_out, d_filter4, [1, 8, 8, 128], (1, 2, 2, 1))\n",
" dec4_concat = tf.concat([dec4, lstm3_out], axis=3)\n",
"\n",
" d_filter3 = tensor_variable([2, 2, 64, 256], \"d_filter3\")\n",
" dec3 = cnn_decoder_layer(dec4_concat, d_filter3, [1, 15, 15, 64], (1, 2, 2, 1))\n",
" dec3_concat = tf.concat([dec3, lstm2_out], axis=3)\n",
"\n",
" d_filter2 = tensor_variable([3, 3, 32, 128], \"d_filter2\")\n",
" dec2 = cnn_decoder_layer(dec3_concat, d_filter2, [1, 30, 30, 32], (1, 2, 2, 1))\n",
" dec2_concat = tf.concat([dec2, lstm1_out], axis=3)\n",
"\n",
" d_filter1 = tensor_variable([3, 3, 3, 64], \"d_filter1\")\n",
" dec1 = cnn_decoder_layer(dec2_concat, d_filter1, [1, 30, 30, 3], (1, 1, 1, 1))\n",
"\n",
" return dec1\n",
"\n",
"\n",
"def main():\n",
" # Read dataset from file\n",
" matrix_data_path = util.train_data_path + \"train.npy\"\n",
" matrix_gt_1 = np.load(matrix_data_path)\n",
"\n",
" sess = tf.compat.v1.Session()\n",
" data_input = tf.compat.v1.placeholder(tf.float32, [util.step_max, 30, 30, 3])\n",
"\n",
" # cnn encoder\n",
" conv1_out, conv2_out, conv3_out, conv4_out = cnn_encoder(data_input)\n",
"\n",
" conv1_out = tf.reshape(conv1_out, [-1, 5, 30, 30, 32])\n",
" conv2_out = tf.reshape(conv2_out, [-1, 5, 15, 15, 64])\n",
" conv3_out = tf.reshape(conv3_out, [-1, 5, 8, 8, 128])\n",
" conv4_out = tf.reshape(conv4_out, [-1, 5, 4, 4, 256])\n",
"\n",
" # lstm with attention\n",
" conv1_lstm_attention_out, atten_weight_1 = cnn_lstm_attention_layer(conv1_out, 1)\n",
" conv2_lstm_attention_out, atten_weight_2 = cnn_lstm_attention_layer(conv2_out, 2)\n",
" conv3_lstm_attention_out, atten_weight_3 = cnn_lstm_attention_layer(conv3_out, 3)\n",
" conv4_lstm_attention_out, atten_weight_4 = cnn_lstm_attention_layer(conv4_out, 4)\n",
"\n",
" # cnn decoder\n",
" deconv_out = cnn_decoder(conv1_lstm_attention_out, conv2_lstm_attention_out, conv3_lstm_attention_out,\n",
" conv4_lstm_attention_out)\n",
" # loss function: reconstruction error of last step matrix\n",
" loss = tf.reduce_mean(input_tensor=tf.square(data_input[-1] - deconv_out))\n",
" optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=util.learning_rate).minimize(loss)\n",
"\n",
" # variable initialization\n",
" init = tf.compat.v1.global_variables_initializer()\n",
" sess.run(init)\n",
"\n",
" # training\n",
" for idx in range(util.train_start_id, util.train_end_id):\n",
" matrix_gt = matrix_gt_1[idx - util.train_start_id]\n",
" feed_dict = {data_input: np.asarray(matrix_gt)}\n",
" a, loss_value = sess.run([optimizer, loss], feed_dict)\n",
" print(\"mse of last train data: \" + str(loss_value))\n",
"\n",
" # test\n",
" # Read the data from test file.\n",
" matrix_data_path = util.test_data_path + \"test.npy\"\n",
" matrix_gt_1 = np.load(matrix_data_path)\n",
" result_all = []\n",
" for idx in range(util.test_start_id, util.test_end_id):\n",
" matrix_gt = matrix_gt_1[idx - util.test_start_id]\n",
" feed_dict = {data_input: np.asarray(matrix_gt)}\n",
" result, loss_value = sess.run([deconv_out, loss], feed_dict)\n",
" result_all.append(result)\n",
" print(\"mse of last test data: \" + str(loss_value))\n",
"\n",
" # Write the reconstructed matrix to the file\n",
" reconstructed_path = util.reconstructed_data_path\n",
" if not os.path.exists(reconstructed_path):\n",
" os.makedirs(reconstructed_path)\n",
" reconstructed_path = reconstructed_path + \"test_reconstructed.npy\"\n",
"\n",
" result_all = np.asarray(result_all).reshape((-1, 30, 30, 3))\n",
" print(result_all.shape)\n",
" np.save(reconstructed_path, result_all)\n",
"\n",
"\n",
"if __name__ == '__main__':\n",
" main()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.4"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
================================================
FILE: 02_Python/MSCRED/cnn_lstm/convlstm.py
================================================
import tensorflow as tf
import cnn_lstm.utils as util
import numpy as np
import os
def cnn_encoder_layer(data, filter_layer, strides):
"""
:param data: the input data, when it is the first layer is 5 * 30 * 30 * 3, the second layer is 30 * 30 * 32,
the third layer is 15 * 15 * 64, the fourth layer is 8 * 8 * 128
:param filter_layer:
:param strides:
:return: the result after conv, the first layer is 30 * 30 * 32, the second layer is 15 * 15 * 64, the third layer
is 8 * 8 * 128, the final layer is 4 * 4 * 256
"""
result = tf.nn.conv2d(
input=data,
filter=filter_layer,
strides=strides,
padding="SAME")
return tf.nn.selu(result)
def tensor_variable(shape, name):
"""
Tensor variable declaration initialization
:param shape:
:param name:
:return:
"""
variable = tf.Variable(tf.zeros(shape), name=name)
variable = tf.compat.v1.get_variable(name, shape=shape, initializer=tf.contrib.layers.xavier_initializer())
return variable
def cnn_encoder(data):
"""
:param data: the input data size is 5 * 30 * 30 * 3
:return:
"""
# the first layer,the output size is 30 * 30 * 32
filter1 = tensor_variable([3, 3, 3, 32], "filter1")
strides1 = (1, 1, 1, 1)
cnn1_out = cnn_encoder_layer(data, filter1, strides1)
# the second layer, the output size is 15 * 15 * 64
filter2 = tensor_variable([3, 3, 32, 64], "filter2")
strides2 = (1, 2, 2, 1)
cnn2_out = cnn_encoder_layer(cnn1_out, filter2, strides2)
# the third layer, the output size is 8 * 8 * 128
filter3 = tensor_variable([2, 2, 64, 128], "filter3")
strides3 = (1, 2, 2, 1)
cnn3_out = cnn_encoder_layer(cnn2_out, filter3, strides3)
# the fourth layer, the output size is 4 * 4 * 256
filter4 = tensor_variable([2, 2, 128, 256], "filter4")
strides4 = (1, 2, 2, 1)
cnn4_out = cnn_encoder_layer(cnn3_out, filter4, strides4)
return cnn1_out, cnn2_out, cnn3_out, cnn4_out
def cnn_lstm_attention_layer(input_data, layer_number):
"""
:param input_data:
:param layer_number:
:return:
"""
convlstm_layer = tf.contrib.rnn.ConvLSTMCell(
conv_ndims=2,
input_shape=[input_data.shape[2], input_data.shape[3], input_data.shape[4]],
output_channels=input_data.shape[-1],
kernel_shape=[2, 2],
use_bias=True,
skip_connection=False,
forget_bias=1.0,
initializers=None,
name="conv_lstm_cell" + str(layer_number))
outputs, state = tf.nn.dynamic_rnn(convlstm_layer, input_data, dtype=input_data.dtype)
# attention based on inner-product between feature representation of last step and other steps
attention_w = []
for k in range(util.step_max):
attention_w.append(tf.reduce_sum(tf.multiply(outputs[0][k], outputs[0][-1])) / util.step_max)
attention_w = tf.reshape(tf.nn.softmax(tf.stack(attention_w)), [1, util.step_max])
outputs = tf.reshape(outputs[0], [util.step_max, -1])
outputs = tf.matmul(attention_w, outputs)
outputs = tf.reshape(outputs, [1, input_data.shape[2], input_data.shape[3], input_data.shape[4]])
return outputs, attention_w
def cnn_decoder_layer(conv_lstm_out_c, filter, output_shape, strides):
"""
:param conv_lstm_out_c:
:param filter:
:param output_shape:
:param strides:
:return:
"""
deconv = tf.nn.conv2d_transpose(
value=conv_lstm_out_c,
filter=filter,
output_shape=output_shape,
strides=strides,
padding="SAME")
deconv = tf.nn.selu(deconv)
return deconv
def cnn_decoder(lstm1_out, lstm2_out, lstm3_out, lstm4_out):
d_filter4 = tensor_variable([2, 2, 128, 256], "d_filter4")
dec4 = cnn_decoder_layer(lstm4_out, d_filter4, [1, 8, 8, 128], (1, 2, 2, 1))
dec4_concat = tf.concat([dec4, lstm3_out], axis=3)
d_filter3 = tensor_variable([2, 2, 64, 256], "d_filter3")
dec3 = cnn_decoder_layer(dec4_concat, d_filter3, [1, 15, 15, 64], (1, 2, 2, 1))
dec3_concat = tf.concat([dec3, lstm2_out], axis=3)
d_filter2 = tensor_variable([3, 3, 32, 128], "d_filter2")
dec2 = cnn_decoder_layer(dec3_concat, d_filter2, [1, 30, 30, 32], (1, 2, 2, 1))
dec2_concat = tf.concat([dec2, lstm1_out], axis=3)
d_filter1 = tensor_variable([3, 3, 3, 64], "d_filter1")
dec1 = cnn_decoder_layer(dec2_concat, d_filter1, [1, 30, 30, 3], (1, 1, 1, 1))
return dec1
def main():
# Read dataset from file
matrix_data_path = util.train_data_path + "train.npy"
matrix_gt_1 = np.load(matrix_data_path)
sess = tf.Session()
data_input = tf.compat.v1.placeholder(tf.float32, [util.step_max, 30, 30, 3])
# cnn encoder
conv1_out, conv2_out, conv3_out, conv4_out = cnn_encoder(data_input)
conv1_out = tf.reshape(conv1_out, [-1, 5, 30, 30, 32])
conv2_out = tf.reshape(conv2_out, [-1, 5, 15, 15, 64])
conv3_out = tf.reshape(conv3_out, [-1, 5, 8, 8, 128])
conv4_out = tf.reshape(conv4_out, [-1, 5, 4, 4, 256])
# lstm with attention
conv1_lstm_attention_out, atten_weight_1 = cnn_lstm_attention_layer(conv1_out, 1)
conv2_lstm_attention_out, atten_weight_2 = cnn_lstm_attention_layer(conv2_out, 2)
conv3_lstm_attention_out, atten_weight_3 = cnn_lstm_attention_layer(conv3_out, 3)
conv4_lstm_attention_out, atten_weight_4 = cnn_lstm_attention_layer(conv4_out, 4)
# cnn decoder
deconv_out = cnn_decoder(conv1_lstm_attention_out, conv2_lstm_attention_out, conv3_lstm_attention_out,
conv4_lstm_attention_out)
# loss function: reconstruction error of last step matrix
loss = tf.reduce_mean(tf.square(data_input[-1] - deconv_out))
optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=util.learning_rate).minimize(loss)
# variable initialization
init = tf.global_variables_initializer()
sess.run(init)
# training
for idx in range(util.train_start_id, util.train_end_id):
matrix_gt = matrix_gt_1[idx - util.train_start_id]
feed_dict = {data_input: np.asarray(matrix_gt)}
a, loss_value = sess.run([optimizer, loss], feed_dict)
print("mse of last train data: " + str(loss_value))
# test
# Read the data from test file.
matrix_data_path = util.test_data_path + "test.npy"
matrix_gt_1 = np.load(matrix_data_path)
result_all = []
for idx in range(util.test_start_id, util.test_end_id):
matrix_gt = matrix_gt_1[idx - util.test_start_id]
feed_dict = {data_input: np.asarray(matrix_gt)}
result, loss_value = sess.run([deconv_out, loss], feed_dict)
result_all.append(result)
print("mse of last test data: " + str(loss_value))
# Write the reconstructed matrix to the file
reconstructed_path = util.reconstructed_data_path
if not os.path.exists(reconstructed_path):
os.makedirs(reconstructed_path)
reconstructed_path = reconstructed_path + "test_reconstructed.npy"
result_all = np.asarray(result_all).reshape((-1, 30, 30, 3))
print(result_all.shape)
np.save(reconstructed_path, result_all)
if __name__ == '__main__':
main()
================================================
FILE: 02_Python/MSCRED/cnn_lstm/evaluation.ipynb
================================================
{
"cells": [
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The shape of test data is (1200, 30, 30, 3)\n",
"The shape of reconstructed data is (1200, 30, 30, 3)\n",
"Max valid anom is 2.00\n",
"Threshold is 3.00\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import os\n",
"import utils as util\n",
"import re\n",
"\n",
"# score initialization\n",
"valid_anomaly_score = np.zeros((util.valid_end_id - util.valid_start_id, 1))\n",
"test_anomaly_score = np.zeros((util.test_end_id - util.valid_end_id, 1))\n",
"\n",
"# load the data from file\n",
"test_data_path = util.test_data_path\n",
"reconstructed_data_path = util.reconstructed_data_path\n",
"test_data_path = os.path.join(test_data_path, \"test.npy\")\n",
"reconstructed_data_path = os.path.join(reconstructed_data_path, \"test_reconstructed.npy\")\n",
"test_data = np.load(test_data_path)\n",
"test_data = test_data[:, -1, ...] # only compare the last matrix with the reconstructed data\n",
"reconstructed_data = np.load(reconstructed_data_path)\n",
"print(\"The shape of test data is {}\".format(test_data.shape))\n",
"print(\"The shape of reconstructed data is {}\".format(reconstructed_data.shape))\n",
"\n",
"valid_len = util.valid_end_id - util.valid_start_id\n",
"\n",
"# compute the threshold, threshold = alpha * max{s(t)} , s(t) is the anomaly scores over validation period.\n",
"for i in range(util.valid_end_id - util.valid_start_id):\n",
"\terror = np.square(np.subtract(test_data[i, ..., 0], reconstructed_data[i, ..., 0]))\n",
"\tnum_anom = len(np.where(error > util.threhold))\n",
"\tvalid_anomaly_score[i] = num_anom\n",
"\n",
"max_valid_anom = np.max(valid_anomaly_score)\n",
"threshold = max_valid_anom * util.alpha\n",
"\n",
"print(\"Max valid anom is %.2f\" % max_valid_anom)\n",
"print(\"Threshold is %.2f\" % threshold)\n",
"\n",
"# compute the anomaly score in the test data.\n",
"for i in range(util.test_end_id - util.valid_end_id):\n",
"\terror = np.square(np.subtract(test_data[i, ..., 0], reconstructed_data[i, ..., 0]))\n",
"\tnum_anom = len(np.where(error > threshold))\n",
"\ttest_anomaly_score[i - valid_len] = num_anom\n",
"\n",
"# plot anomaly score curve and identification result\n",
"anomaly_pos = np.zeros(5)\n",
"root_cause_gt = np.zeros((5, 3))\n",
"anomaly_span = [10, 30, 90]\n",
"\n",
"# Read the test_anomaly.csv, each line behalf of an anomaly, the first is the position, the next three number is the\n",
"# root cause.\n",
"root_cause_f = open(\"../data/test_anomaly.csv\", \"r\")\n",
"\n",
"root_cause_gt = np.loadtxt(root_cause_f, delimiter=\",\", dtype=np.int32)\n",
"anomaly_pos = root_cause_gt[:, 0]\n",
"anomaly_pos = [(anomaly_pos[i]/util.gap_time-util.test_start_id-anomaly_span[i % 3]/util.gap_time) for i in range(5)]\n",
"for i in range(5):\n",
"\troot_cause_gt[i][0] = anomaly_pos[i]\n",
"\n",
"\n",
"fig, axes = plt.subplots()\n",
"test_num = util.test_end_id - util.test_start_id\n",
"plt.xticks(fontsize = 25)\n",
"plt.ylim((0, 100))\n",
"plt.yticks(np.arange(0, 101, 20), fontsize = 25)\n",
"plt.plot(test_anomaly_score, 'b', linewidth = 2)\n",
"threshold = np.full((test_num), max_valid_anom * util.alpha)\n",
"axes.plot(threshold, color = 'black', linestyle = '--',linewidth = 2)\n",
"for k in range(len(anomaly_pos)):\n",
"\taxes.axvspan(anomaly_pos[k], anomaly_pos[k] + anomaly_span[k%3]/util.gap_time, color='red', linewidth=2)\n",
"\n",
"labels = [' ', '0e3', '2e3', '4e3', '6e3', '8e3', '10e3']\n",
"axes.set_xticklabels(labels, rotation = 25, fontsize = 20)\n",
"plt.xlabel('Test Time', fontsize = 25)\n",
"plt.ylabel('Anomaly Score', fontsize = 25)\n",
"axes.spines['right'].set_visible(False)\n",
"axes.spines['top'].set_visible(False)\n",
"axes.yaxis.set_ticks_position('left')\n",
"axes.xaxis.set_ticks_position('bottom')\n",
"fig.subplots_adjust(bottom=0.25)\n",
"fig.subplots_adjust(left=0.25)\n",
"plt.title(\"MSCRED\", size = 25)\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[[[ 7.04064071e-01, 3.74522775e-01, 4.47765976e-01],\n",
" [-2.98897862e-01, -7.66673505e-01, 4.26859260e-01],\n",
" [ 5.42617023e-01, 3.69995445e-01, -6.44724131e-01],\n",
" ...,\n",
" [-1.01098157e-01, 2.04227835e-01, -5.04897773e-01],\n",
" [-3.84952039e-01, -3.95544618e-01, 5.00987656e-02],\n",
" [-8.38977844e-02, -8.14120397e-02, -5.31205954e-03]],\n",
"\n",
" [[-2.64311314e-01, -2.52485245e-01, -3.25333983e-01],\n",
" [ 4.30644780e-01, 3.51560205e-01, -2.94740409e-01],\n",
" [-3.42947125e-01, -2.47012973e-01, 3.40349197e-01],\n",
" ...,\n",
" [-1.42371416e-01, 2.19778404e-01, -4.18861330e-01],\n",
" [-3.53498220e-01, -4.27131832e-01, 1.35710686e-01],\n",
" [-5.40348962e-02, -1.22621477e-01, 4.99183722e-02]],\n",
"\n",
" [[ 5.22105038e-01, 3.02384377e-01, 3.36110651e-01],\n",
" [-2.89837956e-01, -6.70089483e-01, 3.94490510e-01],\n",
" [ 5.53662360e-01, 2.92761773e-01, -5.11705399e-01],\n",
" ...,\n",
" [ 1.09688327e-01, -2.00070634e-01, 7.28469133e-01],\n",
" [ 6.70080245e-01, 5.83485782e-01, -4.08666655e-02],\n",
" [ 3.99453044e-02, 9.08637345e-02, 2.97329854e-04]],\n",
"\n",
" ...,\n",
"\n",
" [[-8.80392268e-02, -1.00941710e-01, -8.62924680e-02],\n",
" [ 1.50133893e-01, 5.63429408e-02, -1.44342631e-01],\n",
" [-1.02274962e-01, -1.17299981e-01, 1.09629296e-01],\n",
" ...,\n",
" [ 4.11492251e-02, -8.19874480e-02, 9.28616762e-01],\n",
" [ 8.15970778e-01, 6.26959145e-01, 9.17455405e-02],\n",
" [-1.12580411e-01, -9.61837843e-02, 1.77792534e-01]],\n",
"\n",
" [[-7.37436175e-01, -3.24902683e-01, -3.88478458e-01],\n",
" [ 2.23024666e-01, 9.28885818e-01, -3.27060014e-01],\n",
" [-5.19271135e-01, -3.01478446e-01, 6.87132418e-01],\n",
" ...,\n",
" [-1.10190757e-01, 1.62858039e-01, 3.14977206e-02],\n",
" [ 1.10810861e-01, -5.14560975e-02, 2.63920635e-01],\n",
" [-1.16073824e-01, -1.91061035e-01, 1.34103924e-01]],\n",
"\n",
" [[ 6.41601160e-03, -4.35149409e-02, -6.51849583e-02],\n",
" [ 1.22927040e-01, -5.28241433e-02, -6.55850545e-02],\n",
" [-8.67857132e-03, -8.20624754e-02, -3.15133445e-02],\n",
" ...,\n",
" [-1.82486519e-01, 1.31603345e-01, 1.33611903e-01],\n",
" [ 2.04952165e-01, 1.11552589e-02, 1.28105909e-01],\n",
" [-1.99556217e-01, -1.64938122e-01, 2.04542413e-01]]],\n",
"\n",
"\n",
" [[[ 6.79917336e-01, 3.55985790e-01, 4.28662121e-01],\n",
" [-2.83477157e-01, -7.54773140e-01, 4.19623792e-01],\n",
" [ 5.27973533e-01, 3.61982346e-01, -6.18236363e-01],\n",
" ...,\n",
" [-8.83809477e-02, 1.91086918e-01, -4.80915755e-01],\n",
" [-3.57060909e-01, -3.69313687e-01, 4.88834903e-02],\n",
" [-8.70463327e-02, -7.39597306e-02, -1.31816452e-03]],\n",
"\n",
" [[-2.44989142e-01, -2.38429546e-01, -3.16050351e-01],\n",
" [ 4.24357980e-01, 3.54713440e-01, -2.89681107e-01],\n",
" [-3.22282493e-01, -2.24485964e-01, 3.35882634e-01],\n",
" ...,\n",
" [-1.34595096e-01, 2.10720986e-01, -4.09628510e-01],\n",
" [-3.48464072e-01, -4.15548891e-01, 1.32037923e-01],\n",
" [-4.62375097e-02, -1.18703760e-01, 3.54624651e-02]],\n",
"\n",
" [[ 5.02865314e-01, 2.85199761e-01, 3.22424948e-01],\n",
" [-2.97595859e-01, -6.55339897e-01, 3.88778359e-01],\n",
" [ 5.20777166e-01, 2.72323757e-01, -4.73876327e-01],\n",
" ...,\n",
" [ 9.89991277e-02, -1.82224751e-01, 7.15534508e-01],\n",
" [ 6.50987029e-01, 5.61722100e-01, -2.38141473e-02],\n",
" [ 3.26592848e-02, 8.09843168e-02, 1.06586050e-02]],\n",
"\n",
" ...,\n",
"\n",
" [[-7.64092207e-02, -8.32142308e-02, -7.65090808e-02],\n",
" [ 1.42628595e-01, 3.80489193e-02, -1.45639628e-01],\n",
" [-7.68235624e-02, -9.94603857e-02, 9.94035080e-02],\n",
" ...,\n",
" [ 3.20766978e-02, -3.54966559e-02, 9.33479607e-01],\n",
" [ 8.21256816e-01, 6.11127853e-01, 1.14048757e-01],\n",
" [-1.36615664e-01, -1.28301144e-01, 2.08944276e-01]],\n",
"\n",
" [[-7.35684097e-01, -3.12582195e-01, -3.77254516e-01],\n",
" [ 2.21078888e-01, 9.28260028e-01, -2.96603888e-01],\n",
" [-5.13130128e-01, -2.98380405e-01, 6.79174542e-01],\n",
" ...,\n",
" [-1.11217394e-01, 1.74280569e-01, 4.29298021e-02],\n",
" [ 1.26864836e-01, -4.78857681e-02, 2.73473918e-01],\n",
" [-1.24763295e-01, -1.92039981e-01, 1.41049162e-01]],\n",
"\n",
" [[ 1.32945245e-02, -3.87203358e-02, -6.21801876e-02],\n",
" [ 1.21750608e-01, -7.69304484e-02, -6.02132604e-02],\n",
" [-1.58674363e-03, -8.07843432e-02, -5.53307384e-02],\n",
" ...,\n",
" [-1.75814062e-01, 1.33520216e-01, 1.49803266e-01],\n",
" [ 2.20021561e-01, 1.84681676e-02, 1.31551251e-01],\n",
" [-2.04605982e-01, -1.67672649e-01, 2.10331142e-01]]],\n",
"\n",
"\n",
" [[[ 6.52920544e-01, 3.35909814e-01, 4.09017503e-01],\n",
" [-2.76899219e-01, -7.40868509e-01, 4.06494081e-01],\n",
" [ 5.16137540e-01, 3.56847495e-01, -5.93396425e-01],\n",
" ...,\n",
" [-7.08877817e-02, 1.74005613e-01, -4.63341177e-01],\n",
" [-3.26822639e-01, -3.38207126e-01, 4.29577343e-02],\n",
" [-7.95312524e-02, -5.43444492e-02, -1.07008256e-02]],\n",
"\n",
" [[-2.24392816e-01, -2.20552221e-01, -2.93454707e-01],\n",
" [ 4.12042409e-01, 3.54120970e-01, -2.68817008e-01],\n",
" [-2.92297423e-01, -1.98751420e-01, 3.31134677e-01],\n",
" ...,\n",
" [-1.23868063e-01, 1.93920195e-01, -3.80687058e-01],\n",
" [-3.35400194e-01, -3.89126062e-01, 1.20310627e-01],\n",
" [-2.72770673e-02, -9.98448581e-02, 2.90213507e-02]],\n",
"\n",
" [[ 4.90766495e-01, 2.69954264e-01, 3.09346884e-01],\n",
" [-3.00604820e-01, -6.45075738e-01, 3.70979786e-01],\n",
" [ 4.93564457e-01, 2.60388762e-01, -4.44828093e-01],\n",
" ...,\n",
" [ 8.86952132e-02, -1.64795712e-01, 7.12646186e-01],\n",
" [ 6.58571661e-01, 5.52982032e-01, 3.04084923e-03],\n",
" [ 1.83560643e-02, 6.79676682e-02, 3.19759510e-02]],\n",
"\n",
" ...,\n",
"\n",
" [[-6.24664761e-02, -6.57579601e-02, -6.79971278e-02],\n",
" [ 1.39382973e-01, 1.91848613e-02, -1.49713799e-01],\n",
" [-3.93616557e-02, -7.71472603e-02, 9.43215862e-02],\n",
" ...,\n",
" [ 1.82397887e-02, 4.21114964e-03, 9.38782632e-01],\n",
" [ 8.26476872e-01, 5.98676145e-01, 1.36195764e-01],\n",
" [-1.59242004e-01, -1.58888862e-01, 2.33872399e-01]],\n",
"\n",
" [[-7.30418801e-01, -3.03994894e-01, -3.59382868e-01],\n",
" [ 2.08334461e-01, 9.24598396e-01, -2.77217895e-01],\n",
" [-5.08326411e-01, -2.95484096e-01, 6.56581044e-01],\n",
" ...,\n",
" [-1.08930230e-01, 1.84923634e-01, 5.60650229e-02],\n",
" [ 1.41883463e-01, -3.83467562e-02, 2.73193657e-01],\n",
" [-1.21756844e-01, -1.80763751e-01, 1.42212972e-01]],\n",
"\n",
" [[ 1.09339440e-02, -3.85531969e-02, -6.03271686e-02],\n",
" [ 1.26041695e-01, -8.69184881e-02, -5.33027239e-02],\n",
" [-1.33838924e-03, -8.33624080e-02, -6.58709183e-02],\n",
" ...,\n",
" [-1.72450170e-01, 1.36239484e-01, 1.61665335e-01],\n",
" [ 2.30772883e-01, 2.10260451e-02, 1.33851498e-01],\n",
" [-2.07984760e-01, -1.68746337e-01, 2.15266049e-01]]],\n",
"\n",
"\n",
" ...,\n",
"\n",
"\n",
" [[[ 3.28091562e-01, 2.31943071e-01, 3.14745069e-01],\n",
" [-1.57922059e-01, -3.69662017e-01, 4.29991275e-01],\n",
" [ 1.38514131e-01, 6.90799952e-02, 4.04169001e-02],\n",
" ...,\n",
" [-3.36202681e-02, 3.79698873e-01, 5.83139472e-02],\n",
" [-1.52178168e-01, -2.67343760e-01, 1.01641491e-01],\n",
" [ 8.24085176e-02, -7.91617557e-02, 1.62353024e-01]],\n",
"\n",
" [[-1.64384618e-01, 2.79992763e-02, -9.60212499e-02],\n",
" [ 1.73426345e-01, -1.67210206e-01, 5.19643784e-01],\n",
" [-4.87699091e-01, -3.44360441e-01, -3.71591836e-01],\n",
" ...,\n",
" [ 7.17706442e-01, 5.90285540e-01, -2.06201538e-01],\n",
" [-7.54648209e-01, -5.48575699e-01, 1.69417053e-01],\n",
" [ 4.39212680e-01, 3.24219108e-01, 2.90745378e-01]],\n",
"\n",
" [[ 1.15504839e-01, -3.59496236e-01, 2.11073101e-01],\n",
" [-6.04588687e-01, -2.78948098e-02, -6.96893752e-01],\n",
" [ 9.27109957e-01, 6.12412393e-01, 7.39015758e-01],\n",
" ...,\n",
" [-8.95947635e-01, -2.06889696e-02, 2.18627051e-01],\n",
" [ 7.65301168e-01, 2.25973502e-01, -5.38723655e-02],\n",
" [-4.61084932e-01, -2.26172164e-01, -2.31560826e-01]],\n",
"\n",
" ...,\n",
"\n",
" [[ 4.29580957e-02, 2.00401142e-01, -9.89372656e-03],\n",
" [ 2.80811816e-01, -5.80144167e-01, 6.62714303e-01],\n",
" [-8.62461567e-01, -8.50817740e-01, -6.59833968e-01],\n",
" ...,\n",
" [-3.38320106e-01, -4.47020203e-01, 3.65264952e-01],\n",
" [ 5.08716524e-01, 1.64203539e-01, 2.79004216e-01],\n",
" [-1.48775503e-01, 2.80653563e-04, -2.43095998e-02]],\n",
"\n",
" [[ 7.59837553e-02, -3.04642200e-01, 7.23583251e-02],\n",
" [-3.56067806e-01, 1.97861642e-01, -6.84033215e-01],\n",
" [ 6.93900704e-01, 5.06925106e-01, 6.18374407e-01],\n",
" ...,\n",
" [-4.82215174e-02, -7.39484131e-02, 2.66021729e-01],\n",
" [-2.97970474e-01, -1.82971597e-01, 1.40596166e-01],\n",
" [ 6.37628734e-02, -1.64584979e-01, -6.98368391e-03]],\n",
"\n",
" [[-1.52346035e-02, 7.06654638e-02, -1.95035860e-01],\n",
" [ 3.47436965e-01, -3.62274557e-01, 4.49141830e-01],\n",
" [-3.07297379e-01, -2.55061120e-01, -4.59841579e-01],\n",
" ...,\n",
" [ 5.57698607e-01, 4.91494775e-01, -6.12601228e-02],\n",
" [-6.95904195e-01, -4.71823573e-01, 1.46396654e-02],\n",
" [ 2.97390342e-01, 1.40025854e-01, 4.26453441e-01]]],\n",
"\n",
"\n",
" [[[ 3.24486405e-01, 2.35852838e-01, 3.16618949e-01],\n",
" [-1.47060588e-01, -3.71782124e-01, 4.39458400e-01],\n",
" [ 1.24793984e-01, 6.01639412e-02, 4.02406976e-02],\n",
" ...,\n",
" [-4.24607433e-02, 3.75543803e-01, 5.36665022e-02],\n",
" [-1.58329174e-01, -2.62590230e-01, 8.84788856e-02],\n",
" [ 7.86422864e-02, -8.49000067e-02, 1.59324989e-01]],\n",
"\n",
" [[-1.56178862e-01, 3.88972163e-02, -8.18306804e-02],\n",
" [ 1.84061542e-01, -1.79109320e-01, 5.51241696e-01],\n",
" [-5.04722238e-01, -3.61917734e-01, -3.77561033e-01],\n",
" ...,\n",
" [ 7.31009662e-01, 6.15777791e-01, -2.33439296e-01],\n",
" [-7.76671290e-01, -5.65945387e-01, 1.57402903e-01],\n",
" [ 4.49532956e-01, 3.28452915e-01, 2.99394101e-01]],\n",
"\n",
" [[ 1.02626652e-01, -3.79289985e-01, 2.02140883e-01],\n",
" [-6.18043244e-01, -2.82461736e-02, -7.26448536e-01],\n",
" [ 9.41066682e-01, 6.22839689e-01, 7.20671415e-01],\n",
" ...,\n",
" [-8.86739612e-01, -2.51042284e-02, 2.30643317e-01],\n",
" [ 7.48107672e-01, 2.05714211e-01, -3.81364413e-02],\n",
" [-4.56352353e-01, -2.17234656e-01, -2.21152052e-01]],\n",
"\n",
" ...,\n",
"\n",
" [[ 4.88667563e-02, 2.08087280e-01, 2.22599614e-04],\n",
" [ 2.77121454e-01, -5.75004578e-01, 6.66037500e-01],\n",
" [-8.59576702e-01, -8.47260952e-01, -6.52055919e-01],\n",
" ...,\n",
" [-3.55650306e-01, -4.60160762e-01, 3.68615270e-01],\n",
" [ 5.20491242e-01, 1.72276929e-01, 2.78160036e-01],\n",
" [-1.54244632e-01, 1.75210810e-03, -3.07583250e-02]],\n",
"\n",
" [[ 6.62929937e-02, -3.24058682e-01, 6.67889863e-02],\n",
" [-3.66179794e-01, 1.99684113e-01, -6.91476703e-01],\n",
" [ 7.09880829e-01, 5.20802855e-01, 6.20879591e-01],\n",
" ...,\n",
" [-7.47452453e-02, -9.68089625e-02, 2.69781321e-01],\n",
" [-2.67466784e-01, -1.57957792e-01, 1.42870709e-01],\n",
" [ 5.39872609e-02, -1.61136732e-01, -6.13016216e-03]],\n",
"\n",
" [[-1.50470277e-02, 6.99529871e-02, -1.96954578e-01],\n",
" [ 3.42375636e-01, -3.51661652e-01, 4.33758259e-01],\n",
" [-2.95699447e-01, -2.37829417e-01, -4.44642812e-01],\n",
" ...,\n",
" [ 5.50044358e-01, 4.92978215e-01, -7.66981244e-02],\n",
" [-6.90217018e-01, -4.70508039e-01, 5.79284364e-03],\n",
" [ 2.85830498e-01, 1.34887442e-01, 4.29425836e-01]]],\n",
"\n",
"\n",
" [[[ 3.22824657e-01, 2.41062775e-01, 3.19095403e-01],\n",
" [-1.33742616e-01, -3.75967473e-01, 4.45875257e-01],\n",
" [ 1.09649576e-01, 5.39407656e-02, 2.87951119e-02],\n",
" ...,\n",
" [-4.55035567e-02, 3.71275246e-01, 5.01804650e-02],\n",
" [-1.81368187e-01, -2.69674420e-01, 8.57768580e-02],\n",
" [ 7.66498372e-02, -8.69410187e-02, 1.54167458e-01]],\n",
"\n",
" [[-1.47284225e-01, 5.40608615e-02, -6.48469031e-02],\n",
" [ 1.95705503e-01, -1.93635330e-01, 5.73859096e-01],\n",
" [-5.27484119e-01, -3.80984455e-01, -3.97037566e-01],\n",
" ...,\n",
" [ 7.26183951e-01, 6.15301311e-01, -2.34625325e-01],\n",
" [-7.81320512e-01, -5.73726118e-01, 1.32431850e-01],\n",
" [ 4.48875099e-01, 3.27830642e-01, 2.97908694e-01]],\n",
"\n",
" [[ 9.61836874e-02, -3.76938581e-01, 1.92711875e-01],\n",
" [-6.23054445e-01, -4.85291816e-02, -7.19452918e-01],\n",
" [ 9.25066173e-01, 6.09999716e-01, 7.03961849e-01],\n",
" ...,\n",
" [-8.86654675e-01, -3.78013216e-02, 2.37394124e-01],\n",
" [ 7.53812671e-01, 2.03501374e-01, -6.07147906e-03],\n",
" [-4.62591290e-01, -2.21702829e-01, -2.10880756e-01]],\n",
"\n",
" ...,\n",
"\n",
" [[ 5.16885631e-02, 2.13301256e-01, 6.57005655e-03],\n",
" [ 2.78806061e-01, -5.69760323e-01, 6.82743192e-01],\n",
" [-8.65907311e-01, -8.49609911e-01, -6.51102364e-01],\n",
" ...,\n",
" [-3.74296576e-01, -4.66497570e-01, 3.73103946e-01],\n",
" [ 5.29079616e-01, 1.75842151e-01, 2.83917338e-01],\n",
" [-1.62859187e-01, 5.19873691e-04, -3.13235670e-02]],\n",
"\n",
" [[ 6.07125461e-02, -3.37973148e-01, 6.29941672e-02],\n",
" [-3.81902844e-01, 1.94704801e-01, -7.04610884e-01],\n",
" [ 7.16744184e-01, 5.26270092e-01, 6.13018990e-01],\n",
" ...,\n",
" [-1.20134160e-01, -1.33741260e-01, 2.75083065e-01],\n",
" [-2.27044120e-01, -1.26904070e-01, 1.43584237e-01],\n",
" [ 3.92883942e-02, -1.60847932e-01, -1.08369496e-02]],\n",
"\n",
" [[-8.11249111e-03, 7.45976344e-02, -1.99472487e-01],\n",
" [ 3.41928095e-01, -3.49469543e-01, 4.36438680e-01],\n",
" [-2.98026115e-01, -2.31392533e-01, -4.40462291e-01],\n",
" ...,\n",
" [ 5.49112678e-01, 4.93310511e-01, -9.49802548e-02],\n",
" [-6.88755691e-01, -4.68035698e-01, -1.30833518e-02],\n",
" [ 2.80838847e-01, 1.32115334e-01, 4.35462296e-01]]]],\n",
" dtype=float32)"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"reconstructed_data"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.4"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
================================================
FILE: 02_Python/MSCRED/cnn_lstm/evalution.py
================================================
import numpy as np
import matplotlib.pyplot as plt
import os
import cnn_lstm.utils as util
import re
# score initialization
valid_anomaly_score = np.zeros((util.valid_end_id - util.valid_start_id, 1))
test_anomaly_score = np.zeros((util.test_end_id - util.valid_end_id, 1))
# load the data from file
test_data_path = util.test_data_path
reconstructed_data_path = util.reconstructed_data_path
test_data_path = os.path.join(test_data_path, "test.npy")
reconstructed_data_path = os.path.join(reconstructed_data_path, "test_reconstructed.npy")
test_data = np.load(test_data_path)
test_data = test_data[:, -1, ...] # only compare the last matrix with the reconstructed data
reconstructed_data = np.load(reconstructed_data_path)
print("The shape of test data is {}".format(test_data.shape))
print("The shape of reconstructed data is {}".format(reconstructed_data.shape))
valid_len = util.valid_end_id - util.valid_start_id
# compute the threshold, threshold = alpha * max{s(t)} , s(t) is the anomaly scores over validation period.
for i in range(util.valid_end_id - util.valid_start_id):
error = np.square(np.subtract(test_data[i, ..., 0], reconstructed_data[i, ..., 0]))
num_anom = len(np.where(error > util.threhold))
valid_anomaly_score[i] = num_anom
max_valid_anom = np.max(valid_anomaly_score)
threshold = max_valid_anom * util.alpha
print("Max valid anom is %.2f" % max_valid_anom)
print("Threshold is %.2f" % threshold)
# compute the anomaly score in the test data.
for i in range(util.test_end_id - util.valid_end_id):
error = np.square(np.subtract(test_data[i, ..., 0], reconstructed_data[i, ..., 0]))
num_anom = len(np.where(error > threshold))
test_anomaly_score[i - valid_len] = num_anom
# plot anomaly score curve and identification result
anomaly_pos = np.zeros(5)
root_cause_gt = np.zeros((5, 3))
anomaly_span = [10, 30, 90]
# Read the test_anomaly.csv, each line behalf of an anomaly, the first is the position, the next three number is the
# root cause.
root_cause_f = open("../data/test_anomaly.csv", "r")
root_cause_gt = np.loadtxt(root_cause_f, delimiter=",", dtype=np.int32)
anomaly_pos = root_cause_gt[:, 0]
anomaly_pos = [(anomaly_pos[i]/util.gap_time-util.test_start_id-anomaly_span[i % 3]/util.gap_time) for i in range(5)]
for i in range(5):
root_cause_gt[i][0] = anomaly_pos[i]
fig, axes = plt.subplots()
test_num = util.test_end_id - util.test_start_id
plt.xticks(fontsize = 25)
plt.ylim((0, 100))
plt.yticks(np.arange(0, 101, 20), fontsize = 25)
plt.plot(test_anomaly_score, 'b', linewidth = 2)
threshold = np.full((test_num), max_valid_anom * util.alpha)
axes.plot(threshold, color = 'black', linestyle = '--',linewidth = 2)
for k in range(len(anomaly_pos)):
axes.axvspan(anomaly_pos[k], anomaly_pos[k] + anomaly_span[k%3]/util.gap_time, color='red', linewidth=2)
labels = [' ', '0e3', '2e3', '4e3', '6e3', '8e3', '10e3']
axes.set_xticklabels(labels, rotation = 25, fontsize = 20)
plt.xlabel('Test Time', fontsize = 25)
plt.ylabel('Anomaly Score', fontsize = 25)
axes.spines['right'].set_visible(False)
axes.spines['top'].set_visible(False)
axes.yaxis.set_ticks_position('left')
axes.xaxis.set_ticks_position('bottom')
fig.subplots_adjust(bottom=0.25)
fig.subplots_adjust(left=0.25)
plt.title("MSCRED", size = 25)
plt.show()
================================================
FILE: 02_Python/MSCRED/cnn_lstm/generation_signature_matrice.ipynb
================================================
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"series_number is 30\n",
"series_length is 20000\n",
"signature_matrices_number is 2000\n",
"the shape of signature_matrices is (3, 2000, 30, 30)\n",
"train dataset shape is (790, 5, 30, 30, 3)\n",
"test dataset shape is (1200, 5, 30, 30, 3)\n"
]
}
],
"source": [
"\"\"\"\n",
"To represent the inter-correlations between different pairs of time series om a multivariate\n",
"time series segment from t-w to t, we construct an n * n signature matrix M based upon the\n",
"pairwise inner-product of two time series within the segment.\n",
"\n",
"Construct s (s = 3) signature matrices with different lengths(w = 10, 30, 60)\n",
"\"\"\"\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"import utils as util\n",
"import os\n",
"\n",
"\n",
"class SignatureMatrices:\n",
" def __init__(self):\n",
"\n",
" self.raw_data = pd.read_csv(util.raw_data_path, header=None)\n",
" self.series_number = self.raw_data.shape[0]\n",
" self.series_length = self.raw_data.shape[1]\n",
" self.signature_matrices_number = int(self.series_length / util.gap_time)\n",
"\n",
" print(\"series_number is\", self.series_number)\n",
" print(\"series_length is\", self.series_length)\n",
" print(\"signature_matrices_number is\", self.signature_matrices_number)\n",
"\n",
" def signature_matrices_generation(self, win):\n",
" \"\"\"\n",
" Generation signature matrices according win_size and gap_time, the size of raw_data is n * T, n is the number of\n",
" time series, T is the length of time series.\n",
" To represent the inter-correlations between different pairs of time series in a multivariate time series segment\n",
" from t − w to t, we construct an n × n signature matrix Mt based upon the pairwise inner-product of two time series\n",
" within this segment.\n",
" :param win: the length of the time series segment\n",
" :return: the signature matrices\n",
" \"\"\"\n",
"\n",
" if win == 0:\n",
" print(\"The size of win cannot be 0\")\n",
"\n",
" raw_data = np.asarray(self.raw_data)\n",
" signature_matrices = np.zeros((self.signature_matrices_number, self.series_number, self.series_number))\n",
"\n",
" for t in range(win, self.signature_matrices_number):\n",
" raw_data_t = raw_data[:, t - win:t]\n",
" signature_matrices[t] = np.dot(raw_data_t, raw_data_t.T) / win\n",
"\n",
" return signature_matrices\n",
"\n",
" def generate_train_test(self, signature_matrices):\n",
" \"\"\"\n",
" Generate train and test dataset, and store them to ../data/train/train.npy and ../data/test/test.npy\n",
" :param signature_matrices:\n",
" :return:\n",
" \"\"\"\n",
" train_dataset = []\n",
" test_dataset = []\n",
"\n",
" for data_id in range(self.signature_matrices_number):\n",
" index = data_id - util.step_max + 1\n",
" if data_id < util.train_start_id:\n",
" continue\n",
" index_dataset = signature_matrices[:, index:index + util.step_max]\n",
" if data_id < util.test_start_id:\n",
" train_dataset.append(index_dataset)\n",
" else:\n",
" test_dataset.append(index_dataset)\n",
"\n",
" train_dataset = np.asarray(train_dataset)\n",
" train_dataset = np.reshape(train_dataset, [-1, util.step_max, self.series_number, self.series_number,\n",
" signature_matrices.shape[0]])\n",
" test_dataset = np.asarray(test_dataset)\n",
" test_dataset = np.reshape(test_dataset, [-1, util.step_max,self.series_number, self.series_number,\n",
" signature_matrices.shape[0]])\n",
"\n",
" print(\"train dataset shape is\", train_dataset.shape)\n",
" print(\"test dataset shape is\", test_dataset.shape)\n",
"\n",
" train_path = \"../data/train/\"\n",
" if not os.path.exists(train_path):\n",
" os.makedirs(train_path)\n",
" train_path = train_path + \"train.npy\"\n",
"\n",
" test_path = \"../data/test/\"\n",
" if not os.path.exists(test_path):\n",
" os.makedirs(test_path)\n",
" test_path = test_path + \"test.npy\"\n",
"\n",
" np.save(train_path, train_dataset)\n",
" np.save(test_path, test_dataset)\n",
"\n",
"\n",
"if __name__ == '__main__':\n",
" Matrices = SignatureMatrices()\n",
" signature_matrices = []\n",
"\n",
" # Generation signature matrices according the win size w\n",
" for w in util.win_size:\n",
" signature_matrices.append(Matrices.signature_matrices_generation(w))\n",
"\n",
" signature_matrices = np.asarray(signature_matrices)\n",
" print(\"the shape of signature_matrices is\", signature_matrices.shape)\n",
"\n",
" # Generate train and test dataset\n",
" Matrices.generate_train_test(signature_matrices)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"hide_input": false,
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.8"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}
================================================
FILE: 02_Python/MSCRED/cnn_lstm/generation_signature_matrice.py
================================================
"""
To represent the inter-correlations between different pairs of time series om a multivariate
time series segment from t-w to t, we construct an n * n signature matrix M based upon the
pairwise inner-product of two time series within the segment.
Construct s (s = 3) signature matrices with different lengths(w = 10, 30, 60)
"""
import numpy as np
import pandas as pd
import cnn_lstm.utils as util
import os
class SignatureMatrices:
def __init__(self):
self.raw_data = pd.read_csv(util.raw_data_path, header=None)
self.series_number = self.raw_data.shape[0]
self.series_length = self.raw_data.shape[1]
self.signature_matrices_number = int(self.series_length / util.gap_time)
print("series_number is", self.series_number)
print("series_length is", self.series_length)
print("signature_matrices_number is", self.signature_matrices_number)
def signature_matrices_generation(self, win):
"""
Generation signature matrices according win_size and gap_time, the size of raw_data is n * T, n is the number of
time series, T is the length of time series.
To represent the inter-correlations between different pairs of time series in a multivariate time series segment
from t − w to t, we construct an n × n signature matrix Mt based upon the pairwise inner-product of two time series
within this segment.
:param win: the length of the time series segment
:return: the signature matrices
"""
if win == 0:
print("The size of win cannot be 0")
raw_data = np.asarray(self.raw_data)
signature_matrices = np.zeros((self.signature_matrices_number, self.series_number, self.series_number))
for t in range(win, self.signature_matrices_number):
raw_data_t = raw_data[:, t - win:t]
signature_matrices[t] = np.dot(raw_data_t, raw_data_t.T) / win
return signature_matrices
def generate_train_test(self, signature_matrices):
"""
Generate train and test dataset, and store them to ../data/train/train.npy and ../data/test/test.npy
:param signature_matrices:
:return:
"""
train_dataset = []
test_dataset = []
for data_id in range(self.signature_matrices_number):
index = data_id - util.step_max + 1
if data_id < util.train_start_id:
continue
index_dataset = signature_matrices[:, index:index + util.step_max]
if data_id < util.test_start_id:
train_dataset.append(index_dataset)
else:
test_dataset.append(index_dataset)
train_dataset = np.asarray(train_dataset)
train_dataset = np.reshape(train_dataset, [-1, util.step_max, self.series_number, self.series_number,
signature_matrices.shape[0]])
test_dataset = np.asarray(test_dataset)
test_dataset = np.reshape(test_dataset, [-1, util.step_max,self.series_number, self.series_number,
signature_matrices.shape[0]])
print("train dataset shape is", train_dataset.shape)
print("test dataset shape is", test_dataset.shape)
train_path = "../data/train/"
if not os.path.exists(train_path):
os.makedirs(train_path)
train_path = train_path + "train.npy"
test_path = "../data/test/"
if not os.path.exists(test_path):
os.makedirs(test_path)
test_path = test_path + "test.npy"
np.save(train_path, train_dataset)
np.save(test_path, test_dataset)
if __name__ == '__main__':
Matrices = SignatureMatrices()
signature_matrices = []
# Generation signature matrices according the win size w
for w in util.win_size:
signature_matrices.append(Matrices.signature_matrices_generation(w))
signature_matrices = np.asarray(signature_matrices)
print("the shape of signature_matrices is", signature_matrices.shape)
# Generate train and test dataset
Matrices.generate_train_test(signature_matrices)
================================================
FILE: 02_Python/MSCRED/cnn_lstm/report.txt
================================================
TensorFlow 2.0 Upgrade Script
-----------------------------
Converted 1 files
Detected 3 issues that require attention
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
File: convlstm.py
--------------------------------------------------------------------------------
convlstm.py:73:21: WARNING: Using member tf.contrib.rnn.ConvLSTMCell in deprecated module tf.contrib.rnn. (Manual edit required) tf.contrib.rnn.* has been deprecated, and widely used cells/functions will be moved to tensorflow/addons repository. Please check it there and file Github issues if necessary.
convlstm.py:73:21: ERROR: Using member tf.contrib.rnn.ConvLSTMCell in deprecated module tf.contrib. tf.contrib.rnn.ConvLSTMCell cannot be converted automatically. tf.contrib will not be distributed with TensorFlow 2.0, please consider an alternative in non-contrib TensorFlow, a community-maintained repository such as tensorflow/addons, or fork the required code.
convlstm.py:198:4: WARNING: *.save requires manual check. (This warning is only applicable if the code saves a tf.Keras model) Keras model.save now saves to the Tensorflow SavedModel format by default, instead of HDF5. To continue saving to HDF5, add the argument save_format='h5' to the save() function.
================================================================================
Detailed log follows:
================================================================================
--------------------------------------------------------------------------------
Processing file 'convlstm.py'
outputting to 'convlstm-update.py'
--------------------------------------------------------------------------------
17:13: INFO: Renamed keyword argument for tf.nn.conv2d from filter to filters
33:72: INFO: Changing tf.contrib.layers xavier initializer to a tf.compat.v1.keras.initializers.VarianceScaling and converting arguments.
73:21: WARNING: Using member tf.contrib.rnn.ConvLSTMCell in deprecated module tf.contrib.rnn. (Manual edit required) tf.contrib.rnn.* has been deprecated, and widely used cells/functions will be moved to tensorflow/addons repository. Please check it there and file Github issues if necessary.
73:21: ERROR: Using member tf.contrib.rnn.ConvLSTMCell in deprecated module tf.contrib. tf.contrib.rnn.ConvLSTMCell cannot be converted automatically. tf.contrib will not be distributed with TensorFlow 2.0, please consider an alternative in non-contrib TensorFlow, a community-maintained repository such as tensorflow/addons, or fork the required code.
84:21: INFO: Renamed 'tf.nn.dynamic_rnn' to 'tf.compat.v1.nn.dynamic_rnn'
89:27: INFO: Added keywords to args of function 'tf.reduce_sum'
109:13: INFO: Renamed keyword argument for tf.nn.conv2d_transpose from value to input
109:13: INFO: Renamed keyword argument for tf.nn.conv2d_transpose from filter to filters
143:11: INFO: Renamed 'tf.Session' to 'tf.compat.v1.Session'
164:11: INFO: Added keywords to args of function 'tf.reduce_mean'
168:11: INFO: Renamed 'tf.global_variables_initializer' to 'tf.compat.v1.global_variables_initializer'
198:4: WARNING: *.save requires manual check. (This warning is only applicable if the code saves a tf.Keras model) Keras model.save now saves to the Tensorflow SavedModel format by default, instead of HDF5. To continue saving to HDF5, add the argument save_format='h5' to the save() function.
--------------------------------------------------------------------------------
================================================
FILE: 02_Python/MSCRED/cnn_lstm/utils.py
================================================
# Parameter initialization
gap_time = 10 # gap time between each segment
win_size = [10, 30, 60] # window size of each segment
step_max = 5 # maximum step of ConvLSTM
raw_data_path = '../data/synthetic_data_with_anomaly-s-1.csv' # path to load raw data
model_path = '../MSCRED/'
train_data_path = "../data/train/"
test_data_path = "../data/test/"
reconstructed_data_path = "../data/reconstructed/"
train_start_id = 10
train_end_id = 800
test_start_id = 800
test_end_id = 2000
valid_start_id = 800
valid_end_id = 1000
training_iters = 5
save_model_step = 1
learning_rate = 0.0002
threhold = 0.005
alpha = 1.5
================================================
FILE: 02_Python/MSCRED/data/synthetic_data_with_anomaly-s-1.csv
================================================
[File too large to display: 14.6 MB]
================================================
FILE: 02_Python/Mean_Shift.py
================================================
#================================================================================================================
#----------------------------------------------------------------------------------------------------------------
# MEAN SHIFT
#----------------------------------------------------------------------------------------------------------------
#================================================================================================================
import math
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style
import pandas
import datetime
from sklearn import preprocessing, cross_validation
#for plotting
plt.style.use('ggplot')
class CustomMS:
def __init__(self):
pass
def main():
'''
Pclass Passenger Class (1 = 1st; 2 = 2nd; 3 = 3rd)
survival Survival (0 = No; 1 = Yes)
name Name
sex Sex
age Age
sibsp Number of Siblings/Spouses Aboard
parch Number of Parents/Children Aboard
ticket Ticket Number
fare Passenger Fare (British pound)
cabin Cabin
embarked Port of Embarkation (C = Cherbourg; Q = Queenstown; S = Southampton)
boat Lifeboat
body Body Identification Number
home.dest Home/Destination
'''
df = pd.read_excel('data/titanic.xls')
original_df = pd.DataFrame.copy(df)
df.drop(['body','name'], 1, inplace=True)
df.fillna(0,inplace=True)
def handle_non_numerical_data(df):
# handling non-numerical data: must convert.
columns = df.columns.values
for column in columns:
text_digit_vals = {}
def convert_to_int(val):
return text_digit_vals[val]
#print(column,df[column].dtype)
if df[column].dtype != np.int64 and df[column].dtype != np.float64:
column_contents = df[column].values.tolist()
#finding just the uniques
unique_elements = set(column_contents)
# great, found them.
x = 0
for unique in unique_elements:
if unique not in text_digit_vals:
# creating dict that contains new
# id per unique string
text_digit_vals[unique] = x
x+=1
# now we map the new "id" vlaue
# to replace the string.
df[column] = list(map(convert_to_int,df[column]))
return df
df = handle_non_numerical_data(df)
df.drop(['ticket','home.dest'], 1, inplace=True)
X = np.array(df.drop(['survived'], 1).astype(float))
X = preprocessing.scale(X)
y = np.array(df['survived'])
ms = CustomMS()
ms.fit(dataset = dataset)
if __name__ == "__main__":
main()
================================================
FILE: 02_Python/Naive_Bayes.py
================================================
#================================================================================================================
#----------------------------------------------------------------------------------------------------------------
# NAIVE BAYES
#----------------------------------------------------------------------------------------------------------------
#================================================================================================================
#Using Naive Bayes to classify emails as spam and non-spam
import math
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style
import pandas as pd
import nltk
import re
#for plotting
plt.style.use('ggplot')
class CustomNB:
def __init__(self):
pass
def create_freq_table(self, texts, labels=None):
#create the dataframe
ft = pd.DataFrame([])
#iterate through them emails
for index, trm in enumerate(texts):
vocabulary = trm #all the words of the email
#amount of times each word occurs in the dictionary
freq_dict = pd.Series({ v : trm.count(v) for v in vocabulary})
if labels!=None:
freq_dict['CLASS'] = labels[index]
ft = ft.append(freq_dict, ignore_index=True)
ft = ft.fillna(0)
return ft
def train(self, freq):
fq = freq.iloc[:,1:]
labels = fq.iloc[:, 0].values
vocabulary = list(fq.columns.values)
s, ns = pd.DataFrame([]), pd.DataFrame([])
for index, rw in fq.iterrows():
if labels[index] == 1:
s = s.append(rw)
else:
ns = ns.append(rw)
swc = sum([word for word in s.sum()])
nswc = sum([word for word in ns.sum()])
#Create the dicts for storing the model
non_spam_model, spam_model = {}, {}
alpha = 0.5
for word in vocabulary:
spam_occurances = s[word].sum()
non_spam_occurances = ns[word].sum()
#Now, the crux of the algo, the bayesian probablity
bayesian_probablity_for_spam = ( spam_occurances + alpha ) / ( swc )
bayesian_probablity_for_non_spam = ( non_spam_occurances + alpha ) / ( nswc )
#Update the model
non_spam_model[word], spam_model[word] = bayesian_probablity_for_spam , bayesian_probablity_for_non_spam
return spam_model, non_spam_model
def predict(self, text, spam_model,non_spam_model):
text = [x for x in text.replace('\n', ' ')]
text = [''.join(text).split()]
f_table = self.create_freq_table(text)
vocabulary = f_table.columns.values
spam_prob = 0
non_spam_prob = 0
for word in vocabulary:
if word in spam_model:
spam_prob += spam_model[word]
if word in non_spam_model:
non_spam_prob += non_spam_model[word]
print(spam_prob, non_spam_prob)
return (spam_prob / non_spam_prob)
def main():
# 0 means spam, 1 means not spam
emails = {"0": ["Dear friend, win 1000$ cash right now!!.", " Webcams Day & Night - All LIVE - Webcams Contest",
"Congratulations, you've won a free car!"],
"1": ["Hey, Can you redo the presentation and send it on by Friday?", "Thank you for the documents, I will revert as soon as possible",
"Open the Pod bay doors, HAL." , " I'm sorry, Dave. I'm afraid I can't do that."]}
t= []
labl = []
for k in emails:
for mail in emails[k]:
tokens = [word.lower() for sent in nltk.sent_tokenize(mail) for word in nltk.word_tokenize(sent)]
filtered_tokens = []
# filter out any tokens not containing letters (e.g., numeric tokens, raw punctuation)
for token in tokens:
if re.search('[a-zA-Z]', token):
filtered_tokens.append(token)
t.append(' '.join(filtered_tokens))
labl.append(k)
for i in range(len(t)):
t[i] = t[i].split()
nb = CustomNB()
freq_table = nb.create_freq_table(t, labl)
sp, nsp = nb.train(freq_table)
#ip = "Hey, Can you redo the presentation and send it on by Friday?"
#ip = "Webcams Day & Night - All LIVE - Webcams Contest"
ip = "Open the Pod bay doors, HAL."
#ip = "I'm sorry, Dave. I'm afraid I can't do that."
propr_ip = []
for ch in nltk.word_tokenize(ip):
if re.search('[a-zA-Z]', ch):
propr_ip.append(ch.lower())
propr_ip = ' '.join(propr_ip)
x = nb.predict(propr_ip, sp, nsp)
print(x)
if x < 0.5:
print("spam")
else:
print("not spam")
if __name__ == "__main__":
main()
================================================
FILE: 02_Python/README.md
================================================
# Unsupervised Learning
The Unsupervised learning is a branch of machine learning that learns from test data that has not been labeled, classified or categorized. Instead of responding to feedback, unsupervised learning identifies commonalities in the data and reacts based on the presence or absence of such commonalities in each new piece of data.
# Clustering
Clustering or cluster analysis is an unsupervised learning problem. It is often used as a data analysis technique for discovering interesting patterns in data, such as groups of customers based on their behavior. In clustering problems we split the training examples by unknown characteristics. The algorithm itself decides what characteristic to use for splitting.
Usage examples: market segmentation, social networks analysis, organize computing clusters, astronomical data analysis, image compression, etc.