[
  {
    "path": "01_MATLAB/Clustering.m",
    "content": "function [centroid, result] = Clustering(data, method, varargin)\n% Currently, following clustering algorithms are supported:\n%   1. Kmeans\n%   2. Kmeans++\n%   3. ISODATA (Iterative Self-Organizing Data Analysis)\n%   4. Mean Shift\n%   5. DBSCAN (Density-Based Spatial Clustering of Application with Noise)\n%   6. Gaussian Mixture Model /* Numerical instability problem not completely solved*/\n%   7. LVQ (Learning Vector Quantization)\n\naddpath('.\\lib');\naddpath('.\\tool');\n\n% Validate input parameters\nif((strcmp(method,'kmeans') || strcmp(method,'kmeans++')) && (size(varargin,2) ~= 2))\n    error('The value of K should be predefined when using k-means and k-means++.');\nelseif((strcmp(method,'isodata') || strcmp(method,'ISODATA')) && (size(varargin,2) < 5))\n    error('Not enough input arguments for ISODATA. Please use help for more information.');\nelseif((strcmp(method,'mean_shift') || strcmp(method,'Mean_Shift')) && (size(varargin,2) ~= 1))\n    error('Invalid number of input arguments for mean shift.');\nelseif((strcmp(method,'dbscan') || strcmp(method,'DBSCAN')) && (size(varargin, 2) ~= 2))\n    error('Invalid number of input arguments for dbscan.');\nelseif((strcmp(method,'GMM') || strcmp(method,'gmm')) && (size(varargin, 2) ~= 2))\n    error('Invalid number of input arguments for Gaussian Mixture Model');\nelseif((strcmp(method,'LVQ') || strcmp(method,'lvq')) && (size(varargin, 2) ~= 5))\n    error('Invalid number of input arguments for Learning Vector Quantization');\nend\n\n% Method entries\n% Kmeans\nif(strcmp(method,'kmeans'))\n    k = varargin{1,1};\n    iteration = varargin{1,2};\n    [centroid, result] = Kmeans(data, k, iteration);\n    PlotData(data, result, centroid);\n% Kmeans++\nelseif(strcmp(method,'kmeans++') || strcmp(method,'kmeanspp')) \n    k = varargin{1,1};\n    iteration = varargin{1,2};\n    [centroid, result] = Kmeanspp(data, k, iteration);\n    PlotData(data, result, centroid);\n% ISODATA\nelseif(strcmp(method,'ISODATA') || strcmp(method,'isodata'))\n    desired_k = varargin{1,1};  % desired number of classes\n    iteration = varargin{1,2};  % maximum iteration time\n    minimum_n = varargin{1,3};  % minimum number of samples in one class\n    maximum_variance = varargin{1,4};  % maximum allowed variance of samples in one class\n    minimum_d = varargin{1,5};  %  minimum distance between two classes\n    [centroid, result] = ISODATA(data, iteration, desired_k, minimum_n, maximum_variance, minimum_d);\n    PlotData(data, result, centroid);\n% Mean Shift\nelseif(strcmp(method,'mean_shift') || strcmp(method,'Mean_Shift'))\n    thr = varargin{1,1};  % distance threshold\n    [centroid, result] = Mean_Shift(data, thr);\n    PlotData(data, result, centroid);\n% DBSCAN\nelseif(strcmp(method,'dbscan') || strcmp(method,'DBSCAN'))\n    epsilon = varargin{1,1};  % distance threshold for finding neighbors\n    minPts = varargin{1,2}; % minimum required number of neighbor points for adding one core object\n    centroid = nan;  % DBSCAN will not calculate centroid\n    result = DBSCAN(data, epsilon, minPts);\n    PlotData(data, result);\n% Gaussian Mixture Model\nelseif(strcmp(method,'GMM') || strcmp(method,'gmm'))\n    k = varargin{1,1};  % the number of Guassian components\n    iter = varargin{1,2};  % maximum number of iterations\n    [result, ~, centroid, ~] = Gaussian_Mixture(data, k, iter);\n    PlotData(data, result, centroid);\n% Learning Vector Quantization\nelseif(strcmp(method,'LVQ') || strcmp(method,'lvq'))\n    q = varargin{1,1};  % the number of prototypes\n    neta = varargin{1,2};  % learning rate\n    x = varargin{1,3};  % training data\n    y = varargin{1,4};  % label of x\n    iter = varargin{1,5};  % maximum number of iterations\n    [centroid, result] = LVQ(data, q, neta, x, y, iter);\n    PlotData(data, result, centroid);\nelse\n    error('NotImplementedError!');\nend\nend\n"
  },
  {
    "path": "01_MATLAB/README.md",
    "content": "<p align=\"center\"> \n<a href=\"https://github.com/milaan9\"><img src=\"https://img.shields.io/static/v1?logo=github&label=maintainer&message=milaan9&color=ff3300\" alt=\"Last Commit\"/></a> \n<a href=\"https://hits.seeyoufarm.com\"><img src=\"https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2Fmilaan9%2FClustering_Algorithms_from_Scratch%2Ftree%2Fmain%2F01_MATLAB&count_bg=%231DC92C&title_bg=%23555555&icon=&icon_color=%23E7E7E7&title=views&edge_flat=false\"/></a>\n</p> \n<!--<img src=\"https://badges.pufler.dev/contributors/milaan9/01_Python_Introduction?size=50&padding=5&bots=true\" alt=\"milaan9\"/>-->\n \n# Clustering Algorithms with MATLAB\n\n## 1. Clustering Algorithms\n- **K-means**\n    - **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.\n\n- **K-means++**\n    - Generally speaking, **K-means++** algorithm is similar to **K-means**;\n    - 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.\n    - The initializeation procedure can be achieved using Fitness Proportionate Selection.\n\n- **ISODATA (Iterative Self-Organizing Data Analysis)**\n    - To be brief, **ISODATA** introduces two additional operations: Splitting and Merging;\n    - When the number of observations within one class is less than one pre-defined threshold, **ISODATA** merges two classes with minimum between-class distance; \n    - When the within-class variance of one class exceeds one pre-defined threshold, **ISODATA** splits this class into two different sub-classes.\n\n- **Mean Shift**\n\t- For each point *x*, find neighbors, calculate mean vector *m*, update *x = m*, until *x == m*;\n\t- Non-parametric model, no need to specify the number of classes;\n\t- No structure priori.\n\n- **DBSCAN (Density-Based Spatial Clustering of Application with Noise)**\n\t- Starting with pre-selected core objects, DBSCAN extends each cluster based on the connectivity between data points;\n\t- DBSCAN takes noisy data into consideration, hence robust to outliers;\n\t- Choosing good parameters can be hard without prior knowledge;\n- **Gaussian Mixture Model (GMM)**\n- **LVQ (Learning Vector Quantization)**\n\n## 2. Subspace Clustering Algorithms\n- **Subspace K-means**\n    - This algorithm directly extends **K-means** to Subspace Clustering through multiplying each dimension *d<sub>j</sub>* by one weight *m<sub>j</sub>* (s.t. sum(*m<sub>j</sub>*)=1, *j*=1,2,...,*p*);\n    - It can be efficiently sovled in an Expectation-Maximization (EM) fashion. In each E-step, it updates weights, centroids using Lagrange Multiplier;\n    - This rough algorithm suffers from the problem on its favor of using just a few dimensions when clustering sparse data;\n\n- **Entropy-Weighting Subspace K-means**\n    - Generally speaking, this algorithm is similar to **Subspace K-means**;\n    - 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**.\n    - Apart from its succinctness and efficiency, it works well on a broad range of real-world datasets.\n"
  },
  {
    "path": "01_MATLAB/lib/DBSCAN.m",
    "content": "function label = DBSCAN(data, eps, minPts)\n% label = DBSCAN(data, epsilon, minPts)\n%   Main part of DBSCAN (Density-Based Spatial Clustering of Application with \n% Noise)clustering algorithm.\n% ----\n% Args:\n%   data: data to be clustered (n * p)\n%   eps: distance threshold for finding neighbors\n%   minPts: minimum required number of neighbor observations for one core object\n% ----\n% Returns:\n%   label: corresponding class for each observation\n\n% Initialization\ncore_object = [];\ncount = 1;\nk = 1; % label index\nvmask = ones(size(data, 1), 1); % variable used to record whether one observation has been visited (1: not visited, 0: visited)\nlabel = zeros(size(data, 1), 1); % pre-allocate result\n\n% Find core objects\nfor i = 1:size(data, 1)\n    x = data(i, :); % current observation of interests\n    [~, neighbors] = Find_Neighbor(data, x, eps);\n    \n    % Check if the number of observations in neighbors of x is larger than minPts \n    if((size(neighbors,1)-1) >= minPts)\n        \n        % Add the index of x to the set of core object\n        core_object(count, 1) = i;\n        count = count + 1;\n    end\nend\n\nfprintf('---- DBSCAN finds a total number of %i core objects ----\\n', size(core_object, 1));\n\nwhile(~isempty(core_object))\n    \n    % Construct one queue for further use \n    queue = [];\n    qcount = 1;\n    \n    % Update core_object, observations have been visited should be deleted\n    tcount = 1;\n    list = [];\n    for i = 1:size(core_object, 1)\n        if(vmask(core_object(i, 1),1) == 0)\n            list(tcount ,1) = i;\n            tcount = tcount + 1;\n        end\n    end\n    core_object(list,:) = [];\n    \n    if(isempty(core_object))\n        break;\n    end\n    \n    % Randomly choose one core object\n    index = core_object(randi(size(core_object, 1)), 1);\n    queue(qcount, 1) = index; % add the selected core object to the queue\n    qcount = qcount + 1;\n    vmask(index, 1) = 0; % update vmask\n    label(index, 1) = k; % assign result \n    core_object(core_object == index, :) = []; % remove the selected core object from the set\n    \n    while(~isempty(queue))\n        pivot = queue(1, 1); \n        queue(1, :) = []; % remove the first element in queue\n        qcount = qcount - 1;\n        \n        % Find neighbors for current observation of interests \n        [tindex, tneighbors] = Find_Neighbor(data, data(pivot, :), eps);\n        if(size(tneighbors, 1) >= minPts)\n            for i = 1 : size(tindex, 1)\n                % If one neighbor has not been visited, add it to the queue\n                if(vmask(tindex(i, 1),1) == 1)\n                    queue(qcount, 1) = tindex(i, 1);\n                    qcount = qcount + 1;\n                    vmask(tindex(i, 1),1) = 0; % update vmask\n                    label(tindex(i, 1),1) = k; % assign result\n                end\n            end\n        end   \n    end\n    \n    fprintf('---- Finish finding observations for class %i ----\\n', k);\n    k = k + 1; % next class\nend\nend\n\nfunction d = Eculidean_Distance(x1, x2)\n% Calculate eculidean distance between x1 and x2.\n%\n% Args:\n%   x1: observation 1\n%   x2: observation 2\n%\n% Returns:\n%   d: Eculidean distance between x1 and x2\n\nd = sqrt((x1 - x2) * (x1 - x2)');\nend\n\nfunction [index, neighbors] = Find_Neighbor(data, x, eps)\n% Find neighbors for x, where neighbors are defined to be observations in data\n% with eculidean distance from x smaller than epsilon.\n%\n% Args:\n%   data: dataset\n%   x: current observation of interests\n%   eps: pre-defined distance threshold\n%\n% Returns:\n%   index: the index of these neighbors in data\n%   neighbors: neighbor set of x\n\nneighbors = []; % pre-allocate neighbor result\ncount = 1;\nfor i = 1 : size(data,1)\n    d = Eculidean_Distance(data(i,:), x);\n    if(d <= eps)\n        index(count, 1) = i;\n        neighbors(count,:) = data(i,:);\n        count = count + 1;\n    end\nend\nend\n\n\n"
  },
  {
    "path": "01_MATLAB/lib/Entropy_Weighting_Subspace_Kmeans.m",
    "content": "function [centroid, dimension_weight, class] = Entropy_Weighting_Subspace_Kmeans(data, iteration, K, beta, lambda, verbose)\n\n% Pre-allocate weights\ncentroid = zeros(K,size(data,2)); % centroid for each class\nclass = zeros(size(data,1),1); % classification result for each observation\ndimension_weight = ones(K,size(data,2)); % weights for each dimension in each class\n\n% Initialization\nn = size(data,1);\nJ = 0; % used to record objective function value\n\n% First round\ncentroid = data(unidrnd(n,K,1),:); % randomly choose K initial centroids \ndimension_weight = 1/size(data,2) * dimension_weight; % initialize weights for each dimension using uniform distribution\n\n% Partially optimization\nfor i = 1:iteration\n    \n    J0 = J;\n    \n    % body part\n    class = classify(centroid,dimension_weight,data);\n    centroid = centroid_update(centroid,data,class);\n    [dimension_weight,J] = dimension_weight_update(K,centroid,class,dimension_weight,data,beta,lambda);\n    \n    % whether display intermediate information\n    if(verbose == 1)\n        disp(['Objective Function(J) Value: ',num2str(J)]);\n    end\n    \n    % early stop condition\n    if(abs(J-J0)<1e-9)\n        fprintf('*** Clustering terminates after %i iterations ***\\n',i);\n        break;\n    end\nend\nend\n\n% Details on the scheme of updating dimension weights\nfunction [alpha,J] = dimension_weight_update(K,m,c,alpha,data,beta)\n\n  % Under writting...\n  \nend\n\nfunction [result] = classify(m,alpha,data)\nresult = zeros(size(data,1),1);\n% Construct temporary matrix for efficiently computing dimention-weighted distance\nmatrix = zeros(size(m,1),size(data,2));\nfor i = 1:size(result,1)\n    for j = 1:size(m,1)\n        matrix(j,:) = (m(j,:)-data(i,:)) .* (m(j,:)-data(i,:));\n    end\n    temp = sum(alpha .* matrix,2);\n    % To avoid more than one class having the minimum distance.\n    t_index = find(temp == min(temp));\n    result(i,1) = t_index(1,1);\nend\nend\n\nfunction [m] = centroid_update(m,data,c)\nfor i = 1:size(m,1)\n    if(~isempty(data(c==i,:)))\n        m(i,:) = mean(data(c==i,:),1);\n    else\n        continue;\n    end\nend\nend\n\n\n\n\n"
  },
  {
    "path": "01_MATLAB/lib/Gaussian_Mixture.m",
    "content": "function [label, alpha, miu, sigma] = Gaussian_Mixture(data, k, iter)\n% function [label, alpha, miu, sigma] = Gaussian_Mixture(data, k)\n%   Use gaussian mixture model (GMM) to conduct data clustering. GMM uses\n% probability model to characterize prototypes for each class.\n% ----\n% Args:\n%   data: data to be clustered (n * p)\n%   k: the number of guassian components (scalar)\n%   iter: maximum number of iterations (scalar)\n% ----\n% Returns:\n%   label: corresponding class for each observation (n * 1)\n%   alpha: mixing coefficient for each gaussian component (k * 1) && (sum(alpha) == 1)\n%   miu: mean value for each gaussian component (k * p)\n%   sigma: coefficient matrix for each gaussian component (cell: k * n * n)\n\n% Initialization\nalpha = ones(k, 1) / k;\nmiu = data(randperm(size(data,1),k)',:);\nfor i = 1 : k\n    sigma{i, 1} = rand * eye(size(data, 2));\nend\nlabel = zeros(size(data, 1), 1);\n\np = Posteriori(data, k, alpha, miu, sigma); % calculate posteriori probability\n\nfor i = 1 : iter\n    % M-Step\n    for j = 1 : k\n        sump = sum(p(:, j));\n        % Update parameters\n        tmiu = zeros(1, size(data, 2));\n        for num = 1 : size(data, 1)\n            tmiu = tmiu + p(num, j) * data(num, :);\n        end\n        miu(j, :) = tmiu / sump;\n        \n        tsigma = zeros(size(data, 2));\n        for num = 1 : size(data, 1)\n            tsigma  = tsigma + p(num, j) * (data(num, :) - miu(j, :))' * (data(num, :) - miu(j, :));\n        end\n        sigma{j, 1} = tsigma / sump;\n        \n        alpha(j, 1) = sump / size(data, 1); % mixing coefficient\n    end\n    % E-Step\n    p = Posteriori(data, k, alpha, miu, sigma);\nend\n[~, label] = max(p,[], 2); % classification\nend\n\nfunction p = Posteriori(data, k, alpha, miu, sigma)\n% function p = Posteriori(data, alpha, miu, sigma)\n%   Calculate posteriori probability for each observation and each class. The\n% output p is of the size n * p, the entry (i,j) represents the probability\n% that observation i belongs to class j.\n% ----\n% Args:\n%   data, k, alpha, miu, sigma: same to the function Gaussian_Mixture\n% ----\n% Returns:\n%   p: posteriori probability for each observation and each class (n * k)\n\n% Pre-allocate result\np = zeros(size(data, 1), k);\n\nfor i = 1 : size(data, 1)\n    sump = 0; % normalizing factor \n    for j = 1 : k\n        tx = data(i, :) - miu(k, :); % x - miu\n        sigma{j,1} = sigma{j,1} + 1e-6*eye(size(data,2)); % for numerical stability\n        inv_sigma = inv(sigma{j, 1});\n        upper = -0.5 * tx * inv_sigma * tx';\n        p(i, j) = alpha(j, 1) * exp(upper) / sqrt((2*pi)^(size(data,2))*abs(det(sigma{j,1})));\n        sump = sump + p(i, j);\n    end\n    p(i, :) = p(i, :) / sump;\nend\nend\n\n"
  },
  {
    "path": "01_MATLAB/lib/ISODATA.m",
    "content": "function [centroid, result] = ISODATA(data, iteration, desired_k, minimum_n, maximum_variance, minimum_d)\n\n% Pre-allocate result\ncentroid = data(randperm(size(data,1),desired_k)', :);\ndistance_matrix = zeros(size(data,1), desired_k);\nresult = zeros(size(data,1),1);\n\nfor i = 1 : iteration\n    previous_centroid = centroid;\n    for j = 1 : size(distance_matrix,1)\n        for k = 1 : size(distance_matrix,2)\n            distance_matrix(j,k) = sqrt(sum((data(j,:)-centroid(k,:)) .^ 2));\n        end\n    end\n    [~,result] = min(distance_matrix,[],2);\n    \n    % Whether the number of points in each class is smaller than minimum_n\n    for j = 1 : size(centroid, 1)\n       if(isempty(find(result == j,1)) || (size(find(result == j),1) < minimum_n))\n           \n           % One class with number of points in it less than minimum_n\n           % should be deleted, along with records in the distance_matrix\n           centroid(j,:) = [];\n           distance_matrix(:,j) = [];\n           \n           % Re-assign each point to its closet neighbor class\n           [~,result] = min(distance_matrix,[],2);\n           \n           % Recalculate centroids\n           for k = 1:size(centroid,1)\n               centroid(k,:) = mean(data(result(:,1) == k,:));\n           end\n       end \n    end\n    \n    % Check if combining and splitting are needed\n    % Case 1: too few classes\n    if(size(centroid,1) <= (desired_k/2)) \n        % Split\n        [centroid] = ISODATA_split(data, centroid, result, minimum_n, maximum_variance);\n    \n    % Case 2: too many classes\n    elseif(size(centroid,1) > (2*desired_k)) \n        % Combine\n        [centroid] = ISODATA_combine(centroid, result, minimum_d);\n        \n    end\n    \n    if(previous_centroid == centroid)\n        fprintf('Clustering over after %i iterations...\\n', i);\n        break;\n    end\nend\nend\n\n% Splitting\nfunction [centroid] = ISODATA_split(data, centroid, current_result, minimum_n, maximum_variance)\n\n[centroid_x, centroid_y] = size(centroid);\n\nvariance_matrix = zeros(centroid_x, centroid_y); % pre-allocate the variance matrix\n\nfor i = 1 : centroid_x\n    for j = 1 : centroid_y\n        variance_matrix(i,j) = var(data(current_result == i,j));\n    end\nend\n\nclass_variance = max(variance_matrix,[],2); % find the greatest one-dimension variance per class \n\nfor i = 1 : centroid_x\n    if((class_variance(i,1) > maximum_variance) && size(find(current_result == i),1) > (2*minimum_n))\n        \n        % The current class should be splitted into two different classes\n        centroid(i,:) = centroid(i,:) + sqrt(maximum_variance);\n        centroid(end+1,:) = centroid(i,:) - sqrt(maximum_variance); % add one new class to centroid set\n    end\nend\nend\n\n% Combining\nfunction [centroid] = ISODATA_combine(centroid, current_result, minimum_d)\ncentroid_x = size(centroid,1);\nclass_distance_matrix = zeros(centroid_x, centroid_x);\n\n% Calculate distances between two different classes\nfor i = 1 : x\n    for j = 1 : x\n        if(i ~= j)\n            class_distance_matrix(i,j) = sqrt(sum((centroid(i,:)-centroid(j,:)) .^ 2));\n        end\n    end\nend\n\n% Combining two classes\nfor i = 1 : x\n    for j = 1 : x\n        if((i ~= j) && (class_distance_matrix(i,j) <  minimum_d))\n            n1 = size(find(current_result == i),1);\n            n2 = size(find(current_result == j),1);\n            centroid(i,:) = (1/(n1+n2)) * (n1 * centroid(i,:) + n2 * centroid(j,:));\n            centroid(j,:) = [];\n            break; % the number of combining operation is limited to 1 within each iteration\n        end\n    end\nend\n\nend\n\n"
  },
  {
    "path": "01_MATLAB/lib/Kmeans.m",
    "content": "function [centroid, class] = Kmeans(data, k, iteration)\n% Main part of Kmeans clustering algorithm.\n%\n% Args:\n%   data: data to be clustered (n * p)\n%   k: the number of classes\n%   iteration: maximum number of iterations\n%\n% Returns:\n%   centroid: clustering centroids for all classes\n%   class: corresponding class for all samples\n\n% Choose k initial centroids randomly\ncentroid = data(randperm(size(data,1),k)', :);\n\n% Record distances between samples and centroids\ndistance_matrix = zeros(size(data,1), k);\n\n% Pre-allocate result\nclass = zeros(size(data,1),1);\n\nfor i = 1:iteration\n    \n    previous_result = class; % for early termination\n    \n    % Calculate eculidean distance between each sample and each centroid\n    for j = 1:size(distance_matrix,1)\n        for k = 1:size(distance_matrix,2)\n            distance_matrix(j,k) = sqrt((data(j,:)-centroid(k,:)) * (data(j,:)-centroid(k,:))');\n        end\n    end\n    \n    % Assign each sample to the nearest controid\n    [~,class] = min(distance_matrix,[],2);\n    \n    % Recalculate centroids\n    for j = 1:k\n        centroid(j,:) = mean(data(class(:,1) == j,:));\n    end\n    \n    % Display\n    fprintf('---- %ith iteration completed ----\\n',i);\n    \n    % If classified results on all points do not change after an iteration, \n    % the clustering process will quit immediately.\n    if(class == previous_result)\n        fprintf('**** Clustering over after %i iterations ****\\n',i);\n        break;\n    end\nend\nend\n"
  },
  {
    "path": "01_MATLAB/lib/Kmeanspp.m",
    "content": "function [centroid, class] = Kmeanspp(data, k, iteration)\n% Main part of Kmeans clustering algorithm.\n%\n% Args:\n%   data: data to be clustered (n * p)\n%   k: the number of classes\n%   iteration: maximum number of iterations\n%\n% Returns:\n%   centroid: clustering centroids for all classes\n%   class: corresponding class for all samples\n\n% Choose the first inital centroid randomly\ncentroid = data(randperm(size(data,1),1)',:);\n\n% Select remaining initial centroids (a total number of k-1)\nfor i = 2:k\n    distance_matrix = zeros(size(data,1),i-1);\n    for j = 1:size(distance_matrix,1)\n        for p = 1:size(distance_matrix,2)\n            distance_matrix(j,p) = sum((data(j,:)-centroid(p,:)) .^ 2);\n        end\n    end\n    % Choose next centroid according to distances between points and\n    % previous cluster centroids.\n    index = Roulettemethod(distance_matrix);\n    centroid(i,:) = data(index,:);\n    clear distance_matrix;\nend\n\n% Following steps are same to kmeans\nclass = zeros(size(data,1),1);\ndistance_matrix = zeros(size(data,1), k);\n\nfor i = 1:iteration\n    \n    previous_result = class; % for early termination\n    \n    % Calculate eculidean distance between each sample and each centroid\n    for j = 1:size(distance_matrix,1)\n        for k = 1:size(distance_matrix,2)\n            distance_matrix(j,k) = sqrt((data(j,:)-centroid(k,:)) * (data(j,:)-centroid(k,:))');\n        end\n    end\n    \n    % Assign each sample to the nearest controid\n    [~,class] = min(distance_matrix,[],2);\n    \n    % Recalculate centroids\n    for j = 1:k\n        centroid(j,:) = mean(data(class(:,1) == j,:));\n    end\n    \n    % Display\n    fprintf('---- %ith iteration completed---- \\n',i);\n    \n    % If classified results on all points do not change after an iteration, \n    % the clustering process will quit immediately.\n    if(class == previous_result)\n        fprintf('**** Clustering over after %i iterations ****\\n',i);\n        break;\n    end\nend\nend\n\nfunction [index] = Roulettemethod(distance_matrix)\n\n% Find shortest distance between one sample and its closest cluster centroid\n[min_distance,~] = min(distance_matrix,[],2);\n\n% Normalize for further operations\nmin_distance = min_distance ./ sum(min_distance);\n\n% Construct roulette according to min_distance\ntemp_roulette = zeros(size(distance_matrix,1),1);\nfor i = 1:size(distance_matrix,1)\n    temp_roulette(i,1) = sum(min_distance(1:i,:));\nend\n\n% Generate a random number for selection\ntemp_rand = rand();\n\n% Find the corresponding index\nfor i = 1:size(temp_roulette,1)\n    if((i == 1) && temp_roulette(i,1) > temp_rand)\n        index = 1;\n    elseif((temp_roulette(i,1) > temp_rand) && (temp_roulette(i-1,1) < temp_rand))\n        index = i;\n    end\nend\nend\n"
  },
  {
    "path": "01_MATLAB/lib/LVQ.m",
    "content": "function [centroid, label] = LVQ(data, q, neta, x, y, iter)\n% function [centroid, label] = LVQ(data, q, x, y)\n%   Unlike Kmeans, LVQ (Learning Vector Quantization) use labelled data \n% <x,y> to help clustering.After using LVQ, the feature space is split into\n% a voronoi mesh.\n% ----\n% Args:\n%   data: data to be clustered (n * p)\n%   q: the number of prototypes (scalar)\n%   neta: learning rate\n%   x: training data (? * p, '?' is the size of training data)\n%   y: label of training data (? * 1)\n%   iter: maximum number of iterations (scalar)\n% ----\n%   centroid: clustering centroids (q * p)\n%   label: corresponding class for each observation (n * 1)\n\n% Initialization\ncentroid = x(randperm(size(x,1),q)', :); % randomly select q observations as initial prototypes\nlabel = zeros(size(data, 1), 1);\n\nfor i = 1 : iter\n    \n    s = randperm(size(x,1),1); % ramdomly select one training sample\n    tx = x(s, :); \n    \n    % Calculate the distance between tx and all prototypes\n    distance = zeros(q, 1);\n    for j = 1 : q\n        distance(j, 1) = Eculidean_Distance(tx, centroid(j, :));\n    end\n    [~, index] = min(distance); % find the index of the nearest prototype\n    \n    % Update the prototype\n    if(index == y(s, 1))\n        centroid(index, :) = centroid(index, :) + neta * (tx - centroid(index, :));\n    else\n        centroid(index, :) = centroid(index, :) - neta * (tx - centroid(index, :));\n    end\nend\n\n% Classification\nfor i = 1 : size(data, 1)\n    tx = data(i, :);\n    distance = zeros(q, 1);\n    for j = 1 : q\n        distance(j, 1) = Eculidean_Distance(tx, centroid(j, :));\n    end\n    [~, index] = min(distance); % find the index of the nearest prototype\n    label(i, 1) = index;\nend\nend\n\nfunction d = Eculidean_Distance(x1, x2)\n% Calculate eculidean distance between x1 and x2.\n%\n% Args:\n%   x1: observation 1\n%   x2: observation 2\n%\n% Returns:\n%   d: Eculidean distance between x1 and x2\n\nd = sqrt((x1 - x2) * (x1 - x2)');\nend\n\n"
  },
  {
    "path": "01_MATLAB/lib/Mean_Shift.m",
    "content": "function [centroid, result] = Mean_Shift(data, thr)\n% Main part of mean shift clustering algorithm.\n%\n% Args:\n%   data: data to be clustered (n * p)\n%   thr: distance threshold used to find neighbors\n%\n% Returns:\n%   centroids: clustering centroids for all classes\n%   result: corresponding class for each data point\n%\n% Comment:\n%    Note that there is no need to specify the number of classes in mean\n%  shift. In this function , I first record the destination point after\n%  shifting for each data point. Data points with same destination point\n%  are considered to be in the same class.\n\ndestination = zeros(size(data)); % variable used to record destination points\nresult = zeros(size(data,1),1); % pre-allocate classifying result\n\n% Conduct shift for each data point\nfor i = 1 : size(data,1)\n    x = data(i, :); % current point of interests\n    mv_new = x;\n    mv_old = x * 10;\n    \n    while(Eculidean_Distance(mv_new, mv_old) ~= 0)\n        mv_old = mv_new;\n        neighbors = Find_Neighbor(data, x, thr);\n        mv_new = Mean_Vector(neighbors, x, thr, '0/1'); % other weighting mechanisms are under writing\n    end\n    \n    destination(i, :) = mv_new;\n    \n    % display\n    fprintf('Shifting for %ith point finishes\\n', i);\nend\n\ncentroid = unique(destination, 'rows');\n\n% Calssification\nfor i = 1 : size(centroid,1)\n    mask = destination == centroid(i,:); % logical index\n    mask = mask(:,1);\n    result(mask, 1) = i;\nend\n\n% Display\nfprintf('Clustering over, a total number of %i classes\\n', size(centroid,1));\n\nend\n\nfunction d = Eculidean_Distance(x1, x2)\n% Calculate eculidean distance between x1 and x2.\n%\n% Args:\n%   x1: point1\n%   x2: point2\n%\n% Returns:\n%   d: Eculidean distance between x1 and x2\n\nd = sqrt((x1 - x2) * (x1 - x2)');\nend\n\nfunction mv = Mean_Vector(neighbors, x, thr, method)\n% Use neighbor set to calculate the mean vector for x.\n%\n% Args:\n%   neighbors: neighbor set of x\n%   x: current point of interests\n%   thr: distance threshold. In this case, also standrad deviation of Gaussean kernal \n%   method: weighting mechanism ('0/1' or 'Gaussian')\n%\n% Returns:\n%   mv: mean vector of x\n\nflag = 1; % method index\n\n% Check designated weighting machanism\nif(strcmp(method, '0/1'))\n    flag = 0;\nelseif(strcmp(method, 'Gaussian') || strcmp(method, 'gaussian'))\n    flag = 1;\nelse\n    fprintf('Unknown method, use default Gaussian weighting mechanism\\n')\nend\n\nmv = zeros(1, size(x,2)); % pre-allocate result\n\n% Calculate mean vector\nif(flag == 0)\n    mv = mean(neighbors, 1);\nelseif(flag == 1)\n    denominator = 0;\n    for i = 1 : size(neighbors,1)\n        weight = exp(-(Eculidean_Distance(neighbors(i,:), x)^2) / (2*thr^2));\n        denominator = denominator + weight;\n        mv = mv + weight * neighbors(i, :);\n    end\n    mv = mv / denominator;\nend\nend\n\nfunction neighbors = Find_Neighbor(data, x, thr)\n% Find neighbors for x, where neighbors are defined to be points in data\n% with eculidean distance from x smaller than thr.\n% \n% Args:\n%   data: all data points\n%   x: current point of interests\n%   thr: pre-defined distance threshold\n%\n% Returns:\n%   neighbors: neighbor set of x\n\nneighbors = []; % pre-allocate neighbor result\ncount = 1;\nfor i = 1 : size(data,1)\n    d = Eculidean_Distance(data(i,:), x);\n    if(d <= thr)\n        neighbors(count,:) = data(i,:);\n        count = count + 1;\n    end\nend\nend\n\n\n"
  },
  {
    "path": "01_MATLAB/lib/Subspace_Kmeans.m",
    "content": "function [centroid, dimension_weight, class] = Subspace_Kmeans(data, iteration, K, beta, verbose)\n\n% Pre-allocate weights\ncentroid = zeros(K,size(data,2)); % centroid for each class\nclass = zeros(size(data,1),1); % classification result for each observation\ndimension_weight = ones(K,size(data,2)); % weights for each dimension in each class\n\n% Initialization\nn = size(data,1);\nJ = 0; % used to record objective function value\n\n% First round\ncentroid = data(unidrnd(n,K,1),:); % randomly choose K initial centroids \ndimension_weight = 1/size(data,2) * dimension_weight; % initialize weights for each dimension using uniform distribution\n\n% Partially optimization\nfor i = 1:iteration\n    \n    J0 = J;\n    \n    % body part\n    class = classify(centroid,dimension_weight,data);\n    centroid = centroid_update(centroid,data,class);\n    [dimension_weight,J] = dimension_weight_update(K,centroid,class,dimension_weight,data,beta);\n    \n    % whether display intermediate information\n    if(verbose == 1)\n        disp(['Objective Function(J) Value: ',num2str(J)]);\n    end\n    \n    % early stop condition\n    if(abs(J-J0)<1e-9)\n        fprintf('*** Clustering terminates after %i iterations ***\\n',i);\n        break;\n    end\nend\nend\n\n% Details on the scheme of updating dimension weights\nfunction [alpha,J] = dimension_weight_update(K,m,c,alpha,data,beta)\nall_matrix = zeros(size(data,1),size(data,2));\nfor i = 1:size(data,1)\n    all_matrix(i,:) = (m(c(i,1),:)-data(i,:)) .* (m(c(i,1),:)-data(i,:));\nend\nJ = 0;\n\nfor i = 1:K\n    class_matrix = all_matrix(c==i,:); % pick out data in all_matrix that corresponds to class i\n    t_sum = sum(class_matrix,1) + 1e-9; % adding a small positive constant to make weights computatable\n    J = J + (alpha(i,:).^beta) * t_sum';\n    if(size(class_matrix,1)>0)\n        for j = 1:size(alpha,2)  \n            % variables used to avoid redundant calculation\n            tt_numerator = t_sum(1,j);\n            t_denominator = sum(tt_numerator./t_sum,2);\n            alpha(i,j) = 1/((t_denominator+1e-9)^(1/(beta-1)));\n        end\n    else\n        continue;\n    end\nend\n\n% Normalize\nfor i = 1:size(alpha,1)\n    alpha(i,:) = alpha(i,:)./(sum(alpha(i,:),2));\nend\n\nend\n\nfunction [result] = classify(m,alpha,data)\n\nresult = zeros(size(data,1),1);\n\n% Construct temporary matrix for efficiently computing dimention-weighted distance\nmatrix = zeros(size(m,1),size(data,2));\n\nfor i = 1:size(result,1)\n    for j = 1:size(m,1)\n        matrix(j,:) = (m(j,:)-data(i,:)) .* (m(j,:)-data(i,:));\n    end\n    temp = sum(alpha .* matrix,2);\n    \n    % To avoid more than one class having the minimum distance.\n    t_index = find(temp == min(temp));\n    result(i,1) = t_index(1,1);\nend\nend\n\nfunction [m] = centroid_update(m,data,c)\nfor i = 1:size(m,1)\n    if(~isempty(data(c==i,:)))\n        m(i,:) = mean(data(c==i,:),1);\n    else\n        continue;\n    end\nend\nend\n\n\n\n\n"
  },
  {
    "path": "01_MATLAB/tool/GenerateDataset.m",
    "content": "function dataset = GenerateDataset(n, p, k, pd, varargin)\n% dataset = GenerateDataset(n, p, k, pd, varargin)\n%   Generate synthetic dataset for further use.\n% ----\n% Args:\n%   n: the number of samples in each class (scalar)\n%   p: the number of features (scalar)\n%   k: the number of classes (scalar)\n%   pd: probability distribution of generated data (string)\n%   varargin: parameters on p \n% ----\n% Returns:\n%   dataset: generated dataset\n\n% Pre-allocate dataset to avoid memory overflow\ndataset = zeros(n * k, p);\n\n% Generate dataset from gaussian distribution\nif((strcmp(pd, 'Gaussian')) || strcmp(pd, 'gaussian'))\n    \n    % Get parameters on gaussian distribution\n    mu = varargin{1, 1}; % (k * p)\n    sigma = varargin{1, 2}; % (k * p)\n    \n    for i = 1 : k\n        dataset(n*(i-1)+1:n*i, :) = mvnrnd(mu(i,:), sigma(i,:), n);\n    end   \nend\n\n% Random permutation\ndataset = dataset(randperm(size(dataset, 1)), :);\n\nend\n\n"
  },
  {
    "path": "01_MATLAB/tool/PlotData.m",
    "content": "function PlotData(data, label, varargin)\n% PlotData(data, label, varargin)\n%   Plot data, with different classes correspond to different colors.\n% ----\n% Args:\n%   data: original data (n * p)\n%   label: clustering result (n * 1), '-1' in label corresponds to noisy data\n%   varargin{1,1}: clustering centroid (k * p), k the number of classes\n%   varargin{1,...}: other parameters\n% ----\n% Returns: <None>\n\nisc = 0; % whether plot centroid\nk = max(label); % the number of classes\np = size(data ,2); % the number of features\n\nif(~isempty(varargin))\n    isc = 1;\n    centroid = varargin{1, 1};\nend\n\nif((p > 3) || (p < 1))\n    error('Unable to plot data exceeds 3-deminsion');\nend\n\n% Data\nif(p == 2)\n    for i = 1 : k\n        scatter(data(label==i,1), data(label==i,2), 'filled', 'DisplayName', strcat('Class-',num2str(i)));\n        hold on;\n    end\nelseif(p == 3)\n    for i = 1 : k\n        scatter3(data(label==i,1), data(label==i,2), data(label==i,3), 'filled', 'DisplayName', strcat('Class-',num2str(i)));\n        hold on;\n    end\nend\n\n% Centroid\nif(isc == 1)\n    if(p == 2)\n        scatter(centroid(:,1), centroid(:,2), 150, 'd', 'filled', 'DisplayName', 'Centroid');\n    elseif(p == 3)\n        scatter3(centroid(:,1), centroid(:,2), centroid(:,3), 150, 'd', 'filled', 'DisplayName', 'Centroid');\n    end\nend\n\n% Legend\nif(k < 10)\n    legend('show');\nend\n\n% Others\ngrid on;\nend\n\n"
  },
  {
    "path": "02_Python/A_Star.py",
    "content": "#!/usr/bin/env python3\n\n#================================================================================================================\n#----------------------------------------------------------------------------------------------------------------\n#\t\t\t\t\t\t\t\t\tA STAR\n#----------------------------------------------------------------------------------------------------------------\n#================================================================================================================\n\nimport sys\nimport queue\n\n# each Node in the Graph\nclass Node:\n    def __init__(self, key, i, j):\n        # Utility to easily check for presence in openList/ClosedList\n        self.__key = key\n\n        # Priority by which it is inserted to OpenList\n        self.__priority = 0.0\n\n        # Distance Travelled till current node\n        self.__distFromStart = 0\n\n        # set of neighbor nodes\n        self.__neighbors = set()\n\n        # node from which this was visited\n        self.__parent = None\n\n        self.__traversable = False\n\n        # required for calculating heuristic\n        # also used as key in graph.nodes\n        self.__pos = (i, j)\n\n    def addNeighbor(self, node):\n        self.__neighbors.add(node)\n\n    def setTraversability(self, isTraversable):\n        self.__traversable = isTraversable\n\n    def isTraversable(self):\n        return self.__traversable\n\n    def getKey(self):\n        return self.__key\n\n    def getPos(self):\n        return self.__pos\n\n    def setPriority(self, newPriority):\n        self.__priority = newPriority\n\n    def getPriority(self):\n        return self.__priority\n\n    def setParent(self, parent):\n        self.__parent = parent\n\n    def getParent(self):\n        return self.__parent;\n\n    def getDistFromStart(self):\n        return self.__distFromStart\n\n    def setDistFromStart(self, distFromStart):\n        self.__distFromStart = distFromStart\n\n    def getNeighbors(self):\n        return self.__neighbors\n\n    def setKey(self, key):\n        self.__key = key\n\n    # Requred by queue.PriorityQueue's use of heapq for comparing two nodes\n    def __lt__(self, node):\n        return self.__priority < node.getPriority()\n\nclass Graph:\n    def __init__(self):\n        self.__nodes = dict()\n\n    def addNode(self, node):\n        self.__nodes[node.getPos()] = node\n\n    def getNode(self, pos):\n        return self.__nodes.get(pos, None)\n\n    # Add an edge from node1 to node2\n    def addEdge(self, node1, node2):\n        if not (node1 in self.__nodes and node2 in self.__nodes):\n            node1.addNeighbor(node2)\n\nclass Map2D:\n    def __init__(self, filePath):\n        self.__graph = Graph()\n        self.__startNode = None\n        self.__endNode = None\n\n        with open(filePath) as inFile:\n            lines = inFile.readlines()\n\n        self.__dims = (len(lines), len(lines[0])-1)\n        \n        # add Nodes to graph\n        for i in range(len(lines)):\n            nodeLine = list()\n            for j in range(len(lines[i])):\n                #each character is a node\n                char = lines[i][j]\n                if \"\\n\" == char:\n                    continue\n                node = Node(char,i,j)\n                # \"#\" for non traversable nodes\n                if \"#\" == char:\n                    node.setTraversability(False)\n                else:\n                    node.setTraversability(True)\n                    if \"S\" == char:\n                        self.__startNode = node\n                    elif \"E\" == char:\n                        self.__endNode = node\n                self.__graph.addNode(node)\n\n        if self.__startNode == None or self.__endNode == None:\n            sys.exit(\"No start or no end in map\")\n\n        # for each node, for each neighbor, add edge between neighbor and node\n        for i in range(self.__dims[0]):\n            for j in range(self.__dims[1]):\n                currentNode = self.__graph.getNode((i,j))\n                if self.__isValid(i+1,j):\n                    self.__graph.addEdge(currentNode,self.__graph.getNode((i+1,j)))\n                if self.__isValid(i-1,j):\n                    self.__graph.addEdge(currentNode,self.__graph.getNode((i-1,j)))\n                if self.__isValid(i,j+1):\n                    self.__graph.addEdge(currentNode,self.__graph.getNode((i,j+1)))\n                if self.__isValid(i,j-1):\n                    self.__graph.addEdge(currentNode,self.__graph.getNode((i,j-1)))\n\n    def printMap(self):\n        if None == self.__dims:\n            print(\"ERROR: map not initialized\")\n            return\n\n        for i in range(self.__dims[0]):\n            for j in range(self.__dims[1]):\n                print(self.__graph.getNode((i,j)).getKey(), end=\"\")\n            print()\n\n    def __isValid(self, i, j):\n        node = self.__graph.getNode((i,j))\n        # if i,j are valid indices and the node is traversable\n        if node != None and node.isTraversable():\n            return True\n        return False\n\n    def getStart(self):\n        return self.__startNode\n\n    def getEnd(self):\n        return self.__endNode\n\nclass AStar:\n    def __init__(self, inMap):\n        # holds list of nodes from which the next node is chosen\n        self.__openList = queue.PriorityQueue()\n\n        # put start node in openList\n        start = inMap.getStart()\n        start.setDistFromStart(0)\n        start.setPriority(self.__heuristic(start, inMap.getEnd()))\n        start.setParent(None)\n        self.__openList.put((start.getPriority(),start))\n\n        self.__map = inMap\n\n        # list of visited nodes\n        self.__closedList = dict()\n\n    # setting this to return 0, will comvert this to Dijkistra's Algorithm\n    # manhattan distance\n    def __heuristic(self, node, targetNode):\n        i1,j1 = node.getPos()\n        i2,j2 = targetNode.getPos()\n        return abs(i1-i2)+abs(j1-j2)\n\n    def findPath(self):\n        while True:\n            # OL is empty implies, no route, stop\n            if self.__openList.empty():\n                print(\"No route!\")\n                return\n\n            # get highest priority element from OL\n            priority, currentNode = self.__openList.get()\n\n            # if we reached end node, follow parents to get path\n            if currentNode == self.__map.getEnd():\n                # follow parents till startNode\n                while currentNode != self.__map.getStart():\n                    # set \"*\" for visual output\n                    currentNode.setKey(\"*\")\n                    currentNode = currentNode.getParent()\n                currentNode.setKey(\"*\")\n                return\n\n            # unweighted graph should add 1, otherwise replace 1 with edge weight\n            newLevel = currentNode.getDistFromStart() + 1\n\n            # add neighbors to OL\n            for neighbor in currentNode.getNeighbors():\n                # if it has already been visited\n                if self.__closedList.get(neighbor.getPos(), None) != None:\n                    continue\n\n                # if it is in OL but the new path is longer than the already existing one\n                if \"O\" == neighbor.getKey() and newLevel >= neighbor.getDistFromStart():\n                    continue\n\n                # add neighbor to OL\n                neighbor.setKey(\"O\")\n                neighbor.setParent(currentNode)\n                neighbor.setDistFromStart(newLevel)\n                neighbor.setPriority(neighbor.getDistFromStart() + self.__heuristic(neighbor,self.__map.getEnd()))\n                self.__openList.put((neighbor.getPriority(), neighbor))\n            # mark node as visited\n            self.__closedList[currentNode.getPos()] = True\n            currentNode.setKey(\"C\")\n\n            # un-comment following 2 lines to see how algorithm works\n            # self.__map.printMap()\n            # input()\n\n    def getMap(self):\n        return self.__map\n\nif \"__main__\" == __name__:\n    inpMap = Map2D(\"./data/graph.in\")\n    print(\"Initial Map:\")\n    inpMap.printMap()\n    aStar = AStar(inpMap)\n    aStar.findPath()\n    print(\"Map with route(*), unvisited nodes(-/O/#), visited nodes(C)\")\n    aStar.getMap().printMap()"
  },
  {
    "path": "02_Python/Collaborative_Filtering.py",
    "content": "from math import sqrt\n\n data = {\n \t\t\t\"Manish\": {\n \t\t\t\t\t\t\"Interstellar\": 4,\n \t\t\t\t\t\t\"The Dark Knight\": 5,\n \t\t\t\t\t\t\"Wanted\": 3,\n \t\t\t\t\t\t\"Sucker Punch\": 2,\n \t\t\t\t\t\t\"Inception\": 5,\n \t\t\t\t\t\t\"The Conjuring\": 3,\n \t\t\t\t\t\t\"21 Jump Street\": 4,\n \t\t\t\t\t\t\"The Prestige\": 5\n  \t\t\t\t\t},\n  \t\t\t\"Madhu\": {\n  \t\t\t\t\t\t\"Interstellar\": 5,\n \t\t\t\t\t\t\"The Dark Knight\": 5,\n \t\t\t\t\t\t\"Wanted\": 1,\n \t\t\t\t\t\t\"Devil\": 3,\n \t\t\t\t\t\t\"The Conjuring\": 1,\n \t\t\t\t\t\t\"21 Jump Street\": 4,\n \t\t\t\t\t\t\"Men in Black\": 2\n\n  \t\t\t\t\t},\n  \t\t\t\"Mansukh\": {\n  \t\t\t\t\t\t\"Hot Tub Time Machine\": 1,\n  \t\t\t\t\t\t\"Inception\": 5,\n  \t\t\t\t\t\t\"Revenant\": 3,\n  \t\t\t\t\t\t\"Avengers 1\": 4,\n  \t\t\t\t\t\t\"Iron Man 2\": 3,\n  \t\t\t\t\t\t\"Batman v Superman\": 5,\n  \t\t\t\t\t\t\"Wanted\": 4,\n\n  \t\t\t\t\t},\n  \t\t\t\"Imran\": {\n  \t\t\t\t\t\t\"Inception\": 5,\n\n  \t\t\t\t\t},\n  \t\t\t\"Kumar\": {\n  \t\t\t\t\t\t\"Hot Tub Time Machine\": 1,\n  \t\t\t\t\t\t\"Avengers 1\": 4,\n  \t\t\t\t\t\t\"Avengers 2\": 3,\n  \t\t\t\t\t\t\"The Departed\": 5,\n  \t\t\t\t\t\t\"Interstellar\": 4,\n  \t\t\t\t\t\t\"Fight Club\": 5,\n  \t\t\t\t\t\t\"Vampires Suck\": 1,\n  \t\t\t\t\t\t\"Twilight\": 1\n  \t\t\t\t\t},\n  \t\t\t\"Tori\": {\n  \t\t\t\t\t\t\"Notebook\": 5,\n  \t\t\t\t\t\t\"The Terminal\": 4,\n  \t\t\t\t\t\t\"Twilight\": 5,\n  \t\t\t\t\t\t\"Inception\": 2,\n  \t\t\t\t\t\t\"The Dark Knight\": 1,\n  \t\t\t\t\t\t\"Hot Tub Time Machine\": 2,\n  \t\t\t\t\t\t\"The Vow\": 4\n  \t\t\t\t\t},\n  \t\t\t\"Jatin\": {\n \t\t\t\t\t\t\"Inception\":5,\n \t\t\t\t\t\t\"The Conjuring\":4\n  \t\t\t\t\t},\n  \t\t\t\"Latha\": {\n  \t\t\t\t\t\t\"Twilight\": 1\n  \t\t\t\t\t}\n  \t\t}\n\n itemNames = [\n \t\t\t\t\"Interstellar\",\n \t\t\t\t\"The Dark Knight\",\n \t\t\t\t\"Wanted\",\n \t\t\t\t\"Sucker Punch\",\n \t\t\t\t\"Inception\",\n \t\t\t\t\"The Conjuring\",\n \t\t\t\t\"21 Jump Street\",\n \t\t\t\t\"The Prestige\",\n \t\t\t\t\"Devil\",\n \t\t\t\t\"Men in Black\",\n \t\t\t\t\"Hot Tub Time Machine\",\n \t\t\t\t\"Revenant\",\n  \t\t\t\t\"Avengers 1\",\n  \t\t\t\t\"Iron Man 2\",\n  \t\t\t\t\"Batman v Superman\",\n  \t\t\t\t\"Avengers 2\",\n  \t\t\t\t\"The Departed\",\n  \t\t\t\t\"Fight Club\",\n  \t\t\t\t\"Vampires Suck\",\n  \t\t\t\t\"Twilight\",\n  \t\t\t\t\"Notebook\",\n  \t\t\t\t\"The Terminal\",\n  \t\t\t\t\"The Vow\",\n  \t\t\t\t\"Focus\"\n \t\t\t]\n\n MAXrating = 5\n MINrating = 1\n\n def compute_similarity(item1,item2,userRatings):\n \taverages = {}\n \tfor (key,ratings) in userRatings.items():\n \t\taverages[key] = (float(sum(ratings.values()))/len(ratings.values()))\n\n \tnum = 0\n \tdem1 = 0\n \tdem2 = 0\n\n \tfor (user,ratings) in userRatings.items():\n \t\tif item1 in ratings and item2 in ratings:\n \t\t\tavg = averages[user]\n \t\t\tnum += (ratings[item1] - avg) * (ratings[item2] - avg)\n \t\t\tdem1 += (ratings[item1] - avg) ** 2\n \t\t\tdem2 += (ratings[item2] - avg) ** 2\n \tif dem1*dem2 == 0:\n \t\treturn 0\n \treturn num / (sqrt(dem1 * dem2))\n\n def build_similarity_matrix(userRatings):\n \tsimilarity_matrix = {}\n\n \tfor i in range(0,len(itemNames)):\n \t\tband = {}\n \t\tfor j in range(0,len(itemNames)):\n \t\t\tif itemNames[i] != itemNames[j]:\n \t\t\t\tband[itemNames[j]] = compute_similarity(itemNames[i],itemNames[j],data)\n \t\tsimilarity_matrix[itemNames[i]] = band\n \treturn similarity_matrix\n\n def normalize(rating):\n \tnum = 2 * (rating - MINrating) - (MAXrating - MINrating)\n \tden = (MAXrating - MINrating)\n \treturn num / den\n\n def denormalize(rating):\n \treturn (((rating + 1) * (MAXrating - MINrating))/2 ) + MINrating\n\n def prediction(username,item):\n \tnum = 0\n \tden = 0\n \tfor band,rating in data[username].items():\n \t\tnum += sm[item][band] * normalize(rating)\n \t\tden += abs(sm[item][band])\n\n \tif den == 0:\n \t\treturn 0\n \treturn denormalize(num/den)\n\n def recommendation(username,userRatings):\n \trecommend = []\n \tfor item in itemNames:\n \t\tif item not in userRatings[username].keys():\n \t\t\tif prediction(username,item) >= 3.5:\n \t\t\t\trecommend.append(item)\n \treturn recommend\n\n sm = build_similarity_matrix(data)\n # for k,i in sm.items():\n # \tprint(k , i)\n print(\"Recommendation for Jatin: \")\n print(recommendation(\"Jatin\",data))\n\n print(\"Recommendation for Latha: \")\n print(recommendation(\"Latha\",data))\n"
  },
  {
    "path": "02_Python/DBSCAN.py",
    "content": "# ================================================================================================================\n# ----------------------------------------------------------------------------------------------------------------\n#\t\t\t\t\t\t\t\t\t            DBSCAN\n# ----------------------------------------------------------------------------------------------------------------\n# ================================================================================================================\n\nimport numpy as np\nfrom sklearn import datasets\nfrom sklearn.preprocessing import StandardScaler\nfrom itertools import cycle, islice\nimport matplotlib.pyplot as plt\nimport queue\nimport pandas as pd\n\n\nclass CustomDBSCAN():\n    def __init__(self):\n        self.core = -1\n        self.border = -2\n\n    # Find all neighbour points at epsilon distance\n    def neighbour_points(self, data, pointId, epsilon):\n        points = []\n        for i in range(len(data)):\n            # Euclidian distance\n            if np.linalg.norm([a_i - b_i for a_i, b_i in zip(data[i], data[pointId])]) <= epsilon:\n                points.append(i)\n        return points\n\n    # Fit the data into the DBSCAN model\n    def fit(self, data, Eps, MinPt):\n        # initialize all points as outliers\n        point_label = [0] * len(data)\n        point_count = []\n\n        # initilize list for core/border points\n        core = []\n        border = []\n\n        # Find the neighbours of each individual point\n        for i in range(len(data)):\n            point_count.append(self.neighbour_points(data, i, Eps))\n\n        # Find all the core points, border points and outliers\n        for i in range(len(point_count)):\n            if (len(point_count[i]) >= MinPt):\n                point_label[i] = self.core\n                core.append(i)\n            else:\n                border.append(i)\n\n        for i in border:\n            for j in point_count[i]:\n                if j in core:\n                    point_label[i] = self.border\n                    break\n\n        # Assign points to a cluster\n\n        cluster = 1\n\n        # Here we use a queue to find all the neighbourhood points of a core point and find the indirectly reachable points\n        # We are essentially performing Breadth First search of all points which are within Epsilon distance for each other\n        for i in range(len(point_label)):\n            q = queue.Queue()\n            if (point_label[i] == self.core):\n                point_label[i] = cluster\n                for x in point_count[i]:\n                    if(point_label[x] == self.core):\n                        q.put(x)\n                        point_label[x] = cluster\n                    elif(point_label[x] == self.border):\n                        point_label[x] = cluster\n                while not q.empty():\n                    neighbors = point_count[q.get()]\n                    for y in neighbors:\n                        if (point_label[y] == self.core):\n                            point_label[y] = cluster\n                            q.put(y)\n                        if (point_label[y] == self.border):\n                            point_label[y] = cluster\n                cluster += 1  # Move on to the next cluster\n\n        return point_label, cluster\n\n    # Visualize the clusters\n    def visualize(self, data, cluster, numberOfClusters):\n        N = len(data)\n\n        colors = np.array(list(islice(cycle(['#FE4A49', '#2AB7CA']), 3)))\n\n        for i in range(numberOfClusters):\n            if (i == 0):\n                # Plot all outliers point as black\n                color = '#000000'\n            else:\n                color = colors[i % len(colors)]\n\n            x, y = [], []\n            for j in range(N):\n                if cluster[j] == i:\n                    x.append(data[j, 0])\n                    y.append(data[j, 1])\n            plt.scatter(x, y, c=color, alpha=1, marker='.')\n        plt.show()\n\n\ndef main():\n\n    # Reading from the data file\n    df = pd.read_csv(\"./data/concentric_circles.csv\")\n\n    dataset = df.astype(float).values.tolist()\n\n    # normalize dataset\n    X = StandardScaler().fit_transform(dataset)\n\n    custom_DBSCAN = CustomDBSCAN()\n    point_labels, clusters = custom_DBSCAN.fit(X, 0.25, 4)\n\n    print(point_labels, clusters)\n\n    custom_DBSCAN.visualize(X, point_labels, clusters)\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "02_Python/Decision_Trees.py",
    "content": "# ================================================================================================================\n# ----------------------------------------------------------------------------------------------------------------\n#\t\t\t\t\t\t\t\t\tDECISION TREES\n# ----------------------------------------------------------------------------------------------------------------\n# ================================================================================================================\nfrom math import log\nimport pandas as pd\nimport random\n\n\nclass CustomDecisionTree():\n    def __init__(self):\n        pass\n\n    def majorityCnt(self, classList):\n        classCount = {}\n        for vote in classList:\n            if vote not in classCount.keys():\n                classCount[vote] = 0\n            classCount[vote] += 1\n        sortedClassCount = sorted(classCount.items(), reverse=True)\n        return sortedClassCount[0][0]\n\n    # for calculting entropy\n    def calcShannonEnt(self, dataSet):\n        numEntries = len(dataSet)\n        labelCounts = {}\n        for featVec in dataSet:\n            currentLabel = featVec[-1]\n            if currentLabel not in labelCounts.keys():\n                labelCounts[currentLabel] = 0\n                labelCounts[currentLabel] += 1\n        shannonEnt = 0.0\n        for key in labelCounts:\n            prob = float(labelCounts[key])/numEntries\n            shannonEnt -= prob * log(prob, 2)\n        return shannonEnt\n\n    def splitDataSet(self, dataSet, axis, value):\n        retDataSet = []\n        for featVec in dataSet:\n            if featVec[axis] == value:\n                reducedFeatVec = featVec[:axis]\n                reducedFeatVec.extend(featVec[axis+1:])\n                retDataSet.append(reducedFeatVec)\n        return retDataSet\n\n    # choosing the best feature to split\n    def chooseBestFeatureToSplit(self, dataSet, labels):\n        numFeatures = len(dataSet[0]) - 1\n        baseEntropy = self.calcShannonEnt(dataSet)\n        bestInfoGain = -1\n        bestFeature = 0\n        for i in range(numFeatures):\n            featList = [example[i] for example in dataSet]\n            uniqueVals = set(featList)\n            newEntropy = 0.0\n            for value in uniqueVals:\n                subDataSet = self.splitDataSet(dataSet, i, value)\n                prob = len(subDataSet)/float(len(dataSet))\n                newEntropy += prob * self.calcShannonEnt(subDataSet)\n            infoGain = baseEntropy - newEntropy\n            print(infoGain, bestInfoGain)\n            if (infoGain > bestInfoGain):\n                bestInfoGain = infoGain\n                bestFeature = i\n\n        print(\"the best feature to split is\", labels[bestFeature])\n        return bestFeature\n\n    # function to build tree recursively\n    def createTree(self, dataSet, labels):\n        classList = [example[-1] for example in dataSet]\n        if len(classList) is 0:\n            return\n\n        if classList.count(classList[0]) == len(classList):\n            return classList[0]\n        if len(dataSet[0]) == 1:\n            return self.majorityCnt(classList)\n        featureVectorList = [row[:len(row)-1] for row in dataSet]\n        bestFeat = self.chooseBestFeatureToSplit(featureVectorList, labels)\n        bestFeatLabel = labels[bestFeat]\n        myTree = {bestFeatLabel: {}}\n        del(labels[bestFeat])\n        featValues = [example[bestFeat] for example in dataSet]\n        uniqueVals = set(featValues)\n        for value in uniqueVals:\n            subLabels = labels[:]\n            myTree[bestFeatLabel][value] = self.createTree(\n                self.splitDataSet(dataSet, bestFeat, value), subLabels)\n        return myTree\n\n\ndef main():\n    df = pd.read_csv(\"./data/test.csv\")  # Reading from the data file\n    # Sex param\n    df.replace('male', 0, inplace=True)\n    df.replace('female', 1, inplace=True)\n\n    # Embarked param\n    df.replace('S', 0, inplace=True)\n    df.replace('C', 1, inplace=True)\n    df.replace('Q', 2, inplace=True)\n    df['embarked'] = df['embarked'].fillna(1)\n    dataset = df.astype(float).values.tolist()\n    labels = ['pclass', 'sex', 'embarked', 'survived']\n\n    # Shuffle the dataset\n    random.shuffle(dataset)  # import random for this\n\n    custom_DTree = CustomDecisionTree()\n    print(custom_DTree.createTree(dataset, labels))\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "02_Python/Dimensionality_Reduction/Dimensionality_Reduction.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<small><small><i>\\n\",\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\",\n    \"</i></small></small>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Dimensionality Reduction\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2021-09-18T15:40:28.921358Z\",\n     \"start_time\": \"2021-09-18T15:40:21.087390Z\"\n    },\n    \"colab\": {\n     \"base_uri\": \"https://localhost:8080/\",\n     \"height\": 104\n    },\n    \"colab_type\": \"code\",\n    \"executionInfo\": {\n     \"elapsed\": 5681,\n     \"status\": \"ok\",\n     \"timestamp\": 1546259198259,\n     \"user\": {\n      \"displayName\": \"Bob Li\",\n      \"photoUrl\": \"\",\n      \"userId\": \"13034580972517925389\"\n     },\n     \"user_tz\": -480\n    },\n    \"id\": \"cb9XEtCKNnh-\",\n    \"outputId\": \"04b24b82-bb55-4e98-b09f-5a32cf27fa3a\"\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Requirement already satisfied: sklearn in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (0.0)\\n\",\n      \"Requirement already satisfied: scikit-learn in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (from sklearn) (0.24.1)\\n\",\n      \"Requirement already satisfied: joblib>=0.11 in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (from scikit-learn->sklearn) (1.0.1)\\n\",\n      \"Requirement already satisfied: scipy>=0.19.1 in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (from scikit-learn->sklearn) (1.6.2)\\n\",\n      \"Requirement already satisfied: numpy>=1.13.3 in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (from scikit-learn->sklearn) (1.20.1)\\n\",\n      \"Requirement already satisfied: threadpoolctl>=2.0.0 in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (from scikit-learn->sklearn) (2.1.0)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!pip install sklearn\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2021-09-18T15:40:29.264130Z\",\n     \"start_time\": \"2021-09-18T15:40:28.924289Z\"\n    },\n    \"colab\": {},\n    \"colab_type\": \"code\",\n    \"id\": \"yr45GEzAOtq6\"\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"import numpy as np\\n\",\n    \"import os\\n\",\n    \"\\n\",\n    \"# making random output stable\\n\",\n    \"np.random.seed(42)\\n\",\n    \"m = 60\\n\",\n    \"w1, w2 = 0.1, 0.3\\n\",\n    \"noise = 0.1\\n\",\n    \"\\n\",\n    \"# Create an array of the given shape \\n\",\n    \"# and populate it with random samples from a uniform distribution over [0, 1).\\n\",\n    \"angles = np.random.rand(m) * 3 * np.pi / 2 - 0.5\\n\",\n    \"# print('angles: {}\\\\nsize of dataset: {}'.format(angles, angles.shape))\\n\",\n    \"\\n\",\n    \"X = np.empty((m, 3))\\n\",\n    \"# print(X)\\n\",\n    \"X[:, 0] = np.cos(angles) + np.sin(angles)/2 + noise * np.random.randn(m) / 2\\n\",\n    \"X[:, 1] = np.sin(angles) * 0.7 + noise * np.random.randn(m) / 2\\n\",\n    \"X[:, 2] = X[:, 0] * w1 + X[:, 1] * w2 + noise * np.random.randn(m)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"ehCixfYWYgBc\"\n   },\n   \"source\": [\n    \"## PCA using Scikit-Learn\\n\",\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\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2021-09-18T15:40:31.663542Z\",\n     \"start_time\": \"2021-09-18T15:40:29.269502Z\"\n    },\n    \"colab\": {},\n    \"colab_type\": \"code\",\n    \"id\": \"d6tMz_zjY_Jz\"\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"pca = PCA(n_components = 0.99)\\n\",\n      \"\\n\",\n      \"First 5 Projection Points:\\n\",\n      \"[[ 0.690074    0.36150744]\\n\",\n      \" [-1.39636097 -0.34497714]\\n\",\n      \" [-1.00728461  0.35025708]\\n\",\n      \" [-0.2736333   0.50516373]\\n\",\n      \" [ 0.91324535 -0.26290852]]\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Principal Components:\\n\",\n      \"[[-0.95250178 -0.24902446 -0.17529172]\\n\",\n      \" [ 0.29267159 -0.9076305  -0.30091563]]\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Explained Variance Ratio:\\n\",\n      \"[0.85406025 0.13622918]\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"from sklearn.decomposition import PCA\\n\",\n    \"\\n\",\n    \"pca = PCA(n_components = 0.99)\\n\",\n    \"\\n\",\n    \"# you have to call 'fit' with appropriate arguments before using transrom method.\\n\",\n    \"# a = pca.fit(X)\\n\",\n    \"# b = pca.transform(X)\\n\",\n    \"# or simply use fit_transform()\\n\",\n    \"\\n\",\n    \"# 2-D\\n\",\n    \"X_decorrelated_DR = pca.fit_transform(X)\\n\",\n    \"X_decorrelated_DR[:] = X_decorrelated_DR[:]*(-1) \\n\",\n    \"\\n\",\n    \"# reconstruct dataset from X_decorrelated_DR\\n\",\n    \"X_reconstructed = pca.inverse_transform(X_decorrelated_DR)\\n\",\n    \"\\n\",\n    \"print(\\\"pca = PCA(n_components = 0.99)\\\\n\\\")\\n\",\n    \"print(\\\"First 5 Projection Points:\\\\n{}\\\\n\\\\n\\\".format(X_decorrelated_DR[:5]))\\n\",\n    \"print(\\\"Principal Components:\\\\n{}\\\\n\\\\n\\\".format(pca.components_))\\n\",\n    \"print(\\\"Explained Variance Ratio:\\\\n{}\\\\n\\\".format(pca.explained_variance_ratio_))\\n\",\n    \"# print('reconstructed dataset:\\\\n{}\\\\n'.format(X_reconstructed))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"YPJErcHIfeWp\"\n   },\n   \"source\": [\n    \"***We can visibly tell that we can reduce our dimensions from 3 to 2 while preserving 99% of the variance***\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2021-09-18T15:40:31.711397Z\",\n     \"start_time\": \"2021-09-18T15:40:31.674284Z\"\n    },\n    \"colab\": {\n     \"base_uri\": \"https://localhost:8080/\",\n     \"height\": 252\n    },\n    \"colab_type\": \"code\",\n    \"executionInfo\": {\n     \"elapsed\": 684,\n     \"status\": \"ok\",\n     \"timestamp\": 1546322325444,\n     \"user\": {\n      \"displayName\": \"Bob Li\",\n      \"photoUrl\": \"\",\n      \"userId\": \"13034580972517925389\"\n     },\n     \"user_tz\": -480\n    },\n    \"id\": \"_jJIoUzlf6oa\",\n    \"outputId\": \"45ed6c46-eb02-4d40-e324-eee30b51620f\"\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"pca = PCA(n_components = 0.999)\\n\",\n      \"\\n\",\n      \"First 5 Projection Points:\\n\",\n      \"[[-0.690074   -0.36150744  0.05176509]\\n\",\n      \" [ 1.39636097  0.34497714  0.04887253]\\n\",\n      \" [ 1.00728461 -0.35025708  0.04753837]\\n\",\n      \" [ 0.2736333  -0.50516373  0.13786693]\\n\",\n      \" [-0.91324535  0.26290852 -0.03027986]]\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Principal Components:\\n\",\n      \"[[-0.95250178 -0.24902446 -0.17529172]\\n\",\n      \" [ 0.29267159 -0.9076305  -0.30091563]\\n\",\n      \" [-0.08416476 -0.33792558  0.93740205]]\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Explained Variance Ratio:\\n\",\n      \"[0.85406025 0.13622918 0.00971057]\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# preserving 99.9% of the variance\\n\",\n    \"pca = PCA(n_components = 0.999)\\n\",\n    \"\\n\",\n    \"# 3-D\\n\",\n    \"X_decorrelated = pca.fit_transform(X)\\n\",\n    \"\\n\",\n    \"print(\\\"pca = PCA(n_components = 0.999)\\\\n\\\")\\n\",\n    \"print(\\\"First 5 Projection Points:\\\\n{}\\\\n\\\\n\\\".format(X_decorrelated[:5]))\\n\",\n    \"print(\\\"Principal Components:\\\\n{}\\\\n\\\\n\\\".format(pca.components_))\\n\",\n    \"print(\\\"Explained Variance Ratio:\\\\n{}\\\\n\\\".format(pca.explained_variance_ratio_))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2021-09-18T15:40:32.577605Z\",\n     \"start_time\": \"2021-09-18T15:40:31.721159Z\"\n    },\n    \"colab\": {},\n    \"colab_type\": \"code\",\n    \"id\": \"zmUyRlSPmse_\"\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"from matplotlib.patches import FancyArrowPatch\\n\",\n    \"from mpl_toolkits.mplot3d import proj3d\\n\",\n    \"\\n\",\n    \"class Arrow3D(FancyArrowPatch):\\n\",\n    \"    def __init__(self, xs, ys, zs, *args, **kwargs):\\n\",\n    \"        FancyArrowPatch.__init__(self, (0,0), (0,0), *args, **kwargs)\\n\",\n    \"        self._verts3d = xs, ys, zs\\n\",\n    \"\\n\",\n    \"    def draw(self, renderer):\\n\",\n    \"        xs3d, ys3d, zs3d = self._verts3d\\n\",\n    \"        xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M)\\n\",\n    \"        self.set_positions((xs[0],ys[0]),(xs[1],ys[1]))\\n\",\n    \"        FancyArrowPatch.draw(self, renderer)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2021-09-18T15:40:32.659633Z\",\n     \"start_time\": \"2021-09-18T15:40:32.609343Z\"\n    },\n    \"colab\": {\n     \"base_uri\": \"https://localhost:8080/\",\n     \"height\": 454\n    },\n    \"colab_type\": \"code\",\n    \"executionInfo\": {\n     \"elapsed\": 694,\n     \"status\": \"ok\",\n     \"timestamp\": 1546328037918,\n     \"user\": {\n      \"displayName\": \"Bob Li\",\n      \"photoUrl\": \"\",\n      \"userId\": \"13034580972517925389\"\n     },\n     \"user_tz\": -480\n    },\n    \"id\": \"tQT8YSDxA1f8\",\n    \"outputId\": \"3a43b0ba-0cb8-47e1-b019-2db84631fc6b\"\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Principal Components:\\n\",\n      \"[[-0.95250178 -0.24902446 -0.17529172]\\n\",\n      \" [ 0.29267159 -0.9076305  -0.30091563]\\n\",\n      \" [-0.08416476 -0.33792558  0.93740205]]\\n\",\n      \"\\n\",\n      \"\\n\",\n      \"Z value of the hyperplane:\\n\",\n      \"[[-0.63025233 -0.59433828 -0.55842423 -0.52251018 -0.48659612 -0.45068207\\n\",\n      \"  -0.41476802 -0.37885397 -0.34293992 -0.30702587]\\n\",\n      \" [-0.52611031 -0.49019626 -0.45428221 -0.41836815 -0.3824541  -0.34654005\\n\",\n      \"  -0.310626   -0.27471195 -0.2387979  -0.20288384]\\n\",\n      \" [-0.42196829 -0.38605424 -0.35014018 -0.31422613 -0.27831208 -0.24239803\\n\",\n      \"  -0.20648398 -0.17056993 -0.13465587 -0.09874182]\\n\",\n      \" [-0.31782626 -0.28191221 -0.24599816 -0.21008411 -0.17417006 -0.13825601\\n\",\n      \"  -0.10234196 -0.0664279  -0.03051385  0.0054002 ]\\n\",\n      \" [-0.21368424 -0.17777019 -0.14185614 -0.10594209 -0.07002804 -0.03411399\\n\",\n      \"   0.00180007  0.03771412  0.07362817  0.10954222]\\n\",\n      \" [-0.10954222 -0.07362817 -0.03771412 -0.00180007  0.03411399  0.07002804\\n\",\n      \"   0.10594209  0.14185614  0.17777019  0.21368424]\\n\",\n      \" [-0.0054002   0.03051385  0.0664279   0.10234196  0.13825601  0.17417006\\n\",\n      \"   0.21008411  0.24599816  0.28191221  0.31782626]\\n\",\n      \" [ 0.09874182  0.13465587  0.17056993  0.20648398  0.24239803  0.27831208\\n\",\n      \"   0.31422613  0.35014018  0.38605424  0.42196829]\\n\",\n      \" [ 0.20288384  0.2387979   0.27471195  0.310626    0.34654005  0.3824541\\n\",\n      \"   0.41836815  0.45428221  0.49019626  0.52611031]\\n\",\n      \" [ 0.30702587  0.34293992  0.37885397  0.41476802  0.45068207  0.48659612\\n\",\n      \"   0.52251018  0.55842423  0.59433828  0.63025233]]\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"axes = [-1.8, 1.8, -1.3, 1.3, -1.0, 1.0]\\n\",\n    \"\\n\",\n    \"x1s = np.linspace(axes[0], axes[1], 10)\\n\",\n    \"x2s = np.linspace(axes[2], axes[3], 10)\\n\",\n    \"x1, x2 = np.meshgrid(x1s, x2s)\\n\",\n    \"# principal components (orthogonal vectors that decide the hyperplane)\\n\",\n    \"C = pca.components_\\n\",\n    \"print(\\\"Principal Components:\\\\n{}\\\\n\\\\n\\\".format(C))\\n\",\n    \"# normal-vector of the hyperplane\\n\",\n    \"normal_vector = np.cross(C[0,:], C[1,:])\\n\",\n    \"\\n\",\n    \"# calculate z-value of the dataset\\n\",\n    \"z = np.empty((10, 10))\\n\",\n    \"for i in range(0,10):\\n\",\n    \"    for j in range(0,10):\\n\",\n    \"        z[i, j] = -(normal_vector[0]*x1[i, j]+normal_vector[1]*x2[i ,j])/normal_vector[2]\\n\",\n    \"\\n\",\n    \"print(\\\"Z value of the hyperplane:\\\\n{}\\\\n\\\".format(z))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"ExecuteTime\": {\n     \"end_time\": \"2021-09-18T15:40:34.718707Z\",\n     \"start_time\": \"2021-09-18T15:40:32.664516Z\"\n    },\n    \"colab\": {\n     \"base_uri\": \"https://localhost:8080/\",\n     \"height\": 357\n    },\n    \"colab_type\": \"code\",\n    \"executionInfo\": {\n     \"elapsed\": 1767,\n     \"status\": \"ok\",\n     \"timestamp\": 1546330698940,\n     \"user\": {\n      \"displayName\": \"Bob Li\",\n      \"photoUrl\": \"\",\n      \"userId\": \"13034580972517925389\"\n     },\n     \"user_tz\": -480\n    },\n    \"id\": \"9BqcncFeKY7o\",\n    \"outputId\": \"f72323ec-0f97-4219-c00a-c892e3b55912\",\n    \"scrolled\": true\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 720x432 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"import matplotlib\\n\",\n    \"import matplotlib.pyplot as plt\\n\",\n    \"from mpl_toolkits.mplot3d import Axes3D\\n\",\n    \"\\n\",\n    \"# setup parameters of the coordinates\\n\",\n    \"fig = plt.figure(figsize=(10, 6))\\n\",\n    \"ax = fig.add_subplot(111, projection=\\\"3d\\\")    # first figure of 1*1 space\\n\",\n    \"ax.set_xlabel(\\\"$x_1$\\\", fontsize=18, color=\\\"tab:blue\\\")\\n\",\n    \"ax.set_ylabel(\\\"$x_2$\\\", fontsize=18, color=\\\"tab:blue\\\")\\n\",\n    \"ax.set_zlabel(\\\"$x_3$\\\", fontsize=18, color=\\\"tab:blue\\\")\\n\",\n    \"ax.set_xlim(axes[0:2])\\n\",\n    \"ax.set_ylim(axes[2:4])\\n\",\n    \"ax.set_zlim(axes[4:6])\\n\",\n    \"\\n\",\n    \"# plot the X_decorrelated_DR dataset\\n\",\n    \"k = 0\\n\",\n    \"Z_projected = np.empty((60, 1))\\n\",\n    \"for i in range(0,60):\\n\",\n    \"    for j in range(0,2):\\n\",\n    \"        while k<60:\\n\",\n    \"            Z_projected[k] = -(normal_vector[0]*X_decorrelated_DR[i, j]+normal_vector[1]*X_decorrelated_DR[i ,j])/normal_vector[2]\\n\",\n    \"            k = k+1\\n\",\n    \"\\n\",\n    \"# plot the original datatset\\n\",\n    \"ax.plot(X[:, 0], X[:, 1], X[:, 2], \\\"bo\\\", alpha=0.6)\\n\",\n    \"      \\n\",\n    \"# plot the X_decorrelated_DR dataset\\n\",\n    \"ax.plot(X_decorrelated_DR[:, 0], X_decorrelated_DR[:, 1], Z_projected[:, 0], \\\"mo\\\", alpha=0.6)\\n\",\n    \"\\n\",\n    \"# plot the track of projection\\n\",\n    \"for j in range(0, 60):\\n\",\n    \"    ax.add_artist(Arrow3D([X[j, 0], X_decorrelated_DR[j, 0]],[X[j, 1], X_decorrelated_DR[j, 1]],[X[j, 2], Z_projected[j, 0]], mutation_scale=15, lw=1, arrowstyle=\\\"-|>\\\", color=\\\"tab:gray\\\"))\\n\",\n    \"\\n\",\n    \"# plot the hyperplane(2_D) for projection\\n\",\n    \"ax.plot_surface(x1, x2, z, alpha=0.2, color=\\\"k\\\")\\n\",\n    \"\\n\",\n    \"# plot the principal compoents(orthogonal vectors that decide the hyperplane)\\n\",\n    \"ax.add_artist(Arrow3D([0, C[0, 0]],[0, C[0, 1]],[0, C[0, 2]], mutation_scale=15, lw=1, arrowstyle=\\\"-|>\\\", color=\\\"tab:red\\\"))\\n\",\n    \"ax.add_artist(Arrow3D([0, C[1, 0]],[0, C[1, 1]],[0, C[1, 2]], mutation_scale=15, lw=1, arrowstyle=\\\"-|>\\\", color=\\\"tab:red\\\"))\\n\",\n    \"\\n\",\n    \"# plot the origin\\n\",\n    \"ax.plot([0], [0], [0], \\\"r.\\\")\\n\",\n    \"\\n\",\n    \"plt.show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"colab\": {\n   \"collapsed_sections\": [],\n   \"name\": \"dimensionality_reduction.ipynb\",\n   \"provenance\": [],\n   \"version\": \"0.3.2\"\n  },\n  \"hide_input\": false,\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.8.8\"\n  },\n  \"toc\": {\n   \"base_numbering\": 1,\n   \"nav_menu\": {},\n   \"number_sections\": true,\n   \"sideBar\": true,\n   \"skip_h1_title\": false,\n   \"title_cell\": \"Table of Contents\",\n   \"title_sidebar\": \"Contents\",\n   \"toc_cell\": false,\n   \"toc_position\": {},\n   \"toc_section_display\": true,\n   \"toc_window_display\": false\n  },\n  \"varInspector\": {\n   \"cols\": {\n    \"lenName\": 16,\n    \"lenType\": 16,\n    \"lenVar\": 40\n   },\n   \"kernels_config\": {\n    \"python\": {\n     \"delete_cmd_postfix\": \"\",\n     \"delete_cmd_prefix\": \"del \",\n     \"library\": \"var_list.py\",\n     \"varRefreshCmd\": \"print(var_dic_list())\"\n    },\n    \"r\": {\n     \"delete_cmd_postfix\": \") \",\n     \"delete_cmd_prefix\": \"rm(\",\n     \"library\": \"var_list.r\",\n     \"varRefreshCmd\": \"cat(var_dic_list()) \"\n    }\n   },\n   \"types_to_exclude\": [\n    \"module\",\n    \"function\",\n    \"builtin_function_or_method\",\n    \"instance\",\n    \"_Feature\"\n   ],\n   \"window_display\": false\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "02_Python/Discrete_Cosine_Transform_(DCT)/Discrete_Cosine_Transform.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<small><small><i>\\n\",\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\",\n    \"</i></small></small>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Discrete Cosine Transform\\n\",\n    \"This is a little jupyter notebook that does a discrete cosine transform (DCT). DCT is a thing like the Fourier transform that's used in JPGs.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"jupyter\": {\n     \"outputs_hidden\": false\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Requirement already satisfied: numpy in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (1.20.1)\\n\",\n      \"Requirement already satisfied: pandas in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (1.2.4)\\n\",\n      \"Requirement already satisfied: numpy>=1.16.5 in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (from pandas) (1.20.1)\\n\",\n      \"Requirement already satisfied: pytz>=2017.3 in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (from pandas) (2021.1)\\n\",\n      \"Requirement already satisfied: python-dateutil>=2.7.3 in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (from pandas) (2.8.1)\\n\",\n      \"Requirement already satisfied: six>=1.5 in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (from python-dateutil>=2.7.3->pandas) (1.15.0)\\n\",\n      \"Requirement already satisfied: matplotlib in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (3.3.4)\\n\",\n      \"Requirement already satisfied: python-dateutil>=2.1 in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (from matplotlib) (2.8.1)\\n\",\n      \"Requirement already satisfied: pillow>=6.2.0 in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (from matplotlib) (8.2.0)\\n\",\n      \"Requirement already satisfied: cycler>=0.10 in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (from matplotlib) (0.10.0)\\n\",\n      \"Requirement already satisfied: numpy>=1.15 in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (from matplotlib) (1.20.1)\\n\",\n      \"Requirement already satisfied: kiwisolver>=1.0.1 in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (from matplotlib) (1.3.1)\\n\",\n      \"Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3 in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (from matplotlib) (2.4.7)\\n\",\n      \"Requirement already satisfied: six in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (from cycler>=0.10->matplotlib) (1.15.0)\\n\",\n      \"Requirement already satisfied: scipy in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (1.6.2)\\n\",\n      \"Requirement already satisfied: numpy<1.23.0,>=1.16.5 in c:\\\\programdata\\\\anaconda3\\\\lib\\\\site-packages (from scipy) (1.20.1)\\n\",\n      \"Populating the interactive namespace from numpy and matplotlib\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!pip install numpy\\n\",\n    \"!pip install pandas\\n\",\n    \"!pip install matplotlib\\n\",\n    \"!pip install scipy\\n\",\n    \"\\n\",\n    \"# Imports and the like\\n\",\n    \"%pylab inline\\n\",\n    \"\\n\",\n    \"import numpy as np\\n\",\n    \"from PIL import Image\\n\",\n    \"import matplotlib.pyplot as plt\\n\",\n    \"\\n\",\n    \"# Graph settings. No more jet plz\\n\",\n    \"mpl.rcParams['image.cmap'] = 'gray'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"jupyter\": {\n     \"outputs_hidden\": false\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"array([[1.        , 1.        , 1.        , 1.        , 1.        ,\\n\",\n       \"        1.        , 1.        , 1.        ],\\n\",\n       \"       [1.        , 1.        , 0.92156863, 0.08235294, 0.72941176,\\n\",\n       \"        1.        , 1.        , 1.        ],\\n\",\n       \"       [1.        , 1.        , 0.54901961, 0.29019608, 0.2627451 ,\\n\",\n       \"        1.        , 1.        , 1.        ],\\n\",\n       \"       [1.        , 0.99607843, 0.15686275, 0.8745098 , 0.16862745,\\n\",\n       \"        0.8627451 , 1.        , 1.        ],\\n\",\n       \"       [1.        , 0.75294118, 0.00392157, 0.09019608, 0.02745098,\\n\",\n       \"        0.4745098 , 1.        , 1.        ],\\n\",\n       \"       [1.        , 0.35686275, 0.6       , 1.        , 0.88235294,\\n\",\n       \"        0.09803922, 0.98039216, 1.        ],\\n\",\n       \"       [1.        , 0.2627451 , 0.90196078, 1.        , 1.        ,\\n\",\n       \"        0.29411765, 0.8745098 , 1.        ],\\n\",\n       \"       [1.        , 1.        , 1.        , 1.        , 1.        ,\\n\",\n       \"        1.        , 1.        , 1.        ]])\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# Load up the image, and normalise it\\n\",\n    \"img_path = 'data/a.png'\\n\",\n    \"# Open image. We also convert to grayscale to make it simpler to deal with\\n\",\n    \"img = np.asarray(Image.open(img_path).convert('L'))\\n\",\n    \"# Normalise to 0-1\\n\",\n    \"img = img / 255\\n\",\n    \"\\n\",\n    \"plt.imshow(img)\\n\",\n    \"img\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"jupyter\": {\n     \"outputs_hidden\": false\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"saved to output/test.png\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAPUAAAD4CAYAAAA0L6C7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAK3ElEQVR4nO3d4Ysc9R3H8c+nF3dToxJsbdEk9E6QgBRq5AhIQGhsS6yifdAHCVioFPJIUVoQ7bP+A2IfFCFErWCqtFFBxGoFFSu01iSmrcnFkgZLrtFECYcxxYaYbx/cRk7vzpudnd/O3rfvFxy53Vnm9xmST2Z2dnZ+jggByONLbQcA0CxKDSRDqYFkKDWQDKUGkllRYqW2U55St512vKxjDduwtu3s2bM6d+7cgoMVKfUwrVgxvE0Y5ljDHo+xltd4x48fX3QZh99AMpQaSIZSA8lQaiAZSg0kQ6mBZCg1kAylBpKh1EAylUpte4vtt20ftn1v6VAA6luy1LbHJP1K0o2Srpa0zfbVpYMBqKfKnnqjpMMRcSQizkh6QtKtZWMBqKtKqddIOjrn8XTvuc+wvd32Htt7mgoHoH9VvlKy0Ne75n21MiJ2SNoh5f3qJbAcVNlTT0taN+fxWknHysQBMKgqpX5D0lW2J2x3JG2V9EzZWADqWvLwOyLO2r5D0guSxiQ9HBEHiicDUEul2zRExHOSniucBUADuKIMSIZSA8lQaiAZSg0kQ6mBZCg1kAylBpIpMp1Ap9PRFVdcUWLV8zDbA2ONyljDHG9mZmbRZeypgWQoNZAMpQaSodRAMpQaSIZSA8lQaiAZSg0kQ6mBZCg1kEyVGToetn3C9lvDCARgMFX21L+WtKVwDgANWbLUEfGqpJNDyAKgAY19pcT2dknbJWlsbKyp1QLoU2MnyiJiR0RMRsQkpQbaw9lvIBlKDSRT5SOtxyX9SdJ629O2f1I+FoC6qsyltW0YQQA0g8NvIBlKDSRDqYFkKDWQDKUGkqHUQDKUGkimyBwh3W5XExMTJVY9D1O4MNaojDXM8Q4ePLjoMvbUQDKUGkiGUgPJUGogGUoNJEOpgWQoNZAMpQaSodRAMpQaSKbKPcrW2X7Z9pTtA7bvGkYwAPVUuVD1rKSfRcQ+2xdL2mv7xYhY/OJTAK2pMu3OuxGxr/f7KUlTktaUDgagnr6+UmJ7XNIGSa8vsOzTaXe63W4T2QDUUPlEme2LJD0p6e6I+PDzy+dOu9PpdJrMCKAPlUpt+wLNFnpXRDxVNhKAQVQ5+21JD0maioj7y0cCMIgqe+pNkn4kabPt/b2f7xfOBaCmKtPuvCbJQ8gCoAFcUQYkQ6mBZCg1kAylBpKh1EAylBpIhlIDyVBqIJkiE/90Oh2Nj4+XWPU8zMvEWKMy1jDH+6JvQrKnBpKh1EAylBpIhlIDyVBqIBlKDSRDqYFkKDWQDKUGkqly48GVtv9i+6+9aXd+MYxgAOqpck3bfyVtjoiPercKfs327yPiz4WzAaihyo0HQ9JHvYcX9H6iZCgA9VW9mf+Y7f2STkh6MSIWnHbH9h7bez7++OOGYwKoqlKpI+KTiLhG0lpJG21/c4HXfDrtzsqVKxuOCaCqvs5+R8SMpFckbSkRBsDgqpz9vsz26t7vX5b0HUmHCucCUFOVs9+XS3rU9phm/xP4bUQ8WzYWgLqqnP3+m2bnpAawDHBFGZAMpQaSodRAMpQaSIZSA8lQaiAZSg0kQ6mBZIrMEdLtdjUxMVFi1fMwhQtjjcpYwxyv0+ksuow9NZAMpQaSodRAMpQaSIZSA8lQaiAZSg0kQ6mBZCg1kAylBpKpXOreDf3ftM1NB4ER1s+e+i5JU6WCAGhG1Wl31kq6SdLOsnEADKrqnvoBSfdIOrfYC+bOpXX69OkmsgGoocoMHTdLOhERe7/odXPn0lq1alVjAQH0p8qeepOkW2y/I+kJSZttP1Y0FYDalix1RNwXEWsjYlzSVkkvRcRtxZMBqIXPqYFk+rr3SkS8otmpbAGMKPbUQDKUGkiGUgPJUGogGUoNJEOpgWQoNZBMkTlCOp2OxsfHS6x6HqZwYaxRGWuY43W73UWXsacGkqHUQDKUGkiGUgPJUGogGUoNJEOpgWQoNZAMpQaSodRAMpWuaevdSfSUpE8knY2IyZKhANTXz4Wq346ID4olAdAIDr+BZKqWOiT9wfZe29sXesHcaXdOnTrVXEIAfal6+L0pIo7Z/pqkF20fiohX574gInZI2iFJExMT0XBOABVV2lNHxLHenyckPS1pY8lQAOqrMkHeKtsXn/9d0vckvVU6GIB6qhx+f13S07bPv/43EfF80VQAaluy1BFxRNK3hpAFQAP4SAtIhlIDyVBqIBlKDSRDqYFkKDWQDKUGkikyR0i329XExESJVc/DFC6MNSpjDXM8pt0B/o9QaiAZSg0kQ6mBZCg1kAylBpKh1EAylBpIhlIDyVBqIJlKpba92vZu24dsT9m+rnQwAPVUvVD1l5Kej4gf2u5IurBgJgADWLLUti+RdL2kH0tSRJyRdKZsLAB1VTn8vlLS+5Iesf2m7Z29+39/xtxpd2ZmZprOCaCiKqVeIelaSQ9GxAZJpyXd+/kXRcSOiJiMiMnVq1c3mxJAZVVKPS1pOiJe7z3erdmSAxhBS5Y6It6TdNT2+t5TN0g6WDQVgNqqnv2+U9Ku3pnvI5JuLxcJwCAqlToi9kuaLBsFQBO4ogxIhlIDyVBqIBlKDSRDqYFkKDWQDKUGkqHUQDJFJv7pdDoaHx8vsep5mJeJsUZlrGGO1+l0Fl3GnhpIhlIDyVBqIBlKDSRDqYFkKDWQDKUGkqHUQDKUGkhmyVLbXm97/5yfD23fPYRsAGpY8pq2iHhb0jWSZHtM0r8lPV02FoC6+j38vkHSPyPiXyXCABhcv6XeKunxhRbMnXbn5MmTgycDUEvlUvfu+X2LpN8ttHzutDuXXnppU/kA9KmfPfWNkvZFxPFSYQAMrp9Sb9Mih94ARkelUtu+UNJ3JT1VNg6AQVWdduc/kr5SOAuABnBFGZAMpQaSodRAMpQaSIZSA8lQaiAZSg0kQ6mBZBwRza/Ufl9Sv1/P/KqkDxoPMxqybhvb1Z5vRMRlCy0oUuo6bO+JiMm2c5SQddvYrtHE4TeQDKUGkhmlUu9oO0BBWbeN7RpBI/OeGkAzRmlPDaABlBpIZiRKbXuL7bdtH7Z9b9t5mmB7ne2XbU/ZPmD7rrYzNcn2mO03bT/bdpYm2V5te7ftQ72/u+vaztSv1t9T9yYI+Idmb5c0LekNSdsi4mCrwQZk+3JJl0fEPtsXS9or6QfLfbvOs/1TSZOSLomIm9vO0xTbj0r6Y0Ts7N1B98KImGk5Vl9GYU+9UdLhiDgSEWckPSHp1pYzDSwi3o2Ifb3fT0makrSm3VTNsL1W0k2SdradpUm2L5F0vaSHJCkiziy3QkujUeo1ko7OeTytJP/4z7M9LmmDpNdbjtKUByTdI+lcyzmadqWk9yU90ntrsdP2qrZD9WsUSu0FnkvzOZvtiyQ9KenuiPiw7TyDsn2zpBMRsbftLAWskHStpAcjYoOk05KW3TmeUSj1tKR1cx6vlXSspSyNsn2BZgu9KyKy3F55k6RbbL+j2bdKm20/1m6kxkxLmo6I80dUuzVb8mVlFEr9hqSrbE/0TkxslfRMy5kGZtuafW82FRH3t52nKRFxX0SsjYhxzf5dvRQRt7UcqxER8Z6ko7bX9566QdKyO7FZ6b7fJUXEWdt3SHpB0pikhyPiQMuxmrBJ0o8k/d32/t5zP4+I59qLhArulLSrt4M5Iun2lvP0rfWPtAA0axQOvwE0iFIDyVBqIBlKDSRDqYFkKDWQDKUGkvkfEqhos44XnYIAAAAASUVORK5CYII=\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# And a little function to save images\\n\",\n    \"\\n\",\n    \"# Shout out to\\n\",\n    \"# stackoverflow.com/questions/31544130/saving-an-imshow-like-image-while-preserving-resolution\\n\",\n    \"def save_image(data, name, vmin=0, vmax=1):\\n\",\n    \"    cmap = plt.cm.gray\\n\",\n    \"    norm = plt.Normalize(vmin=vmin, vmax=vmax)\\n\",\n    \"    \\n\",\n    \"    img = cmap(norm(data))\\n\",\n    \"    plt.imsave(name, img)\\n\",\n    \"    print('saved to {}'.format(name))\\n\",\n    \"\\n\",\n    \"# quick test\\n\",\n    \"arr = np.linspace(-1, 1, 8 * 8).reshape((8, 8))\\n\",\n    \"plt.imshow(arr)\\n\",\n    \"save_image(arr, name=\\\"output/test.png\\\", vmin=-1, vmax=1)\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Displaying the frequency things\\n\",\n    \"Let's start with seeing if we can render each of the 'frequencies' that the DCT gives us.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"jupyter\": {\n     \"outputs_hidden\": false\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"array([[1., 0., 0., 0., 0., 0., 0., 0.],\\n\",\n       \"       [0., 0., 0., 0., 0., 0., 0., 0.],\\n\",\n       \"       [0., 0., 0., 0., 0., 0., 0., 0.],\\n\",\n       \"       [0., 0., 0., 0., 0., 0., 0., 0.],\\n\",\n       \"       [0., 0., 0., 0., 0., 0., 0., 0.],\\n\",\n       \"       [0., 0., 0., 0., 0., 0., 0., 0.],\\n\",\n       \"       [0., 0., 0., 0., 0., 0., 0., 0.],\\n\",\n       \"       [0., 0., 0., 0., 0., 0., 0., 0.]])\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"freq = np.zeros((8, 8))\\n\",\n    \"freq[0,0] = 1\\n\",\n    \"freq\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"jupyter\": {\n     \"outputs_hidden\": false\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<matplotlib.image.AxesImage at 0x23939b9e760>\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"from scipy.fftpack import idct\\n\",\n    \"\\n\",\n    \"freq_img = idct(idct(freq, axis=0), axis=1)\\n\",\n    \"plt.imshow(freq_img)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"jupyter\": {\n     \"outputs_hidden\": false\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<matplotlib.image.AxesImage at 0x23939c040a0>\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# Ok, lets try for a more interesting frequency\\n\",\n    \"freq = np.zeros((8, 8))\\n\",\n    \"freq[2,3] = 1\\n\",\n    \"freq_img = idct(idct(freq, axis=0), axis=1)\\n\",\n    \"plt.imshow(freq_img)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Alright sweet, that worked. (Side point: that plot looks wiggly haha)\\n\",\n    \"\\n\",\n    \"Now lets try... ALL OF THEM\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"jupyter\": {\n     \"outputs_hidden\": false\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"saved to output/components-0-0.png\\n\",\n      \"saved to output/components-0-1.png\\n\",\n      \"saved to output/components-0-2.png\\n\",\n      \"saved to output/components-0-3.png\\n\",\n      \"saved to output/components-0-4.png\\n\",\n      \"saved to output/components-0-5.png\\n\",\n      \"saved to output/components-0-6.png\\n\",\n      \"saved to output/components-0-7.png\\n\",\n      \"saved to output/components-1-0.png\\n\",\n      \"saved to output/components-1-1.png\\n\",\n      \"saved to output/components-1-2.png\\n\",\n      \"saved to output/components-1-3.png\\n\",\n      \"saved to output/components-1-4.png\\n\",\n      \"saved to output/components-1-5.png\\n\",\n      \"saved to output/components-1-6.png\\n\",\n      \"saved to output/components-1-7.png\\n\",\n      \"saved to output/components-2-0.png\\n\",\n      \"saved to output/components-2-1.png\\n\",\n      \"saved to output/components-2-2.png\\n\",\n      \"saved to output/components-2-3.png\\n\",\n      \"saved to output/components-2-4.png\\n\",\n      \"saved to output/components-2-5.png\\n\",\n      \"saved to output/components-2-6.png\\n\",\n      \"saved to output/components-2-7.png\\n\",\n      \"saved to output/components-3-0.png\\n\",\n      \"saved to output/components-3-1.png\\n\",\n      \"saved to output/components-3-2.png\\n\",\n      \"saved to output/components-3-3.png\\n\",\n      \"saved to output/components-3-4.png\\n\",\n      \"saved to output/components-3-5.png\\n\",\n      \"saved to output/components-3-6.png\\n\",\n      \"saved to output/components-3-7.png\\n\",\n      \"saved to output/components-4-0.png\\n\",\n      \"saved to output/components-4-1.png\\n\",\n      \"saved to output/components-4-2.png\\n\",\n      \"saved to output/components-4-3.png\\n\",\n      \"saved to output/components-4-4.png\\n\",\n      \"saved to output/components-4-5.png\\n\",\n      \"saved to output/components-4-6.png\\n\",\n      \"saved to output/components-4-7.png\\n\",\n      \"saved to output/components-5-0.png\\n\",\n      \"saved to output/components-5-1.png\\n\",\n      \"saved to output/components-5-2.png\\n\",\n      \"saved to output/components-5-3.png\\n\",\n      \"saved to output/components-5-4.png\\n\",\n      \"saved to output/components-5-5.png\\n\",\n      \"saved to output/components-5-6.png\\n\",\n      \"saved to output/components-5-7.png\\n\",\n      \"saved to output/components-6-0.png\\n\",\n      \"saved to output/components-6-1.png\\n\",\n      \"saved to output/components-6-2.png\\n\",\n      \"saved to output/components-6-3.png\\n\",\n      \"saved to output/components-6-4.png\\n\",\n      \"saved to output/components-6-5.png\\n\",\n      \"saved to output/components-6-6.png\\n\",\n      \"saved to output/components-6-7.png\\n\",\n      \"saved to output/components-7-0.png\\n\",\n      \"saved to output/components-7-1.png\\n\",\n      \"saved to output/components-7-2.png\\n\",\n      \"saved to output/components-7-3.png\\n\",\n      \"saved to output/components-7-4.png\\n\",\n      \"saved to output/components-7-5.png\\n\",\n      \"saved to output/components-7-6.png\\n\",\n      \"saved to output/components-7-7.png\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 64 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"import itertools\\n\",\n    \"\\n\",\n    \"fig, axes = plt.subplots(8, 8)\\n\",\n    \"\\n\",\n    \"for (x, y) in itertools.product(range(8), range(8)):\\n\",\n    \"    freq = np.zeros((8, 8))\\n\",\n    \"    freq[x, y] = 1\\n\",\n    \"    freq_img = idct(idct(freq, axis=0, norm='ortho'), axis=1, norm='ortho')\\n\",\n    \"    \\n\",\n    \"    ax = axes[x, y]\\n\",\n    \"    # Experimentally all things tend to be within this range\\n\",\n    \"    ax.imshow(freq_img, vmin=-0.25, vmax=0.25)\\n\",\n    \"    ax.axis('off')\\n\",\n    \"    \\n\",\n    \"    save_image(freq_img, name='output/components-{}-{}.png'.format(x, y), vmin=-0.25, vmax=0.25)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Neato! That worked! :)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Generating the things from an image\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"jupyter\": {\n     \"outputs_hidden\": false\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"array([[ 6.43676471e+00, -2.67804573e-01,  1.14066855e+00,\\n\",\n       \"         1.28416012e-01,  1.65196078e-01,  2.76328891e-01,\\n\",\n       \"        -1.70577854e-01,  1.21208766e-02],\\n\",\n       \"       [ 1.35862306e-01,  5.87481881e-03,  3.52431981e-01,\\n\",\n       \"         3.01222513e-01, -6.82459017e-01, -3.73353206e-01,\\n\",\n       \"         1.59132959e-01, -2.50116836e-01],\\n\",\n       \"       [ 9.84146150e-01,  1.76109941e-01, -8.77287599e-01,\\n\",\n       \"        -1.82194378e-01, -5.80653053e-03, -2.06642209e-01,\\n\",\n       \"         3.10223718e-01,  4.79610215e-01],\\n\",\n       \"       [-2.13674319e-01, -2.03986691e-02, -2.04994939e-01,\\n\",\n       \"        -2.32005457e-01,  5.74831191e-01,  2.41180524e-01,\\n\",\n       \"        -1.72429322e-01,  4.04527918e-01],\\n\",\n       \"       [ 1.65196078e-01,  1.59533499e-02,  9.12904168e-02,\\n\",\n       \"         1.45871539e-01, -1.86764706e-01, -4.44932490e-02,\\n\",\n       \"        -1.80540936e-01, -5.75197360e-01],\\n\",\n       \"       [ 1.88319103e-01,  3.92539127e-02, -4.27105658e-01,\\n\",\n       \"        -2.17986425e-01,  4.04082687e-01,  3.21360492e-01,\\n\",\n       \"        -6.34915065e-02, -1.83447823e-01],\\n\",\n       \"       [ 2.07300651e-01,  4.01933732e-02, -1.58403733e-01,\\n\",\n       \"        -6.69611716e-02,  5.38718317e-02,  7.05020163e-02,\\n\",\n       \"        -1.00163382e-01, -1.17451808e-01],\\n\",\n       \"       [-3.08639267e-01, -5.43818250e-02,  3.18181609e-01,\\n\",\n       \"         9.52258897e-02, -1.69691772e-01, -6.60887291e-02,\\n\",\n       \"         1.15682158e-01,  5.57505384e-02]])\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAPUAAAD4CAYAAAA0L6C7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAL9ElEQVR4nO3d74tc93XH8ffRrqS1FMkGS/65cjeBYAiFREEYgiBQuy1OY5w+6AMbEmgo6FGCTQvBybP8AyF9UAJCdhqIG9M6MYTgJjUkIQ20riVZTiPJLrZI0MZKpRDJsmRbq12dPtixWUUr687svXdGp+8XLNrZGeackfaj7507994TmYmkOtaNuwFJ7TLUUjGGWirGUEvFGGqpmOkunnTbtm05NzfXxVNf4aWXXuqlDsCmTZt6qwVw4cKFXuv1JSJ6q7W4uNhbLYB16/pZJxcXF1laWlr1L7KTUM/NzbF///4unvoKt9xySy91AHbu3NlbLYDXXnutt1p9Bm16upNfu1WdOXOmt1oAGzdu7KXOiRMnrnqfm99SMYZaKsZQS8UYaqkYQy0VY6ilYgy1VIyhloox1FIxjUIdEfdHxCsR8WpEPNZ1U5JGd81QR8QU8A/Ap4CPAA9HxEe6bkzSaJqs1PcAr2bmscxcAJ4CPtNtW5JG1STUdwLHV9yeH/zsMhGxJyL2R8T+U6dOtdWfpCE1CfVqp+9ccbXCzNybmbsyc9f27dvX3pmkkTQJ9TywY8XtWeD1btqRtFZNQv0C8OGI+GBEbAAeAr7fbVuSRnXNs9UzczEivgD8CJgCnsjMw513JmkkjS5BkZnPAs923IukFnhEmVSMoZaKMdRSMYZaKsZQS8UYaqkYQy0VE10MnZ+ZmcnZ2dnWn3c1Fy9e7KUOwJYtW3qrBbC0tNRbrWPHjvVWa/Pmzb3Vuvnmm3urBfDGG2/0Uuf06dNcvHhx1bEqrtRSMYZaKsZQS8UYaqkYQy0VY6ilYgy1VIyhloox1FIxhloqpsmEjici4mRE/LKPhiStTZOV+h+B+zvuQ1JLrhnqzPwZ8PseepHUgkZXE20iIvYAewCmp1t7WklDam1H2cqxO1NTU209raQhufdbKsZQS8U0+UjrO8B/AHdHxHxE/E33bUkaVZNZWg/30Yikdrj5LRVjqKViDLVUjKGWijHUUjGGWirGUEvFdHLmxYYNG7jrrru6eOorHD9+vJc6AIcPH+6tFsBtt91WstaFCxd6q9X3yUV33HFHL3XOnTt31ftcqaViDLVUjKGWijHUUjGGWirGUEvFGGqpGEMtFWOopWIMtVRMk2uU7YiIn0TE0Yg4HBGP9NGYpNE0OTB2Efi7zDwYEVuAAxHxXGYe6bg3SSNoMnbnRGYeHHz/JnAUuLPrxiSNZqhTWCJiDtgJPL/Kfe+N3dm4cWMbvUkaQeMdZRHxAeC7wKOZefYP7185dmfDhg1t9ihpCI1CHRHrWQ70k5n5vW5bkrQWTfZ+B/A4cDQzv9Z9S5LWoslKvRv4HHBvRBwafP1Fx31JGlGTsTs/B6KHXiS1wCPKpGIMtVSMoZaKMdRSMYZaKsZQS8UYaqkYQy0V08mgobfffpsjR/o53brPk0duvfXW3moBXLp0qbda27Zt663W+fPne6t15syZ3mpBf3+PmXnV+1yppWIMtVSMoZaKMdRSMYZaKsZQS8UYaqkYQy0VY6ilYppceHAmIv4rIl4ajN35ah+NSRpNk8NELwD3Zua5waWCfx4R/5qZ/9lxb5JG0OTCgwmcG9xcP/i6+oGnksaq6cX8pyLiEHASeC4zVx27ExH7I2J/nyciSLpco1Bn5lJmfgyYBe6JiD9e5THvjd1Zt879b9K4DJW+zDwD/BS4v4tmJK1dk73f2yPipsH3NwB/CrzccV+SRtRk7/ftwLciYorl/wT+OTN/0G1bkkbVZO/3L1ieSS3pOuAeLakYQy0VY6ilYgy1VIyhloox1FIxhloqxlBLxcT7je8Y1czMTO7YsaP1513NxYsXe6kDEBG91QKYmprqrVafo3DWr1/fW60+fz8Azp4920udd955h6WlpVV/IV2ppWIMtVSMoZaKMdRSMYZaKsZQS8UYaqkYQy0VY6ilYgy1VEzjUA8u6P9iRHjRQWmCDbNSPwIc7aoRSe1oOnZnFvg0sK/bdiStVdOV+uvAl4CrDslaOUtraWmpjd4kjaDJhI4HgJOZeeD9HrdyllafpwxKulyTlXo38GBE/Ap4Crg3Ir7daVeSRnbNUGfmlzNzNjPngIeAH2fmZzvvTNJI/JxaKqbJgLz3ZOZPWR5lK2lCuVJLxRhqqRhDLRVjqKViDLVUjKGWijHUUjFDfU49ifochXP69OneagHMzMz0Vmv79u291VpcXOyt1rlz53qrBbB169Ze6iwsLFz1PldqqRhDLRVjqKViDLVUjKGWijHUUjGGWirGUEvFGGqpGEMtFdPoMNHBlUTfBJaAxczc1WVTkkY3zLHff5KZv+usE0mtcPNbKqZpqBP4t4g4EBF7VnuAY3ekydB083t3Zr4eEbcAz0XEy5n5s5UPyMy9wF6AmZmZbLlPSQ01Wqkz8/XBnyeBZ4B7umxK0uiaDMjbHBFb3v0e+HPgl103Jmk0TTa/bwWeGVxhZBr4p8z8YaddSRrZNUOdmceAj/bQi6QW+JGWVIyhloox1FIxhloqxlBLxRhqqRhDLRVz3Y/d6dOmTZt6rTc1NdVbrb7H0/Qls9/TENat62edfL9xU67UUjGGWirGUEvFGGqpGEMtFWOopWIMtVSMoZaKMdRSMYZaKqZRqCPipoh4OiJejoijEfGJrhuTNJqmx37/PfDDzPyriNgA9HsQtKTGrhnqiNgKfBL4a4DMXAAWum1L0qiabH5/CDgFfDMiXoyIfYPrf1/GsTvSZGgS6mng48A3MnMncB547A8flJl7M3NXZu7q85RBSZdrEup5YD4znx/cfprlkEuaQNcMdWb+FjgeEXcPfnQfcKTTriSNrOne7y8CTw72fB8DPt9dS5LWolGoM/MQsKvbViS1wSPKpGIMtVSMoZaKMdRSMYZaKsZQS8UYaqkYQy0V08ksrcXFRU6fPt3FU1/hhhtu6KUOwI033thbLYCFhf7OcH3rrbd6qzU93d8It40bN/ZWC+DSpUu91HGWlvT/iKGWijHUUjGGWirGUEvFGGqpGEMtFWOopWIMtVTMNUMdEXdHxKEVX2cj4tEeepM0gmser5eZrwAfA4iIKeA3wDPdtiVpVMNuft8HvJaZv+6iGUlrN+yR9Q8B31ntjojYA+wBWLfOt+rSuDRO3+Ca3w8C/7La/SvH7rzfGSSSujXMkvop4GBm/m9XzUhau2FC/TBX2fSWNDkahToiNgF/Bnyv23YkrVXTsTtvATd33IukFribWirGUEvFGGqpGEMtFWOopWIMtVSMoZaKMdRSMZGZ7T9pxClg2NMztwG/a72ZyVD1tfm6xuePMnP7and0EupRRMT+zNw17j66UPW1+bomk5vfUjGGWipmkkK9d9wNdKjqa/N1TaCJeU8tqR2TtFJLaoGhloqZiFBHxP0R8UpEvBoRj427nzZExI6I+ElEHI2IwxHxyLh7alNETEXEixHxg3H30qaIuCkino6Ilwf/dp8Yd0/DGvt76sGAgP9h+XJJ88ALwMOZeWSsja1RRNwO3J6ZByNiC3AA+Mvr/XW9KyL+FtgFbM3MB8bdT1si4lvAv2fmvsEVdDdl5pkxtzWUSVip7wFezcxjmbkAPAV8Zsw9rVlmnsjMg4Pv3wSOAneOt6t2RMQs8Glg37h7aVNEbAU+CTwOkJkL11ugYTJCfSdwfMXteYr88r8rIuaAncDzY26lLV8HvgRcGnMfbfsQcAr45uCtxb6I2DzupoY1CaFe7cr/ZT5ni4gPAN8FHs3Ms+PuZ60i4gHgZGYeGHcvHZgGPg58IzN3AueB624fzySEeh7YseL2LPD6mHppVUSsZznQT2Zmlcsr7wYejIhfsfxW6d6I+PZ4W2rNPDCfme9uUT3NcsivK5MQ6heAD0fEBwc7Jh4Cvj/mntYslmcPPQ4czcyvjbuftmTmlzNzNjPnWP63+nFmfnbMbbUiM38LHI+Iuwc/ug+47nZsDjsgr3WZuRgRXwB+BEwBT2Tm4TG31YbdwOeA/46IQ4OffSUznx1fS2rgi8CTgwXmGPD5MfcztLF/pCWpXZOw+S2pRYZaKsZQS8UYaqkYQy0VY6ilYgy1VMz/AUHG3e+lL3JrAAAAAElFTkSuQmCC\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"from scipy.fftpack import dct\\n\",\n    \"\\n\",\n    \"freqs = dct(dct(img, axis=0, norm='ortho'), axis=1, norm='ortho')\\n\",\n    \"plt.imshow(freqs)\\n\",\n    \"freqs\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"seems correct...\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"jupyter\": {\n     \"outputs_hidden\": false\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<matplotlib.image.AxesImage at 0x2393a5053d0>\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# Convert forward and backwards\\n\",\n    \"freqs = dct(dct(img, axis=0, norm='ortho'), axis=1, norm='ortho')\\n\",\n    \"reconstructed_img = idct(idct(freqs, axis=0, norm='ortho'), axis=1, norm='ortho')\\n\",\n    \"plt.imshow(reconstructed_img)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"jupyter\": {\n     \"outputs_hidden\": false\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"saved to output/img-components-0-0.png\\n\",\n      \"saved to output/img-components-0-1.png\\n\",\n      \"saved to output/img-components-0-2.png\\n\",\n      \"saved to output/img-components-0-3.png\\n\",\n      \"saved to output/img-components-0-4.png\\n\",\n      \"saved to output/img-components-0-5.png\\n\",\n      \"saved to output/img-components-0-6.png\\n\",\n      \"saved to output/img-components-0-7.png\\n\",\n      \"saved to output/img-components-1-0.png\\n\",\n      \"saved to output/img-components-1-1.png\\n\",\n      \"saved to output/img-components-1-2.png\\n\",\n      \"saved to output/img-components-1-3.png\\n\",\n      \"saved to output/img-components-1-4.png\\n\",\n      \"saved to output/img-components-1-5.png\\n\",\n      \"saved to output/img-components-1-6.png\\n\",\n      \"saved to output/img-components-1-7.png\\n\",\n      \"saved to output/img-components-2-0.png\\n\",\n      \"saved to output/img-components-2-1.png\\n\",\n      \"saved to output/img-components-2-2.png\\n\",\n      \"saved to output/img-components-2-3.png\\n\",\n      \"saved to output/img-components-2-4.png\\n\",\n      \"saved to output/img-components-2-5.png\\n\",\n      \"saved to output/img-components-2-6.png\\n\",\n      \"saved to output/img-components-2-7.png\\n\",\n      \"saved to output/img-components-3-0.png\\n\",\n      \"saved to output/img-components-3-1.png\\n\",\n      \"saved to output/img-components-3-2.png\\n\",\n      \"saved to output/img-components-3-3.png\\n\",\n      \"saved to output/img-components-3-4.png\\n\",\n      \"saved to output/img-components-3-5.png\\n\",\n      \"saved to output/img-components-3-6.png\\n\",\n      \"saved to output/img-components-3-7.png\\n\",\n      \"saved to output/img-components-4-0.png\\n\",\n      \"saved to output/img-components-4-1.png\\n\",\n      \"saved to output/img-components-4-2.png\\n\",\n      \"saved to output/img-components-4-3.png\\n\",\n      \"saved to output/img-components-4-4.png\\n\",\n      \"saved to output/img-components-4-5.png\\n\",\n      \"saved to output/img-components-4-6.png\\n\",\n      \"saved to output/img-components-4-7.png\\n\",\n      \"saved to output/img-components-5-0.png\\n\",\n      \"saved to output/img-components-5-1.png\\n\",\n      \"saved to output/img-components-5-2.png\\n\",\n      \"saved to output/img-components-5-3.png\\n\",\n      \"saved to output/img-components-5-4.png\\n\",\n      \"saved to output/img-components-5-5.png\\n\",\n      \"saved to output/img-components-5-6.png\\n\",\n      \"saved to output/img-components-5-7.png\\n\",\n      \"saved to output/img-components-6-0.png\\n\",\n      \"saved to output/img-components-6-1.png\\n\",\n      \"saved to output/img-components-6-2.png\\n\",\n      \"saved to output/img-components-6-3.png\\n\",\n      \"saved to output/img-components-6-4.png\\n\",\n      \"saved to output/img-components-6-5.png\\n\",\n      \"saved to output/img-components-6-6.png\\n\",\n      \"saved to output/img-components-6-7.png\\n\",\n      \"saved to output/img-components-7-0.png\\n\",\n      \"saved to output/img-components-7-1.png\\n\",\n      \"saved to output/img-components-7-2.png\\n\",\n      \"saved to output/img-components-7-3.png\\n\",\n      \"saved to output/img-components-7-4.png\\n\",\n      \"saved to output/img-components-7-5.png\\n\",\n      \"saved to output/img-components-7-6.png\\n\",\n      \"saved to output/img-components-7-7.png\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 64 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# Lets draw the compnents that come out\\n\",\n    \"\\n\",\n    \"# first need this function\\n\",\n    \"def lerp(a, b, amt):\\n\",\n    \"    '''Linear interpolate between a and b'''\\n\",\n    \"    return a + (b - a) * amt\\n\",\n    \"\\n\",\n    \"freqs = dct(dct(img, axis=0, norm='ortho'), axis=1, norm='ortho')\\n\",\n    \"\\n\",\n    \"fig, axes = plt.subplots(8, 8)\\n\",\n    \"\\n\",\n    \"for (x, y) in itertools.product(range(8), range(8)):\\n\",\n    \"    freq_select = np.zeros((8, 8))\\n\",\n    \"    freq_select[x, y] = 1\\n\",\n    \"    \\n\",\n    \"    new_freqs = np.multiply(freqs, freq_select)\\n\",\n    \"    \\n\",\n    \"    freq_img = idct(idct(new_freqs, axis=0, norm='ortho'), axis=1, norm='ortho')\\n\",\n    \"    \\n\",\n    \"    # If we draw everything with in the same scale it's hard to see the smaller patterns\\n\",\n    \"    # because they're so small and come out as mostly grey.\\n\",\n    \"    # But if we draw them all with their own scale we can't see the relative size.\\n\",\n    \"    # So we go somewhere between.\\n\",\n    \"    scale_adjust_amt = 0.1\\n\",\n    \"    vmin = lerp(freq_img.min(), -1, scale_adjust_amt)\\n\",\n    \"    vmax = lerp(freq_img.max(), 1, scale_adjust_amt)\\n\",\n    \"    \\n\",\n    \"    ax = axes[x, y]\\n\",\n    \"    ax.imshow(freq_img, vmin=vmin, vmax=vmax)\\n\",\n    \"    ax.axis('off')\\n\",\n    \"    save_image(freq_img, name='output/img-components-{}-{}.png'.format(x, y), vmin=vmin, vmax=vmax)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"jupyter\": {\n     \"outputs_hidden\": false\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 64 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# Now lets draw the image being built up\\n\",\n    \"freqs = dct(dct(img, axis=0, norm='ortho'), axis=1, norm='ortho')\\n\",\n    \"\\n\",\n    \"fig, axes = plt.subplots(8, 8)\\n\",\n    \"\\n\",\n    \"for (i, (x, y)) in enumerate(itertools.product(range(8), range(8))):\\n\",\n    \"    freq_select = np.zeros(8 * 8)\\n\",\n    \"    freq_select[:i+1] = 1\\n\",\n    \"    freq_select = freq_select.reshape((8, 8))\\n\",\n    \"    \\n\",\n    \"    new_freqs = np.multiply(freqs, freq_select)\\n\",\n    \"    \\n\",\n    \"    freq_img = idct(idct(new_freqs, axis=0, norm='ortho'), axis=1, norm='ortho')\\n\",\n    \"    \\n\",\n    \"    ax = axes[x, y]\\n\",\n    \"    ax.imshow(freq_img, vmin=0, vmax=1)\\n\",\n    \"    ax.axis('off')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"jupyter\": {\n     \"outputs_hidden\": false\n    }\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"array([[ 0.,  1.,  5.,  6.],\\n\",\n       \"       [ 2.,  4.,  7., 12.],\\n\",\n       \"       [ 3.,  8., 11., 13.],\\n\",\n       \"       [ 9., 10., 14., 15.]])\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Fill in a similar way to how jpegs do it?\\n\",\n    \"\\n\",\n    \"def loop_like_a_jpeg(size):\\n\",\n    \"    \\\"\\\"\\\"Generates a bunch of tuples that loop over a matrix in a zig-zag way\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    flip_dir = False\\n\",\n    \"    for i in range(size):\\n\",\n    \"        r = range(i + 1)\\n\",\n    \"        if flip_dir:\\n\",\n    \"            r = reversed(r)\\n\",\n    \"        \\n\",\n    \"        for j in r:\\n\",\n    \"            # Start at the right edge (0, i), and go upwards to the right\\n\",\n    \"            yield (0 + j, i - j)\\n\",\n    \"        flip_dir = not flip_dir\\n\",\n    \"\\n\",\n    \"    for i in range(1, size):\\n\",\n    \"        r = range(size - i)\\n\",\n    \"        if flip_dir:\\n\",\n    \"            r = reversed(r)\\n\",\n    \"        \\n\",\n    \"        for j in r:\\n\",\n    \"            # Start the the bottom edge (i, size-1) and go upwards to the right\\n\",\n    \"            yield(i + j, (size - 1) - j)\\n\",\n    \"        flip_dir = not flip_dir\\n\",\n    \"\\n\",\n    \"arr = np.zeros((4, 4))\\n\",\n    \"for (i, (x, y)) in enumerate(loop_like_a_jpeg(4)):\\n\",\n    \"#     print(x, y)\\n\",\n    \"    arr[y, x] = i\\n\",\n    \"arr\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"jupyter\": {\n     \"outputs_hidden\": false\n    }\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"saved to output/img-buildup-0-0.png\\n\",\n      \"saved to output/img-buildup-0-1.png\\n\",\n      \"saved to output/img-buildup-1-0.png\\n\",\n      \"saved to output/img-buildup-2-0.png\\n\",\n      \"saved to output/img-buildup-1-1.png\\n\",\n      \"saved to output/img-buildup-0-2.png\\n\",\n      \"saved to output/img-buildup-0-3.png\\n\",\n      \"saved to output/img-buildup-1-2.png\\n\",\n      \"saved to output/img-buildup-2-1.png\\n\",\n      \"saved to output/img-buildup-3-0.png\\n\",\n      \"saved to output/img-buildup-4-0.png\\n\",\n      \"saved to output/img-buildup-3-1.png\\n\",\n      \"saved to output/img-buildup-2-2.png\\n\",\n      \"saved to output/img-buildup-1-3.png\\n\",\n      \"saved to output/img-buildup-0-4.png\\n\",\n      \"saved to output/img-buildup-0-5.png\\n\",\n      \"saved to output/img-buildup-1-4.png\\n\",\n      \"saved to output/img-buildup-2-3.png\\n\",\n      \"saved to output/img-buildup-3-2.png\\n\",\n      \"saved to output/img-buildup-4-1.png\\n\",\n      \"saved to output/img-buildup-5-0.png\\n\",\n      \"saved to output/img-buildup-6-0.png\\n\",\n      \"saved to output/img-buildup-5-1.png\\n\",\n      \"saved to output/img-buildup-4-2.png\\n\",\n      \"saved to output/img-buildup-3-3.png\\n\",\n      \"saved to output/img-buildup-2-4.png\\n\",\n      \"saved to output/img-buildup-1-5.png\\n\",\n      \"saved to output/img-buildup-0-6.png\\n\",\n      \"saved to output/img-buildup-0-7.png\\n\",\n      \"saved to output/img-buildup-1-6.png\\n\",\n      \"saved to output/img-buildup-2-5.png\\n\",\n      \"saved to output/img-buildup-3-4.png\\n\",\n      \"saved to output/img-buildup-4-3.png\\n\",\n      \"saved to output/img-buildup-5-2.png\\n\",\n      \"saved to output/img-buildup-6-1.png\\n\",\n      \"saved to output/img-buildup-7-0.png\\n\",\n      \"saved to output/img-buildup-7-1.png\\n\",\n      \"saved to output/img-buildup-6-2.png\\n\",\n      \"saved to output/img-buildup-5-3.png\\n\",\n      \"saved to output/img-buildup-4-4.png\\n\",\n      \"saved to output/img-buildup-3-5.png\\n\",\n      \"saved to output/img-buildup-2-6.png\\n\",\n      \"saved to output/img-buildup-1-7.png\\n\",\n      \"saved to output/img-buildup-2-7.png\\n\",\n      \"saved to output/img-buildup-3-6.png\\n\",\n      \"saved to output/img-buildup-4-5.png\\n\",\n      \"saved to output/img-buildup-5-4.png\\n\",\n      \"saved to output/img-buildup-6-3.png\\n\",\n      \"saved to output/img-buildup-7-2.png\\n\",\n      \"saved to output/img-buildup-7-3.png\\n\",\n      \"saved to output/img-buildup-6-4.png\\n\",\n      \"saved to output/img-buildup-5-5.png\\n\",\n      \"saved to output/img-buildup-4-6.png\\n\",\n      \"saved to output/img-buildup-3-7.png\\n\",\n      \"saved to output/img-buildup-4-7.png\\n\",\n      \"saved to output/img-buildup-5-6.png\\n\",\n      \"saved to output/img-buildup-6-5.png\\n\",\n      \"saved to output/img-buildup-7-4.png\\n\",\n      \"saved to output/img-buildup-7-5.png\\n\",\n      \"saved to output/img-buildup-6-6.png\\n\",\n      \"saved to output/img-buildup-5-7.png\\n\",\n      \"saved to output/img-buildup-6-7.png\\n\",\n      \"saved to output/img-buildup-7-6.png\\n\",\n      \"saved to output/img-buildup-7-7.png\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 64 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"freqs = dct(dct(img, axis=0, norm='ortho'), axis=1, norm='ortho')\\n\",\n    \"\\n\",\n    \"fig, axes = plt.subplots(8, 8)\\n\",\n    \"\\n\",\n    \"freq_select = np.zeros((8, 8))\\n\",\n    \"for (y, x) in loop_like_a_jpeg(8):\\n\",\n    \"    freq_select[x, y] = 1;\\n\",\n    \"    \\n\",\n    \"    new_freqs = np.multiply(freqs, freq_select)\\n\",\n    \"    \\n\",\n    \"    freq_img = np.copy(idct(idct(new_freqs, axis=0, norm='ortho'), axis=1, norm='ortho'))\\n\",\n    \"    \\n\",\n    \"    ax = axes[x, y]\\n\",\n    \"    ax.imshow(freq_img, vmin=0, vmax=1)\\n\",\n    \"    ax.axis('off')\\n\",\n    \"    save_image(freq_img, name='output/img-buildup-{}-{}.png'.format(x, y), vmin=0, vmax=1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"hide_input\": false,\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.8.8\"\n  },\n  \"toc\": {\n   \"base_numbering\": 1,\n   \"nav_menu\": {},\n   \"number_sections\": true,\n   \"sideBar\": true,\n   \"skip_h1_title\": false,\n   \"title_cell\": \"Table of Contents\",\n   \"title_sidebar\": \"Contents\",\n   \"toc_cell\": false,\n   \"toc_position\": {},\n   \"toc_section_display\": true,\n   \"toc_window_display\": false\n  },\n  \"varInspector\": {\n   \"cols\": {\n    \"lenName\": 16,\n    \"lenType\": 16,\n    \"lenVar\": 40\n   },\n   \"kernels_config\": {\n    \"python\": {\n     \"delete_cmd_postfix\": \"\",\n     \"delete_cmd_prefix\": \"del \",\n     \"library\": \"var_list.py\",\n     \"varRefreshCmd\": \"print(var_dic_list())\"\n    },\n    \"r\": {\n     \"delete_cmd_postfix\": \") \",\n     \"delete_cmd_prefix\": \"rm(\",\n     \"library\": \"var_list.r\",\n     \"varRefreshCmd\": \"cat(var_dic_list()) \"\n    }\n   },\n   \"types_to_exclude\": [\n    \"module\",\n    \"function\",\n    \"builtin_function_or_method\",\n    \"instance\",\n    \"_Feature\"\n   ],\n   \"window_display\": false\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "02_Python/FP_Growth.py",
    "content": "#================================================================================================================\n#----------------------------------------------------------------------------------------------------------------\n#\t\t\t\t\t\t\t\t\tFREQUENT PATTERN GROWTH\n#----------------------------------------------------------------------------------------------------------------\n#================================================================================================================\n\n\nimport numpy as np\nimport pandas as pd \n\n\nclass FPGrowth:\n\tdef __init__(self, k =3, tolerance = 0.0001, max_iterations = 500):\n\t\tpass\n\t\t\n\t\t\ndef main():\n\tpass\n\nif __name__ == \"__main__\":\n\tmain()\n"
  },
  {
    "path": "02_Python/Genetic_Algorithm.py",
    "content": "import copy\n\nimport numpy as np\nimport pandas as pd\n\n\nclass CustomGeneticAlgorithm():\n\n    def server_present(self, server, time):\n        server_start_time = server[1]\n        server_duration = server[2]\n        server_end_time = server_start_time + server_duration\n        if (time >= server_start_time) and (time < server_end_time):\n            return True\n        return False\n\n    def deployed_to_hourlyplanning(self, deployed_hourly_cron_capacity):\n\n        deployed_hourly_cron_capacity_week = []\n        for day in deployed_hourly_cron_capacity:\n\n            deployed_hourly_cron_capacity_day = []\n            for server in day:\n\n                server_present_hour = []\n                for time in range(0, 24):\n\n                    server_present_hour.append(\n                        self.server_present(server, time))\n\n                deployed_hourly_cron_capacity_day.append(server_present_hour)\n\n            deployed_hourly_cron_capacity_week.append(\n                deployed_hourly_cron_capacity_day)\n\n        deployed_hourly_cron_capacity_week = np.array(\n            deployed_hourly_cron_capacity_week).sum(axis=1)\n        return deployed_hourly_cron_capacity_week\n\n    def generate_random_plan(self, n_days, n_racks):\n        period_planning = []\n        for _ in range(n_days):\n            day_planning = []\n            for server_id in range(n_racks):\n                start_time = np.random.randint(0, 23)\n                machines = np.random.randint(0, 12)\n                server = [server_id, start_time, machines]\n                day_planning.append(server)\n\n            period_planning.append(day_planning)\n\n        return period_planning\n\n    def generate_initial_population(self, population_size, n_days=7, n_racks=11):\n        population = []\n        for _ in range(population_size):\n            member = self.generate_random_plan(\n                n_days=n_days, n_racks=n_racks)\n            population.append(member)\n        return population\n\n    def calculate_fitness(self, deployed_hourly_cron_capacity, required_hourly_cron_capacity):\n        deviation = deployed_hourly_cron_capacity - required_hourly_cron_capacity\n        overcapacity = abs(deviation[deviation > 0].sum())\n        undercapacity = abs(deviation[deviation < 0].sum())\n\n        overcapacity_cost = 0.5\n        undercapacity_cost = 3\n\n        fitness = overcapacity_cost * overcapacity + undercapacity_cost * undercapacity\n        return fitness\n\n    def crossover(self, population, n_offspring):\n        n_population = len(population)\n\n        offspring = []\n\n        for _ in range(n_offspring):\n            random_one = population[np.random.randint(\n                low=0, high=n_population - 1)]\n            random_two = population[np.random.randint(\n                low=0, high=n_population - 1)]\n\n            dad_mask = np.random.randint(0, 2, size=np.array(random_one).shape)\n            mom_mask = np.logical_not(dad_mask)\n\n            child = np.add(np.multiply(random_one, dad_mask),\n                           np.multiply(random_two, mom_mask))\n\n            offspring.append(child)\n        return offspring\n\n    def mutate_parent(self, parent, n_mutations):\n        size1 = parent.shape[0]\n        size2 = parent.shape[1]\n\n        for _ in range(n_mutations):\n            rand1 = np.random.randint(0, size1)\n            rand2 = np.random.randint(0, size2)\n            rand3 = np.random.randint(0, 2)\n            parent[rand1, rand2, rand3] = np.random.randint(0, 12)\n        return parent\n\n    def mutate_gen(self, population, n_mutations):\n        mutated_population = []\n        for parent in population:\n            mutated_population.append(self.mutate_parent(parent, n_mutations))\n        return mutated_population\n\n    def is_acceptable(self, parent):\n        return np.logical_not((np.array(parent)[:, :, 2:] > 12).any())\n\n    def select_acceptable(self, population):\n        population = [\n            parent for parent in population if self.is_acceptable(parent)]\n        return population\n\n    def select_best(self, population, required_hourly_cron_capacity, n_best):\n        fitness = []\n        for idx, deployed_hourly_cron_capacity in enumerate(population):\n\n            deployed_hourly_cron_capacity = self.deployed_to_hourlyplanning(\n                deployed_hourly_cron_capacity)\n            parent_fitness = self.calculate_fitness(deployed_hourly_cron_capacity,\n                                                    required_hourly_cron_capacity)\n            fitness.append([idx, parent_fitness])\n\n        print('Current generation\\'s optimal schedule has cost: {}'.format(\n            pd.DataFrame(fitness)[1].min()))\n\n        fitness_tmp = pd.DataFrame(fitness).sort_values(\n            by=1, ascending=True).reset_index(drop=True)\n        selected_parents_idx = list(fitness_tmp.iloc[:n_best, 0])\n        selected_parents = [parent for idx, parent in enumerate(\n            population) if idx in selected_parents_idx]\n\n        return selected_parents\n\n    def run(self, required_hourly_cron_capacity, n_iterations, n_population_size=500):\n\n        population = self.generate_initial_population(\n            population_size=n_population_size, n_days=5, n_racks=24)\n        for _ in range(n_iterations):\n            population = self.select_acceptable(population)\n            population = self.select_best(\n                population, required_hourly_cron_capacity, n_best=100)\n            population = self.crossover(\n                population, n_offspring=n_population_size)\n            population = self.mutate_gen(population, n_mutations=1)\n\n        best_child = self.select_best(\n            population, required_hourly_cron_capacity, n_best=1)\n        return best_child\n\n\ndef main():\n\n    # Reading from the data file\n    df = pd.read_csv(\"./data/cron_jobs_schedule.csv\")\n\n    dataset = df.astype(int).values.tolist()\n\n    required_hourly_cron_capacity = [\n        [0 for _ in range(24)] for _ in range(5)]\n\n    for record in dataset:\n        required_hourly_cron_capacity[record[1]][record[2]] += record[3]\n\n    genetic_algorithm = CustomGeneticAlgorithm()\n    optimal_schedule = genetic_algorithm.run(\n        required_hourly_cron_capacity, n_iterations=100)\n    print('\\nOptimal Server Schedule: \\n',\n          genetic_algorithm.deployed_to_hourlyplanning(optimal_schedule[0]))\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "02_Python/K-Means_Implementation/Iris.csv",
    "content": "Id,SepalLengthCm,SepalWidthCm,PetalLengthCm,PetalWidthCm,Species\n1,5.1,3.5,1.4,0.2,Iris-setosa\n2,4.9,3.0,1.4,0.2,Iris-setosa\n3,4.7,3.2,1.3,0.2,Iris-setosa\n4,4.6,3.1,1.5,0.2,Iris-setosa\n5,5.0,3.6,1.4,0.2,Iris-setosa\n6,5.4,3.9,1.7,0.4,Iris-setosa\n7,4.6,3.4,1.4,0.3,Iris-setosa\n8,5.0,3.4,1.5,0.2,Iris-setosa\n9,4.4,2.9,1.4,0.2,Iris-setosa\n10,4.9,3.1,1.5,0.1,Iris-setosa\n11,5.4,3.7,1.5,0.2,Iris-setosa\n12,4.8,3.4,1.6,0.2,Iris-setosa\n13,4.8,3.0,1.4,0.1,Iris-setosa\n14,4.3,3.0,1.1,0.1,Iris-setosa\n15,5.8,4.0,1.2,0.2,Iris-setosa\n16,5.7,4.4,1.5,0.4,Iris-setosa\n17,5.4,3.9,1.3,0.4,Iris-setosa\n18,5.1,3.5,1.4,0.3,Iris-setosa\n19,5.7,3.8,1.7,0.3,Iris-setosa\n20,5.1,3.8,1.5,0.3,Iris-setosa\n21,5.4,3.4,1.7,0.2,Iris-setosa\n22,5.1,3.7,1.5,0.4,Iris-setosa\n23,4.6,3.6,1.0,0.2,Iris-setosa\n24,5.1,3.3,1.7,0.5,Iris-setosa\n25,4.8,3.4,1.9,0.2,Iris-setosa\n26,5.0,3.0,1.6,0.2,Iris-setosa\n27,5.0,3.4,1.6,0.4,Iris-setosa\n28,5.2,3.5,1.5,0.2,Iris-setosa\n29,5.2,3.4,1.4,0.2,Iris-setosa\n30,4.7,3.2,1.6,0.2,Iris-setosa\n31,4.8,3.1,1.6,0.2,Iris-setosa\n32,5.4,3.4,1.5,0.4,Iris-setosa\n33,5.2,4.1,1.5,0.1,Iris-setosa\n34,5.5,4.2,1.4,0.2,Iris-setosa\n35,4.9,3.1,1.5,0.1,Iris-setosa\n36,5.0,3.2,1.2,0.2,Iris-setosa\n37,5.5,3.5,1.3,0.2,Iris-setosa\n38,4.9,3.1,1.5,0.1,Iris-setosa\n39,4.4,3.0,1.3,0.2,Iris-setosa\n40,5.1,3.4,1.5,0.2,Iris-setosa\n41,5.0,3.5,1.3,0.3,Iris-setosa\n42,4.5,2.3,1.3,0.3,Iris-setosa\n43,4.4,3.2,1.3,0.2,Iris-setosa\n44,5.0,3.5,1.6,0.6,Iris-setosa\n45,5.1,3.8,1.9,0.4,Iris-setosa\n46,4.8,3.0,1.4,0.3,Iris-setosa\n47,5.1,3.8,1.6,0.2,Iris-setosa\n48,4.6,3.2,1.4,0.2,Iris-setosa\n49,5.3,3.7,1.5,0.2,Iris-setosa\n50,5.0,3.3,1.4,0.2,Iris-setosa\n51,7.0,3.2,4.7,1.4,Iris-versicolor\n52,6.4,3.2,4.5,1.5,Iris-versicolor\n53,6.9,3.1,4.9,1.5,Iris-versicolor\n54,5.5,2.3,4.0,1.3,Iris-versicolor\n55,6.5,2.8,4.6,1.5,Iris-versicolor\n56,5.7,2.8,4.5,1.3,Iris-versicolor\n57,6.3,3.3,4.7,1.6,Iris-versicolor\n58,4.9,2.4,3.3,1.0,Iris-versicolor\n59,6.6,2.9,4.6,1.3,Iris-versicolor\n60,5.2,2.7,3.9,1.4,Iris-versicolor\n61,5.0,2.0,3.5,1.0,Iris-versicolor\n62,5.9,3.0,4.2,1.5,Iris-versicolor\n63,6.0,2.2,4.0,1.0,Iris-versicolor\n64,6.1,2.9,4.7,1.4,Iris-versicolor\n65,5.6,2.9,3.6,1.3,Iris-versicolor\n66,6.7,3.1,4.4,1.4,Iris-versicolor\n67,5.6,3.0,4.5,1.5,Iris-versicolor\n68,5.8,2.7,4.1,1.0,Iris-versicolor\n69,6.2,2.2,4.5,1.5,Iris-versicolor\n70,5.6,2.5,3.9,1.1,Iris-versicolor\n71,5.9,3.2,4.8,1.8,Iris-versicolor\n72,6.1,2.8,4.0,1.3,Iris-versicolor\n73,6.3,2.5,4.9,1.5,Iris-versicolor\n74,6.1,2.8,4.7,1.2,Iris-versicolor\n75,6.4,2.9,4.3,1.3,Iris-versicolor\n76,6.6,3.0,4.4,1.4,Iris-versicolor\n77,6.8,2.8,4.8,1.4,Iris-versicolor\n78,6.7,3.0,5.0,1.7,Iris-versicolor\n79,6.0,2.9,4.5,1.5,Iris-versicolor\n80,5.7,2.6,3.5,1.0,Iris-versicolor\n81,5.5,2.4,3.8,1.1,Iris-versicolor\n82,5.5,2.4,3.7,1.0,Iris-versicolor\n83,5.8,2.7,3.9,1.2,Iris-versicolor\n84,6.0,2.7,5.1,1.6,Iris-versicolor\n85,5.4,3.0,4.5,1.5,Iris-versicolor\n86,6.0,3.4,4.5,1.6,Iris-versicolor\n87,6.7,3.1,4.7,1.5,Iris-versicolor\n88,6.3,2.3,4.4,1.3,Iris-versicolor\n89,5.6,3.0,4.1,1.3,Iris-versicolor\n90,5.5,2.5,4.0,1.3,Iris-versicolor\n91,5.5,2.6,4.4,1.2,Iris-versicolor\n92,6.1,3.0,4.6,1.4,Iris-versicolor\n93,5.8,2.6,4.0,1.2,Iris-versicolor\n94,5.0,2.3,3.3,1.0,Iris-versicolor\n95,5.6,2.7,4.2,1.3,Iris-versicolor\n96,5.7,3.0,4.2,1.2,Iris-versicolor\n97,5.7,2.9,4.2,1.3,Iris-versicolor\n98,6.2,2.9,4.3,1.3,Iris-versicolor\n99,5.1,2.5,3.0,1.1,Iris-versicolor\n100,5.7,2.8,4.1,1.3,Iris-versicolor\n101,6.3,3.3,6.0,2.5,Iris-virginica\n102,5.8,2.7,5.1,1.9,Iris-virginica\n103,7.1,3.0,5.9,2.1,Iris-virginica\n104,6.3,2.9,5.6,1.8,Iris-virginica\n105,6.5,3.0,5.8,2.2,Iris-virginica\n106,7.6,3.0,6.6,2.1,Iris-virginica\n107,4.9,2.5,4.5,1.7,Iris-virginica\n108,7.3,2.9,6.3,1.8,Iris-virginica\n109,6.7,2.5,5.8,1.8,Iris-virginica\n110,7.2,3.6,6.1,2.5,Iris-virginica\n111,6.5,3.2,5.1,2.0,Iris-virginica\n112,6.4,2.7,5.3,1.9,Iris-virginica\n113,6.8,3.0,5.5,2.1,Iris-virginica\n114,5.7,2.5,5.0,2.0,Iris-virginica\n115,5.8,2.8,5.1,2.4,Iris-virginica\n116,6.4,3.2,5.3,2.3,Iris-virginica\n117,6.5,3.0,5.5,1.8,Iris-virginica\n118,7.7,3.8,6.7,2.2,Iris-virginica\n119,7.7,2.6,6.9,2.3,Iris-virginica\n120,6.0,2.2,5.0,1.5,Iris-virginica\n121,6.9,3.2,5.7,2.3,Iris-virginica\n122,5.6,2.8,4.9,2.0,Iris-virginica\n123,7.7,2.8,6.7,2.0,Iris-virginica\n124,6.3,2.7,4.9,1.8,Iris-virginica\n125,6.7,3.3,5.7,2.1,Iris-virginica\n126,7.2,3.2,6.0,1.8,Iris-virginica\n127,6.2,2.8,4.8,1.8,Iris-virginica\n128,6.1,3.0,4.9,1.8,Iris-virginica\n129,6.4,2.8,5.6,2.1,Iris-virginica\n130,7.2,3.0,5.8,1.6,Iris-virginica\n131,7.4,2.8,6.1,1.9,Iris-virginica\n132,7.9,3.8,6.4,2.0,Iris-virginica\n133,6.4,2.8,5.6,2.2,Iris-virginica\n134,6.3,2.8,5.1,1.5,Iris-virginica\n135,6.1,2.6,5.6,1.4,Iris-virginica\n136,7.7,3.0,6.1,2.3,Iris-virginica\n137,6.3,3.4,5.6,2.4,Iris-virginica\n138,6.4,3.1,5.5,1.8,Iris-virginica\n139,6.0,3.0,4.8,1.8,Iris-virginica\n140,6.9,3.1,5.4,2.1,Iris-virginica\n141,6.7,3.1,5.6,2.4,Iris-virginica\n142,6.9,3.1,5.1,2.3,Iris-virginica\n143,5.8,2.7,5.1,1.9,Iris-virginica\n144,6.8,3.2,5.9,2.3,Iris-virginica\n145,6.7,3.3,5.7,2.5,Iris-virginica\n146,6.7,3.0,5.2,2.3,Iris-virginica\n147,6.3,2.5,5.0,1.9,Iris-virginica\n148,6.5,3.0,5.2,2.0,Iris-virginica\n149,6.2,3.4,5.4,2.3,Iris-virginica\n150,5.9,3.0,5.1,1.8,Iris-virginica\n"
  },
  {
    "path": "02_Python/K-Means_Implementation/K-Means_Clustering_on_Iris_Dataset.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<a href=\\\"https://github.com/milaan9/Clustering_Algorithms_from_Scratch/tree/main/02_Python\\\"><img src=\\\"https://img.shields.io/badge/All the IPython Notebooks in \\n\",\n    \"Clustering_Algorithms_from_Scratch lecture series by Dr. Milaan Parmar are available ➔ -GitHub-blueviolet.svg\\\" alt=\\\"logo\\\"/></a>\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"UID9RK1qDlVB\"\n   },\n   \"source\": [\n    \"## K- Means Clustering\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"colab\": {\n     \"base_uri\": \"https://localhost:8080/\",\n     \"height\": 195\n    },\n    \"colab_type\": \"code\",\n    \"executionInfo\": {\n     \"elapsed\": 835,\n     \"status\": \"ok\",\n     \"timestamp\": 1544240454142,\n     \"user\": {\n      \"displayName\": \"A M Aditya\",\n      \"photoUrl\": \"https://lh3.googleusercontent.com/-WI8p7JNWLic/AAAAAAAAAAI/AAAAAAAAAfs/vS8ElgH0p0c/s64/photo.jpg\",\n      \"userId\": \"15341571102300750919\"\n     },\n     \"user_tz\": -480\n    },\n    \"id\": \"kO_1kOEGDTws\",\n    \"outputId\": \"24bb4b2a-2342-4c91-c702-b127a5391152\"\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<div>\\n\",\n       \"<style scoped>\\n\",\n       \"    .dataframe tbody tr th:only-of-type {\\n\",\n       \"        vertical-align: middle;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe tbody tr th {\\n\",\n       \"        vertical-align: top;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe thead th {\\n\",\n       \"        text-align: right;\\n\",\n       \"    }\\n\",\n       \"</style>\\n\",\n       \"<table border=\\\"1\\\" class=\\\"dataframe\\\">\\n\",\n       \"  <thead>\\n\",\n       \"    <tr style=\\\"text-align: right;\\\">\\n\",\n       \"      <th></th>\\n\",\n       \"      <th>SepalLengthCm</th>\\n\",\n       \"      <th>SepalWidthCm</th>\\n\",\n       \"      <th>PetalLengthCm</th>\\n\",\n       \"      <th>PetalWidthCm</th>\\n\",\n       \"      <th>Species</th>\\n\",\n       \"    </tr>\\n\",\n       \"  </thead>\\n\",\n       \"  <tbody>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>0</th>\\n\",\n       \"      <td>5.1</td>\\n\",\n       \"      <td>3.5</td>\\n\",\n       \"      <td>1.4</td>\\n\",\n       \"      <td>0.2</td>\\n\",\n       \"      <td>Iris-setosa</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>1</th>\\n\",\n       \"      <td>4.9</td>\\n\",\n       \"      <td>3.0</td>\\n\",\n       \"      <td>1.4</td>\\n\",\n       \"      <td>0.2</td>\\n\",\n       \"      <td>Iris-setosa</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>2</th>\\n\",\n       \"      <td>4.7</td>\\n\",\n       \"      <td>3.2</td>\\n\",\n       \"      <td>1.3</td>\\n\",\n       \"      <td>0.2</td>\\n\",\n       \"      <td>Iris-setosa</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>3</th>\\n\",\n       \"      <td>4.6</td>\\n\",\n       \"      <td>3.1</td>\\n\",\n       \"      <td>1.5</td>\\n\",\n       \"      <td>0.2</td>\\n\",\n       \"      <td>Iris-setosa</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>4</th>\\n\",\n       \"      <td>5.0</td>\\n\",\n       \"      <td>3.6</td>\\n\",\n       \"      <td>1.4</td>\\n\",\n       \"      <td>0.2</td>\\n\",\n       \"      <td>Iris-setosa</td>\\n\",\n       \"    </tr>\\n\",\n       \"  </tbody>\\n\",\n       \"</table>\\n\",\n       \"</div>\"\n      ],\n      \"text/plain\": [\n       \"   SepalLengthCm  SepalWidthCm  PetalLengthCm  PetalWidthCm      Species\\n\",\n       \"0            5.1           3.5            1.4           0.2  Iris-setosa\\n\",\n       \"1            4.9           3.0            1.4           0.2  Iris-setosa\\n\",\n       \"2            4.7           3.2            1.3           0.2  Iris-setosa\\n\",\n       \"3            4.6           3.1            1.5           0.2  Iris-setosa\\n\",\n       \"4            5.0           3.6            1.4           0.2  Iris-setosa\"\n      ]\n     },\n     \"execution_count\": 1,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Importing the libraries\\n\",\n    \"import numpy as np\\n\",\n    \"import matplotlib.pyplot as plt\\n\",\n    \"import pandas as pd\\n\",\n    \"import seaborn as sns\\n\",\n    \"from sklearn import datasets\\n\",\n    \"\\n\",\n    \"# Load the iris dataset\\n\",\n    \"iris = pd.read_csv(\\\"Iris.csv\\\")\\n\",\n    \"iris.drop([\\\"Id\\\"],axis=1,inplace=True)\\n\",\n    \"iris.head()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/html\": [\n       \"<div>\\n\",\n       \"<style scoped>\\n\",\n       \"    .dataframe tbody tr th:only-of-type {\\n\",\n       \"        vertical-align: middle;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe tbody tr th {\\n\",\n       \"        vertical-align: top;\\n\",\n       \"    }\\n\",\n       \"\\n\",\n       \"    .dataframe thead th {\\n\",\n       \"        text-align: right;\\n\",\n       \"    }\\n\",\n       \"</style>\\n\",\n       \"<table border=\\\"1\\\" class=\\\"dataframe\\\">\\n\",\n       \"  <thead>\\n\",\n       \"    <tr style=\\\"text-align: right;\\\">\\n\",\n       \"      <th></th>\\n\",\n       \"      <th>SepalLengthCm</th>\\n\",\n       \"      <th>SepalWidthCm</th>\\n\",\n       \"      <th>PetalLengthCm</th>\\n\",\n       \"      <th>PetalWidthCm</th>\\n\",\n       \"    </tr>\\n\",\n       \"  </thead>\\n\",\n       \"  <tbody>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>count</th>\\n\",\n       \"      <td>150.000000</td>\\n\",\n       \"      <td>150.000000</td>\\n\",\n       \"      <td>150.000000</td>\\n\",\n       \"      <td>150.000000</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>mean</th>\\n\",\n       \"      <td>5.843333</td>\\n\",\n       \"      <td>3.054000</td>\\n\",\n       \"      <td>3.758667</td>\\n\",\n       \"      <td>1.198667</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>std</th>\\n\",\n       \"      <td>0.828066</td>\\n\",\n       \"      <td>0.433594</td>\\n\",\n       \"      <td>1.764420</td>\\n\",\n       \"      <td>0.763161</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>min</th>\\n\",\n       \"      <td>4.300000</td>\\n\",\n       \"      <td>2.000000</td>\\n\",\n       \"      <td>1.000000</td>\\n\",\n       \"      <td>0.100000</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>25%</th>\\n\",\n       \"      <td>5.100000</td>\\n\",\n       \"      <td>2.800000</td>\\n\",\n       \"      <td>1.600000</td>\\n\",\n       \"      <td>0.300000</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>50%</th>\\n\",\n       \"      <td>5.800000</td>\\n\",\n       \"      <td>3.000000</td>\\n\",\n       \"      <td>4.350000</td>\\n\",\n       \"      <td>1.300000</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>75%</th>\\n\",\n       \"      <td>6.400000</td>\\n\",\n       \"      <td>3.300000</td>\\n\",\n       \"      <td>5.100000</td>\\n\",\n       \"      <td>1.800000</td>\\n\",\n       \"    </tr>\\n\",\n       \"    <tr>\\n\",\n       \"      <th>max</th>\\n\",\n       \"      <td>7.900000</td>\\n\",\n       \"      <td>4.400000</td>\\n\",\n       \"      <td>6.900000</td>\\n\",\n       \"      <td>2.500000</td>\\n\",\n       \"    </tr>\\n\",\n       \"  </tbody>\\n\",\n       \"</table>\\n\",\n       \"</div>\"\n      ],\n      \"text/plain\": [\n       \"       SepalLengthCm  SepalWidthCm  PetalLengthCm  PetalWidthCm\\n\",\n       \"count     150.000000    150.000000     150.000000    150.000000\\n\",\n       \"mean        5.843333      3.054000       3.758667      1.198667\\n\",\n       \"std         0.828066      0.433594       1.764420      0.763161\\n\",\n       \"min         4.300000      2.000000       1.000000      0.100000\\n\",\n       \"25%         5.100000      2.800000       1.600000      0.300000\\n\",\n       \"50%         5.800000      3.000000       4.350000      1.300000\\n\",\n       \"75%         6.400000      3.300000       5.100000      1.800000\\n\",\n       \"max         7.900000      4.400000       6.900000      2.500000\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"# Getting the Statistical Information\\n\",\n    \"iris.describe()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"<class 'pandas.core.frame.DataFrame'>\\n\",\n      \"RangeIndex: 150 entries, 0 to 149\\n\",\n      \"Data columns (total 5 columns):\\n\",\n      \" #   Column         Non-Null Count  Dtype  \\n\",\n      \"---  ------         --------------  -----  \\n\",\n      \" 0   SepalLengthCm  150 non-null    float64\\n\",\n      \" 1   SepalWidthCm   150 non-null    float64\\n\",\n      \" 2   PetalLengthCm  150 non-null    float64\\n\",\n      \" 3   PetalWidthCm   150 non-null    float64\\n\",\n      \" 4   Species        150 non-null    object \\n\",\n      \"dtypes: float64(4), object(1)\\n\",\n      \"memory usage: 6.0+ KB\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# Lets check for datatypes\\n\",\n    \"iris.info()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Using Pairplots for better understanding of the data points distribution\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 823.25x720 with 20 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"sns.pairplot(data=iris,hue=\\\"Species\\\",palette=\\\"Set1\\\")\\n\",\n    \"plt.show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"From above visuals iris-setosa is easily separable from the other two.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from sklearn.cluster import KMeans\\n\",\n    \"features = iris.loc[:,[\\\"SepalLengthCm\\\",\\\"SepalWidthCm\\\",\\\"PetalLengthCm\\\",\\\"PetalWidthCm\\\"]]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"q_pPmK9GIKMz\"\n   },\n   \"source\": [\n    \"#### Below snippet shows how we can find the optimum number of clusters for K Means and how can we determine the value of K?\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"colab\": {\n     \"base_uri\": \"https://localhost:8080/\",\n     \"height\": 376\n    },\n    \"colab_type\": \"code\",\n    \"executionInfo\": {\n     \"elapsed\": 1649,\n     \"status\": \"ok\",\n     \"timestamp\": 1544110062756,\n     \"user\": {\n      \"displayName\": \"A M Aditya\",\n      \"photoUrl\": \"https://lh3.googleusercontent.com/-WI8p7JNWLic/AAAAAAAAAAI/AAAAAAAAAfs/vS8ElgH0p0c/s64/photo.jpg\",\n      \"userId\": \"15341571102300750919\"\n     },\n     \"user_tz\": -480\n    },\n    \"id\": \"WevSKogFEalU\",\n    \"outputId\": \"d0161248-67f2-48a4-cf4b-224f8faae045\"\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# Finding the optimum number of clusters for k-means classification\\n\",\n    \"\\n\",\n    \"x = iris.iloc[:, [0, 1, 2, 3]].values\\n\",\n    \"\\n\",\n    \"from sklearn.cluster import KMeans\\n\",\n    \"wcss = []\\n\",\n    \"\\n\",\n    \"for i in range(1, 11):\\n\",\n    \"    kmeans = KMeans(n_clusters = i, init = 'k-means++', \\n\",\n    \"                    max_iter = 300, n_init = 10, random_state = 0)\\n\",\n    \"    kmeans.fit(x)\\n\",\n    \"    wcss.append(kmeans.inertia_)\\n\",\n    \"    \\n\",\n    \"# Plotting the results onto a line graph, \\n\",\n    \"# `allowing us to observe 'The elbow'\\n\",\n    \"plt.plot(range(1, 11), wcss)\\n\",\n    \"plt.title('The elbow method')\\n\",\n    \"plt.xlabel('Number of clusters')\\n\",\n    \"plt.ylabel('WCSS') # Within cluster sum of squares\\n\",\n    \"plt.show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"colab_type\": \"text\",\n    \"id\": \"IUXmLTh4Ih6r\"\n   },\n   \"source\": [\n    \"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    \"\\n\",\n    \"From this we choose the number of clusters as **3**.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Verifying visually that with which cluster number, K-means will be optimum\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"scrolled\": true\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 1728x288 with 5 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"plt.figure(figsize=(24,4))\\n\",\n    \"\\n\",\n    \"plt.suptitle(\\\"K Means Clustering\\\",fontsize=20)\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"plt.subplot(1,5,1)\\n\",\n    \"plt.title(\\\"K = 1\\\",fontsize=16)\\n\",\n    \"plt.xlabel(\\\"PetalLengthCm\\\")\\n\",\n    \"plt.ylabel(\\\"PetalWidthCm\\\")\\n\",\n    \"plt.scatter(features.PetalLengthCm,features.PetalWidthCm)\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"plt.subplot(1,5,2)\\n\",\n    \"plt.title(\\\"K = 2\\\",fontsize=16)\\n\",\n    \"plt.xlabel(\\\"PetalLengthCm\\\")\\n\",\n    \"kmeans = KMeans(n_clusters=2)\\n\",\n    \"features[\\\"labels\\\"] = kmeans.fit_predict(features)\\n\",\n    \"plt.scatter(features.PetalLengthCm[features.labels == 0],features.PetalWidthCm[features.labels == 0])\\n\",\n    \"plt.scatter(features.PetalLengthCm[features.labels == 1],features.PetalWidthCm[features.labels == 1])\\n\",\n    \"\\n\",\n    \"# dropping labels we only want to use features.\\n\",\n    \"features.drop([\\\"labels\\\"],axis=1,inplace=True)\\n\",\n    \"\\n\",\n    \"plt.subplot(1,5,4)\\n\",\n    \"plt.title(\\\"K = 3\\\",fontsize=16)\\n\",\n    \"plt.xlabel(\\\"PetalLengthCm\\\")\\n\",\n    \"kmeans = KMeans(n_clusters=3)\\n\",\n    \"features[\\\"labels\\\"] = kmeans.fit_predict(features)\\n\",\n    \"plt.scatter(features.PetalLengthCm[features.labels == 0],features.PetalWidthCm[features.labels == 0])\\n\",\n    \"plt.scatter(features.PetalLengthCm[features.labels == 1],features.PetalWidthCm[features.labels == 1])\\n\",\n    \"plt.scatter(features.PetalLengthCm[features.labels == 2],features.PetalWidthCm[features.labels == 2])\\n\",\n    \"\\n\",\n    \"# dropping labels as we only want to use features.\\n\",\n    \"features.drop([\\\"labels\\\"],axis=1,inplace=True)\\n\",\n    \"\\n\",\n    \"plt.subplot(1,5,3)\\n\",\n    \"plt.title(\\\"K = 4\\\",fontsize=16)\\n\",\n    \"plt.xlabel(\\\"PetalLengthCm\\\")\\n\",\n    \"kmeans = KMeans(n_clusters=4)\\n\",\n    \"features[\\\"labels\\\"] = kmeans.fit_predict(features)\\n\",\n    \"plt.scatter(features.PetalLengthCm[features.labels == 0],features.PetalWidthCm[features.labels == 0])\\n\",\n    \"plt.scatter(features.PetalLengthCm[features.labels == 1],features.PetalWidthCm[features.labels == 1])\\n\",\n    \"plt.scatter(features.PetalLengthCm[features.labels == 2],features.PetalWidthCm[features.labels == 2])\\n\",\n    \"plt.scatter(features.PetalLengthCm[features.labels == 3],features.PetalWidthCm[features.labels == 3])\\n\",\n    \"\\n\",\n    \"# dropping labels as we only want to use features.\\n\",\n    \"features.drop([\\\"labels\\\"],axis=1,inplace=True)\\n\",\n    \"\\n\",\n    \"plt.subplot(1,5,5)\\n\",\n    \"plt.title(\\\"Original Labels\\\",fontsize=16)\\n\",\n    \"plt.xlabel(\\\"PetalLengthCm\\\")\\n\",\n    \"plt.scatter(iris.PetalLengthCm[iris.Species == \\\"Iris-setosa\\\"],iris.PetalWidthCm[iris.Species == \\\"Iris-setosa\\\"])\\n\",\n    \"plt.scatter(iris.PetalLengthCm[iris.Species == \\\"Iris-versicolor\\\"],iris.PetalWidthCm[iris.Species == \\\"Iris-versicolor\\\"])\\n\",\n    \"plt.scatter(iris.PetalLengthCm[iris.Species == \\\"Iris-virginica\\\"],iris.PetalWidthCm[iris.Species == \\\"Iris-virginica\\\"])\\n\",\n    \"\\n\",\n    \"plt.subplots_adjust(top=0.8)\\n\",\n    \"plt.show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"colab\": {},\n    \"colab_type\": \"code\",\n    \"id\": \"aJbyXuNGIXI9\"\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# Applying kmeans to the dataset / Creating the kmeans classifier\\n\",\n    \"kmeans = KMeans(n_clusters = 3, init = 'k-means++',\\n\",\n    \"                max_iter = 300, n_init = 10, random_state = 0)\\n\",\n    \"y_kmeans = kmeans.fit_predict(x)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"colab\": {\n     \"base_uri\": \"https://localhost:8080/\",\n     \"height\": 364\n    },\n    \"colab_type\": \"code\",\n    \"executionInfo\": {\n     \"elapsed\": 670,\n     \"status\": \"ok\",\n     \"timestamp\": 1544110172140,\n     \"user\": {\n      \"displayName\": \"A M Aditya\",\n      \"photoUrl\": \"https://lh3.googleusercontent.com/-WI8p7JNWLic/AAAAAAAAAAI/AAAAAAAAAfs/vS8ElgH0p0c/s64/photo.jpg\",\n      \"userId\": \"15341571102300750919\"\n     },\n     \"user_tz\": -480\n    },\n    \"id\": \"Q42-XPJjIyXv\",\n    \"outputId\": \"12284613-40c5-41c6-93ba-6b66fae0aa5f\"\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<matplotlib.legend.Legend at 0x2574b4c14e0>\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# Visualising the clusters - On the first two columns\\n\",\n    \"plt.scatter(x[y_kmeans == 0, 0], x[y_kmeans == 0, 1], \\n\",\n    \"            s = 100, c = 'red', label = 'Iris-setosa')\\n\",\n    \"plt.scatter(x[y_kmeans == 1, 0], x[y_kmeans == 1, 1], \\n\",\n    \"            s = 100, c = 'blue', label = 'Iris-versicolour')\\n\",\n    \"plt.scatter(x[y_kmeans == 2, 0], x[y_kmeans == 2, 1],\\n\",\n    \"            s = 100, c = 'green', label = 'Iris-virginica')\\n\",\n    \"\\n\",\n    \"# Plotting the centroids of the clusters\\n\",\n    \"plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:,1], \\n\",\n    \"            s = 100, c = 'yellow', label = 'Centroids')\\n\",\n    \"\\n\",\n    \"plt.legend()\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"colab\": {\n   \"collapsed_sections\": [],\n   \"name\": \"KMeans_Clustering.ipynb\",\n   \"provenance\": [],\n   \"version\": \"0.3.2\"\n  },\n  \"hide_input\": false,\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.8.8\"\n  },\n  \"toc\": {\n   \"base_numbering\": 1,\n   \"nav_menu\": {},\n   \"number_sections\": true,\n   \"sideBar\": true,\n   \"skip_h1_title\": false,\n   \"title_cell\": \"Table of Contents\",\n   \"title_sidebar\": \"Contents\",\n   \"toc_cell\": false,\n   \"toc_position\": {},\n   \"toc_section_display\": true,\n   \"toc_window_display\": false\n  },\n  \"varInspector\": {\n   \"cols\": {\n    \"lenName\": 16,\n    \"lenType\": 16,\n    \"lenVar\": 40\n   },\n   \"kernels_config\": {\n    \"python\": {\n     \"delete_cmd_postfix\": \"\",\n     \"delete_cmd_prefix\": \"del \",\n     \"library\": \"var_list.py\",\n     \"varRefreshCmd\": \"print(var_dic_list())\"\n    },\n    \"r\": {\n     \"delete_cmd_postfix\": \") \",\n     \"delete_cmd_prefix\": \"rm(\",\n     \"library\": \"var_list.r\",\n     \"varRefreshCmd\": \"cat(var_dic_list()) \"\n    }\n   },\n   \"types_to_exclude\": [\n    \"module\",\n    \"function\",\n    \"builtin_function_or_method\",\n    \"instance\",\n    \"_Feature\"\n   ],\n   \"window_display\": false\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "02_Python/K-Means_Implementation/Links.txt",
    "content": "https://www.machinelearningplus.com/predictive-modeling/k-means-clustering/"
  },
  {
    "path": "02_Python/K-Means_Implementation/README.md",
    "content": "# K-Means-Clustering\n\nIt is a Unsupervised Machine Learning Algorithm. In this notebook we to predict the optimum number of\nclusters in Iris dataset and represent it visually.\n"
  },
  {
    "path": "02_Python/K_Means.py",
    "content": "#================================================================================================================\n#----------------------------------------------------------------------------------------------------------------\n#\t\t\t\t\t\t\t\t\tK MEANS CLUSTERING\n#----------------------------------------------------------------------------------------------------------------\n#================================================================================================================\n\n# K means clustering is applied to normalized ipl player data\n\n\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom matplotlib import style\nimport pandas as pd \n\nstyle.use('ggplot')\n\nclass K_Means:\n\tdef __init__(self, k =3, tolerance = 0.0001, max_iterations = 500):\n\t\tself.k = k\n\t\tself.tolerance = tolerance\n\t\tself.max_iterations = max_iterations\n\n\tdef fit(self, data):\n\n\t\tself.centroids = {}\n\n\t\t#initialize the centroids, the first 'k' elements in the dataset will be our initial centroids\n\t\tfor i in range(self.k):\n\t\t\tself.centroids[i] = data[i]\n\n\t\t#begin iterations\n\t\tfor i in range(self.max_iterations):\n\t\t\tself.classes = {}\n\t\t\tfor i in range(self.k):\n\t\t\t\tself.classes[i] = []\n\n\t\t\t#find the distance between the point and cluster; choose the nearest centroid\n\t\t\tfor features in data:\n\t\t\t\tdistances = [np.linalg.norm(features - self.centroids[centroid]) for centroid in self.centroids]\n\t\t\t\tclassification = distances.index(min(distances))\n\t\t\t\tself.classes[classification].append(features)\n\n\t\t\tprevious = dict(self.centroids)\n\n\t\t\t#average the cluster datapoints to re-calculate the centroids\n\t\t\tfor classification in self.classes:\n\t\t\t\tself.centroids[classification] = np.average(self.classes[classification], axis = 0)\n\n\t\t\tisOptimal = True\n\n\t\t\tfor centroid in self.centroids:\n\n\t\t\t\toriginal_centroid = previous[centroid]\n\t\t\t\tcurr = self.centroids[centroid]\n\n\t\t\t\tif np.sum((curr - original_centroid)/original_centroid * 100.0) > self.tolerance:\n\t\t\t\t\tisOptimal = False\n\n\t\t\t#break out of the main loop if the results are optimal, ie. the centroids don't change their positions much(more than our tolerance)\n\t\t\tif isOptimal:\n\t\t\t\tbreak\n\n\tdef pred(self, data):\n\t\tdistances = [np.linalg.norm(data - self.centroids[centroid]) for centroid in self.centroids]\n\t\tclassification = distances.index(min(distances))\n\t\treturn classification\n\ndef main():\n\t\n\tdf = pd.read_csv(r\".\\data\\ipl.csv\")\n\tdf = df[['one', 'two']]\n\tdataset = df.astype(float).values.tolist()\n\n\tX = df.values #returns a numpy array\n\t\n\tkm = K_Means(3)\n\tkm.fit(X)\n\n\t# Plotting starts here\n\tcolors = 10*[\"r\", \"g\", \"c\", \"b\", \"k\"]\n\n\tfor centroid in km.centroids:\n\t\tplt.scatter(km.centroids[centroid][0], km.centroids[centroid][1], s = 130, marker = \"x\")\n\n\tfor classification in km.classes:\n\t\tcolor = colors[classification]\n\t\tfor features in km.classes[classification]:\n\t\t\tplt.scatter(features[0], features[1], color = color,s = 30)\n\t\n\tplt.show()\n\nif __name__ == \"__main__\":\n\tmain()\n"
  },
  {
    "path": "02_Python/K_Nearest_Neighbours.py",
    "content": "#================================================================================================================\n#----------------------------------------------------------------------------------------------------------------\n#\t\t\t\t\t\t\t\t\tK NEAREST NEIGHBOURS\n#----------------------------------------------------------------------------------------------------------------\n#================================================================================================================\n\n# Details of implementation/tutorial is in : http://madhugnadig.com/articles/machine-learning/2017/01/13/implementing-k-nearest-neighbours-from-scratch-in-python.html\n\nimport math\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom matplotlib import style\nimport pandas as pd\nimport random\nfrom collections import Counter\nfrom sklearn import preprocessing\nimport time\n\n#for plotting\nplt.style.use('ggplot')\n\nclass CustomKNN:\n\t\n\tdef __init__(self):\n\t\tself.accurate_predictions = 0\n\t\tself.total_predictions = 0\n\t\tself.accuracy = 0.0\n\n\tdef predict(self, training_data, to_predict, k = 3):\n\t\tif len(training_data) >= k:\n\t\t\tprint(\"K cannot be smaller than the total voting groups(ie. number of training data points)\")\n\t\t\treturn\n\t\t\n\t\tdistributions = []\n\t\tfor group in training_data:\n\t\t\tfor features in training_data[group]:\n\t\t\t\teuclidean_distance = np.linalg.norm(np.array(features)- np.array(to_predict))\n\t\t\t\tdistributions.append([euclidean_distance, group])\n\t\t\n\t\tresults = [i[1] for i in sorted(distributions)[:k]]\n\t\tresult = Counter(results).most_common(1)[0][0]\n\t\tconfidence = Counter(results).most_common(1)[0][1]/k\n\t\t\n\t\treturn result, confidence\n\t\n\tdef test(self, test_set, training_set):\n\t\tfor group in test_set:\n\t\t\tfor data in test_set[group]:\n\t\t\t\tpredicted_class,confidence = self.predict(training_set, data, k =3)\n\t\t\t\tif predicted_class == group:\n\t\t\t\t\tself.accurate_predictions += 1\n\t\t\t\telse:\n\t\t\t\t\tprint(\"Wrong classification with confidence \" + str(confidence * 100) + \" and class \" + str(predicted_class))\n\t\t\t\tself.total_predictions += 1\n\t\tself.accuracy = 100*(self.accurate_predictions/self.total_predictions)\n\t\tprint(\"\\nAcurracy :\", str(self.accuracy) + \"%\")\n\ndef mod_data(df):\n\tdf.replace('?', -999999, inplace = True)\n\t\n\tdf.replace('yes', 4, inplace = True)\n\tdf.replace('no', 2, inplace = True)\n\n\tdf.replace('notpresent', 4, inplace = True)\n\tdf.replace('present', 2, inplace = True)\n\t\n\tdf.replace('abnormal', 4, inplace = True)\n\tdf.replace('normal', 2, inplace = True)\n\t\n\tdf.replace('poor', 4, inplace = True)\n\tdf.replace('good', 2, inplace = True)\n\t\n\tdf.replace('ckd', 4, inplace = True)\n\tdf.replace('notckd', 2, inplace = True)\n\ndef main():\n\tdf = pd.read_csv(r\".\\data\\chronic_kidney_disease.csv\")\n\tmod_data(df)\n\tdataset = df.astype(float).values.tolist()\n\t\n\t#Normalize the data\n\tx = df.values #returns a numpy array\n\tmin_max_scaler = preprocessing.MinMaxScaler()\n\tx_scaled = min_max_scaler.fit_transform(x)\n\tdf = pd.DataFrame(x_scaled) #Replace df with normalized values\n\t\n\t#Shuffle the dataset\n\trandom.shuffle(dataset)\n\n\t#20% of the available data will be used for testing\n\ttest_size = 0.2\n\n\t#The keys of the dict are the classes that the data is classfied into\n\ttraining_set = {2: [], 4:[]}\n\ttest_set = {2: [], 4:[]}\n\t\n\t#Split data into training and test for cross validation\n\ttraining_data = dataset[:-int(test_size * len(dataset))]\n\ttest_data = dataset[-int(test_size * len(dataset)):]\n\t\n\t#Insert data into the training set\n\tfor record in training_data:\n\t\ttraining_set[record[-1]].append(record[:-1]) # Append the list in the dict will all the elements of the record except the class\n\n\t#Insert data into the test set\n\tfor record in test_data:\n\t\ttest_set[record[-1]].append(record[:-1]) # Append the list in the dict will all the elements of the record except the class\n\n\ts = time.clock()\n\tknn = CustomKNN()\n\tknn.test(test_set, training_set)\n\te = time.clock()\n\tprint(\"Exec Time:\" ,e-s)\n\nif __name__ == \"__main__\":\n\tmain()\n"
  },
  {
    "path": "02_Python/K_Nearest_Neighbours_In_Parallel.py",
    "content": "#================================================================================================================\n#----------------------------------------------------------------------------------------------------------------\n#\t\t\t\t\t\t\t\t\tK NEAREST NEIGHBOURS\n#----------------------------------------------------------------------------------------------------------------\n#================================================================================================================\n\n# 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\n\nimport math\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom matplotlib import style\nimport pandas as pd\nimport random\nfrom collections import Counter\nfrom sklearn import preprocessing\nfrom itertools import repeat\nimport multiprocessing as mp\nimport time\n\n\n#for plotting\nplt.style.use('ggplot')\n\nclass CustomKNN:\n\t\n\tdef __init__(self):\n\t\tself.accurate_predictions = 0\n\t\tself.total_predictions = 0\n\t\tself.accuracy = 0.0\n\n\tdef predict(self, training_data, to_predict, k = 3):\n\t\tif len(training_data) >= k:\n\t\t\tprint(\"K cannot be smaller than the total voting groups(ie. number of training data points)\")\n\t\t\treturn\n\t\t\n\t\tdistributions = []\n\t\tfor group in training_data:\n\t\t\tfor features in training_data[group]:\n\t\t\t\t#Calculate Euclidean distance\n\t\t\t\teuclidean_distance = np.linalg.norm(np.array(features)- np.array(to_predict))\n\t\t\t\tdistributions.append([euclidean_distance, group])\n\t\t#Find the class of K nearest points\n\t\tresults = [i[1] for i in sorted(distributions)[:k]]\n\t\tresult = Counter(results).most_common(1)[0][0]\n\t\tconfidence = Counter(results).most_common(1)[0][1]/k\n\t\t\n\t\treturn result, to_predict\n\t\n\tdef test(self, test_set, training_set):\n\t\tpool = mp.Pool(processes= 8)\n\n\t\tarr = {}\n\t\ts = time.clock()\n\t\t# 'Parallelization' happens here\n\t\tfor group in test_set:\n\t\t\tarr[group] =  pool.starmap(self.predict, zip(repeat(training_set), test_set[group], repeat(3)))\n\t\te = time.clock()\n\n\t\t#Calculating Accuracy\n\t\tfor group in test_set:\n\t\t\tfor data in test_set[group]:\n\t\t\t\tfor i in arr[group]:\n\t\t\t\t\tif data == i[1]:\n\t\t\t\t\t\tself.total_predictions += 1\n\t\t\t\t\t\t#If accuracte -> predicted class = original class\n\t\t\t\t\t\tif group == i[0]:\n\t\t\t\t\t\t\tself.accurate_predictions+=1\n\t\t\n\t\tself.accuracy = 100*(self.accurate_predictions/self.total_predictions)\n\t\tprint(\"\\nAcurracy :\", str(self.accuracy) + \"%\")\n\ndef mod_data(df):\n\n\tdf.replace('?', -999999, inplace = True)\n\n\tdf.replace('yes', 4, inplace = True)\n\tdf.replace('no', 2, inplace = True)\n\n\tdf.replace('notpresent', 4, inplace = True)\n\tdf.replace('present', 2, inplace = True)\n\n\tdf.replace('abnormal', 4, inplace = True)\n\tdf.replace('normal', 2, inplace = True)\n\t\n\tdf.replace('poor', 4, inplace = True)\n\tdf.replace('good', 2, inplace = True)\n\t\n\tdf.replace('ckd', 4, inplace = True)\n\tdf.replace('notckd', 2, inplace = True)\n\ndef main():\n\t#Load the dataset\n\tdf = pd.read_csv(r\".\\data\\chronic_kidney_disease.csv\")\n\tmod_data(df)\n\tdataset = df.astype(float).values.tolist()\n\t\n\t#Normalize the data\n\tx = df.values #returns a numpy array\n\tmin_max_scaler = preprocessing.MinMaxScaler()\n\tx_scaled = min_max_scaler.fit_transform(x)\n\tdf = pd.DataFrame(x_scaled) #Replace df with normalized values\n\t\n\t#Shuffle the dataset\n\trandom.shuffle(dataset)\n\n\t#10% of the available data will be used for testing\n\ttest_size = 0.1\n\n\t#The keys of the dict are the classes that the data is classfied into\n\ttraining_set = {2: [], 4:[]}\n\ttest_set = {2: [], 4:[]}\n\t\n\t#Split data into training and test for cross validation\n\ttraining_data = dataset[:-int(test_size * len(dataset))]\n\ttest_data = dataset[-int(test_size * len(dataset)):]\n\t\n\t#Insert data into the training set\n\tfor record in training_data:\n\t\ttraining_set[record[-1]].append(record[:-1]) # Append the list in the dict will all the elements of the record except the class\n\n\t#Insert data into the test set\n\tfor record in test_data:\n\t\ttest_set[record[-1]].append(record[:-1]) # Append the list in the dict will all the elements of the record except the class\n\t\n\ts = time.clock()\n\tknn = CustomKNN()\n\tknn.test(test_set, training_set)\n\te = time.clock()\n\t\n\tprint(\"Exec Time: \", e-s)\n\t\nif __name__ == \"__main__\":\n\tmain()\n"
  },
  {
    "path": "02_Python/Linear_Regression.py",
    "content": "#================================================================================================================\n#----------------------------------------------------------------------------------------------------------------\n#\t\t\t\t\t\t\t\t\tSIMPLE LINEAR REGRESSION\n#----------------------------------------------------------------------------------------------------------------\n#================================================================================================================\n\n#Simple linear regression is applied to stock data, where the x values are time and y values are the stock closing price.\n#This is not an ideal application of simple linear regression, but it suffices to be a good experiment.\n\nimport math\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom matplotlib import style\nimport pandas\nimport datetime\n\n#Quandl for getting stock data\nimport quandl\n\n#for plotting\nplt.style.use('ggplot')\n\nclass CustomLinearRegression:\n\t\n\tdef __init__(self):\n\t\tself.intercept = 0\n\t\tself.slope = 0\n\n\t#arithmetic mean\n\tdef am(self, arr):\n\t\ttot = 0.0\n\t\tfor i in arr:\n\t\t\ttot+= i\n\t\treturn tot/len(arr)\n\n\t#finding the slope in best fit line\n\tdef best_fit(self, dimOne, dimTwo):\n\t\tself.slope = ( (self.am(dimOne) * self.am(dimTwo) ) - self.am(dimOne*dimTwo) ) / ( self.am(dimOne)**2 - self.am(dimOne**2) ) #formula for finding slope\n\t\treturn self.slope\n\n\t#finding the best fit intercept\n\tdef y_intercept(self, dimOne ,dimTwo):\n\t\tself.intercept = self.am( dimTwo ) - ( self.slope * self.am(dimOne) )\n\t\treturn self.intercept\n\n\t#predict for future values based on model\n\tdef predict(self, ip):\n\t\tip = np.array(ip)\n\t\tpredicted = [(self.slope*param) + self.intercept for param in ip] #create a \"predicted\" array where the index corresponds to the index of the input\n\t\treturn predicted\n\t\t\n\t#find the squared error\n\tdef squared_error(self, original, model):\n\t\treturn sum((model - original) **2)\n\n\t#find co-efficient of determination for R^2\n\tdef cod(self, original, model):\n\t\tam_line = [self.am(original) for y in original]\n\t\tsq_error = self.squared_error(original, model)\n\t\tsq_error_am = self.squared_error(original, am_line)\n\t\treturn 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\n\ndef main():\n\tstk = quandl.get(\"WIKI/TSLA\")\n\n\tsimpl_linear_regression = CustomLinearRegression()\n\n\t#reset index to procure date - date was the initial default index\n\tstk = stk.reset_index()\n\t\n\t#Add them headers\n\tstk = stk[['Date','Adj. Open','Adj. High','Adj. Low','Adj. Close', 'Volume']]\n\n\tstk['Date'] = pandas.to_datetime(stk['Date'])    \n\tstk['Date'] = (stk['Date'] - stk['Date'].min())  / np.timedelta64(1,'D')\n\n\n\t#The column that needs to be forcasted using linear regression\n\tforecast_col = 'Adj. Close'\n\t\n\t#take care of NA's\n\tstk.fillna(-999999, inplace = True)\n\tstk['label'] = stk[forecast_col]\n\n\n\t#IN CASE THE INPUT IS TO BE TAKEN IN FROM THE COMMAND PROMPT UNCOMMENT THE LINES BELOW\n\n\t#takes in input from the user\n\t#x = list(map(int, input(\"Enter x: \\n\").split()))\n\t#y = list(map(int, input(\"Enter y: \\n\").split()))\n\n\t#convert to an numpy array with datatype as 64 bit float.\n\t#x = np.array(x, dtype = np.float64)\n\t#y = np.array(y, dtype = np.float64)\n\n\tstk.dropna(inplace = True)\n\n\tx = np.array(stk['Date'])\n\ty = np.array(stk['label'])\n\n\t#Always in the order: first slope, then intercept\n\tslope = simpl_linear_regression.best_fit(x, y) #find slope\n\tintercept = simpl_linear_regression.y_intercept(x, y) #find the intercept\n\n\tip = list(map(int, input(\"Enter x to predict y: \\n\").split()))\n\n\tline = simpl_linear_regression.predict(ip) #predict based on model\n\t\n\treg = [(slope*param) + intercept for param in x]\n\n\tprint(\"Predicted value(s) after linear regression :\", line)\n\n\tr_sqrd = simpl_linear_regression.cod(y, reg)\n\tprint(\"R^2 Value: \" ,r_sqrd)\n\t\n\tplt.scatter(x, y)\n\tplt.scatter(ip, line, color = \"red\")\n\tplt.plot(x, reg)\n\tplt.show()\n\nif __name__ == \"__main__\":\n\tmain()"
  },
  {
    "path": "02_Python/Logistic_Regression.py",
    "content": "#================================================================================================================\n#----------------------------------------------------------------------------------------------------------------\n#\t\t\t\t\t\t\t\t\tLOGISTIC REGRESSION\n#----------------------------------------------------------------------------------------------------------------\n#================================================================================================================\n\nimport math\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom matplotlib import style\nimport pandas as pd\nimport datetime\nfrom sklearn.cross_validation import train_test_split\n\n\n#for plotting\nplt.style.use('ggplot')\n\n#Using gradient decent here to arrive at the optimal.\n\n\nclass CustomLogisticRegression:\n\t\n\tdef __init__(self, x, y, tolerence = 0.00001):\n\t\tself.tolerence = tolerence\n\t\tself.cost = []\n\t\tself.alpha = 0.1\n\t\tself.lambd = 0.25\n\t\tself.iter = 2500\n\t\tself.x = x\n\t\tself.y = y\n\t\t\n\t\t#initialie theta\n\t\tself.theta = np.random.rand(x.shape[1],1)\n\t\n\t#the cost function\n\tdef cost_fn(self, m):\n\t\th = self.sigmoid_function(np.dot(self.x, self.theta)) #get the hypothesis\n\t\tJ = ( 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\n\t\treturn J\n\n\t#The sigmoid function\n\tdef sigmoid_function(z):\n\t\treturn 1.0 / ( 1.0 + math.e**(-1*z) ) #Using 1.0 to make it a floating point type\n\t\n\t#Gradient function\n\tdef gradients(self, m):\n\t\tzrd = self.theta\n\t\tzrd[0, :] = 0\n\t\th = self.sigmoid_function(np.dot(self.x, self.theta)) #get the hypothesis\n\t\treturn ( 1.0/m ) * np.dot(self.x.T, ( h - self.y ) ) + (float(self.lambd)/m) * zrd \n\n\t#This is batch\n\tdef descent(self):\n\t\tfor i in range(self.iter):\n\t\t\tself.cost.append( self.cost_fn(self.x.shape[0]))\n\t\t\tgradientz = self.gradients(x.shape[0])\n\t\t\t\n\t\t\t#Change theta based on the \"gradientz\"\n\t\t\tself.theta[0, :] = gradientz[0, :] - self.alpha * gradientz[0, :]\n\t\t\tself.theta[1, :] = gradientz[1:, :] - self.alpha * gradientz[1:, :]\n\t\t\n\t\tpred = np.dot(self.x, self.theta)\n\t\tpred[ pred >= 0.5 ] = 1\n\t\tpred[ pred < 0.5 ] = 0\n\ndef main():\n\n\t#IN CASE THE INPUT IS TO BE TAKEN IN FROM THE COMMAND PROMPT\n\n\t#takes in input from the user\n\t#x = list(map(int, input(\"Enter x: \\n\").split()))\n\t#y = list(map(int, input(\"Enter y: \\n\").split()))\n\n\t#convert to an numpy array with datatype as 64 bit float.\n\t#x = np.array(x, dtype = np.float64)\n\t#y = np.array(y, dtype = np.float64)\n\n\tdf = pd.read_table('.\\data\\logistic_regression_data.txt', sep = ',', names = ('featureOne', 'featureTwo', 'label'))\n\ty = np.array(df['label']).T\n\tdf = np.array(df)\n\tx = df[:,:2]\n\t\n\t#normalize the data\n\tdf = (df - df.mean()) / (df.max() - df.min())\n\n\t\n\tx_test, y_test, x_train, y_train = train_test_split(x,y, test_size = 0.1, random_state = 0)\n\t\n\tglm = CustomLogisticRegression(x, y)\n\tglm.descent()\n\tplt.scatter(x[:,0], y)\n\t\n\tplt.show()\n\nif __name__ == \"__main__\":\n\tmain()"
  },
  {
    "path": "02_Python/MSCRED/cnn_lstm/Untitled.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import tensorflow as tf\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"INFO line 17:13: Renamed keyword argument for tf.nn.conv2d from filter to filters\\n\",\n      \"INFO line 33:72: Changing tf.contrib.layers xavier initializer to a tf.compat.v1.keras.initializers.VarianceScaling and converting arguments.\\n\",\n      \"\\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\",\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\",\n      \"INFO line 84:21: Renamed 'tf.nn.dynamic_rnn' to 'tf.compat.v1.nn.dynamic_rnn'\\n\",\n      \"INFO line 89:27: Added keywords to args of function 'tf.reduce_sum'\\n\",\n      \"INFO line 109:13: Renamed keyword argument for tf.nn.conv2d_transpose from value to input\\n\",\n      \"INFO line 109:13: Renamed keyword argument for tf.nn.conv2d_transpose from filter to filters\\n\",\n      \"INFO line 143:11: Renamed 'tf.Session' to 'tf.compat.v1.Session'\"\n     ]\n    },\n    {\n     \"name\": \"stderr\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"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\"\n     ]\n    },\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"\\n\",\n      \"INFO line 164:11: Added keywords to args of function 'tf.reduce_mean'\\n\",\n      \"INFO line 168:11: Renamed 'tf.global_variables_initializer' to 'tf.compat.v1.global_variables_initializer'\\n\",\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\",\n      \"TensorFlow 2.0 Upgrade Script\\n\",\n      \"-----------------------------\\n\",\n      \"Converted 1 files\\n\",\n      \"Detected 3 issues that require attention\\n\",\n      \"--------------------------------------------------------------------------------\\n\",\n      \"--------------------------------------------------------------------------------\\n\",\n      \"File: convlstm.py\\n\",\n      \"--------------------------------------------------------------------------------\\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\",\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\",\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\",\n      \"\\n\",\n      \"Make sure to read the detailed log 'report.txt'\\n\",\n      \"\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"!tf_upgrade_v2 \\\\\\n\",\n    \"  --infile convlstm.py \\\\\\n\",\n    \"  --outfile convlstm-update.py \"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.7.7\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "02_Python/MSCRED/cnn_lstm/__init__.py",
    "content": "\n"
  },
  {
    "path": "02_Python/MSCRED/cnn_lstm/convlstm-update.py",
    "content": "import tensorflow as tf\nimport cnn_lstm.utils as util\nimport numpy as np\nimport os\n\n\ndef 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\ndef 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    return variable\n\n\ndef 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\ndef 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\ndef 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\ndef 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\ndef 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\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "02_Python/MSCRED/cnn_lstm/convlstm.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"WARNING:tensorflow:\\n\",\n      \"The TensorFlow contrib module will not be included in TensorFlow 2.0.\\n\",\n      \"For more information, please see:\\n\",\n      \"  * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md\\n\",\n      \"  * https://github.com/tensorflow/addons\\n\",\n      \"  * https://github.com/tensorflow/io (for I/O related ops)\\n\",\n      \"If you depend on functionality not listed there, please file an issue.\\n\",\n      \"\\n\",\n      \"WARNING:tensorflow:From <ipython-input-1-3ce806ec24fa>:85: dynamic_rnn (from tensorflow.python.ops.rnn) is deprecated and will be removed in a future version.\\n\",\n      \"Instructions for updating:\\n\",\n      \"Please use `keras.layers.RNN(cell)`, which is equivalent to this API\\n\",\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\",\n      \"Instructions for updating:\\n\",\n      \"Call initializer instance with the dtype argument instead of passing it to the constructor\\n\",\n      \"mse of last train data: 0.00056191476\\n\",\n      \"mse of last train data: 0.0008397814\\n\",\n      \"mse of last train data: 0.0009788115\\n\",\n      \"mse of last train data: 0.0015275143\\n\",\n      \"mse of last train data: 0.0018960452\\n\",\n      \"mse of last train data: 0.0015373339\\n\",\n      \"mse of last train data: 0.0012186245\\n\",\n      \"mse of last train data: 0.0009643246\\n\",\n      \"mse of last train data: 0.00080712256\\n\",\n      \"mse of last train data: 0.0006685078\\n\",\n      \"mse of last train data: 0.00055669027\\n\",\n      \"mse of last train data: 0.0004998121\\n\",\n      \"mse of last train data: 0.00046998213\\n\",\n      \"mse of last train data: 0.0004438546\\n\",\n      \"mse of last train data: 0.00042290962\\n\",\n      \"mse of last train data: 0.00040549517\\n\",\n      \"mse of last train data: 0.00037338244\\n\",\n      \"mse of last train data: 0.00034272377\\n\",\n      \"mse of last train data: 0.0003186365\\n\",\n      \"mse of last train data: 0.0002920385\\n\",\n      \"mse of last train data: 0.00030394315\\n\",\n      \"mse of last train data: 0.00040858088\\n\",\n      \"mse of last train data: 0.000509995\\n\",\n      \"mse of last train data: 0.00048521854\\n\",\n      \"mse of last train data: 0.00054299145\\n\",\n      \"mse of last train data: 0.00043364725\\n\",\n      \"mse of last train data: 0.00037081417\\n\",\n      \"mse of last train data: 0.00033152517\\n\",\n      \"mse of last train data: 0.00030633438\\n\",\n      \"mse of last train data: 0.00029974605\\n\",\n      \"mse of last train data: 0.00028598175\\n\",\n      \"mse of last train data: 0.00026241553\\n\",\n      \"mse of last train data: 0.00023329386\\n\",\n      \"mse of last train data: 0.0002067556\\n\",\n      \"mse of last train data: 0.0001858864\\n\",\n      \"mse of last train data: 0.00017865832\\n\",\n      \"mse of last train data: 0.00017368651\\n\",\n      \"mse of last train data: 0.00016670438\\n\",\n      \"mse of last train data: 0.00016511032\\n\",\n      \"mse of last train data: 0.00016638315\\n\",\n      \"mse of last train data: 0.00017021292\\n\",\n      \"mse of last train data: 0.00017659822\\n\",\n      \"mse of last train data: 0.00016779697\\n\",\n      \"mse of last train data: 0.00015695463\\n\",\n      \"mse of last train data: 0.00015104574\\n\",\n      \"mse of last train data: 0.00014608716\\n\",\n      \"mse of last train data: 0.00014336465\\n\",\n      \"mse of last train data: 0.00014475462\\n\",\n      \"mse of last train data: 0.00014507821\\n\",\n      \"mse of last train data: 0.0001450579\\n\",\n      \"mse of last train data: 0.07205667\\n\",\n      \"mse of last train data: 0.13893458\\n\",\n      \"mse of last train data: 0.19796228\\n\",\n      \"mse of last train data: 0.18094915\\n\",\n      \"mse of last train data: 0.16069302\\n\",\n      \"mse of last train data: 0.14240894\\n\",\n      \"mse of last train data: 0.12506531\\n\",\n      \"mse of last train data: 0.10823243\\n\",\n      \"mse of last train data: 0.09251572\\n\",\n      \"mse of last train data: 0.07781045\\n\",\n      \"mse of last train data: 0.06467669\\n\",\n      \"mse of last train data: 0.05363799\\n\",\n      \"mse of last train data: 0.04450189\\n\",\n      \"mse of last train data: 0.03728957\\n\",\n      \"mse of last train data: 0.03174516\\n\",\n      \"mse of last train data: 0.027739545\\n\",\n      \"mse of last train data: 0.024777628\\n\",\n      \"mse of last train data: 0.02266857\\n\",\n      \"mse of last train data: 0.020791424\\n\",\n      \"mse of last train data: 0.018834757\\n\",\n      \"mse of last train data: 0.017007332\\n\",\n      \"mse of last train data: 0.0152012\\n\",\n      \"mse of last train data: 0.0136817675\\n\",\n      \"mse of last train data: 0.012355283\\n\",\n      \"mse of last train data: 0.011042081\\n\",\n      \"mse of last train data: 0.009847156\\n\",\n      \"mse of last train data: 0.008889004\\n\",\n      \"mse of last train data: 0.008057881\\n\",\n      \"mse of last train data: 0.0073360116\\n\",\n      \"mse of last train data: 0.006629404\\n\",\n      \"mse of last train data: 0.00603446\\n\",\n      \"mse of last train data: 0.0055647404\\n\",\n      \"mse of last train data: 0.005085784\\n\",\n      \"mse of last train data: 0.004635579\\n\",\n      \"mse of last train data: 0.0042376267\\n\",\n      \"mse of last train data: 0.003809187\\n\",\n      \"mse of last train data: 0.0034959386\\n\",\n      \"mse of last train data: 0.003260653\\n\",\n      \"mse of last train data: 0.0030721568\\n\",\n      \"mse of last train data: 0.0029340317\\n\",\n      \"mse of last train data: 0.0027605256\\n\",\n      \"mse of last train data: 0.0026362352\\n\",\n      \"mse of last train data: 0.0025475756\\n\",\n      \"mse of last train data: 0.0024479274\\n\",\n      \"mse of last train data: 0.0023544491\\n\",\n      \"mse of last train data: 0.0022725554\\n\",\n      \"mse of last train data: 0.0022665847\\n\",\n      \"mse of last train data: 0.002288982\\n\",\n      \"mse of last train data: 0.0023486267\\n\",\n      \"mse of last train data: 0.0023323437\\n\",\n      \"mse of last train data: 0.0022963672\\n\",\n      \"mse of last train data: 0.002290437\\n\",\n      \"mse of last train data: 0.0022051383\\n\",\n      \"mse of last train data: 0.0022056552\\n\",\n      \"mse of last train data: 0.0021482974\\n\",\n      \"mse of last train data: 0.0022010433\\n\",\n      \"mse of last train data: 0.0022223855\\n\",\n      \"mse of last train data: 0.0021414428\\n\",\n      \"mse of last train data: 0.0022304913\\n\",\n      \"mse of last train data: 0.00230914\\n\",\n      \"mse of last train data: 0.0022991085\\n\",\n      \"mse of last train data: 0.0023407598\\n\",\n      \"mse of last train data: 0.0024499984\\n\",\n      \"mse of last train data: 0.0024665953\\n\",\n      \"mse of last train data: 0.0026058878\\n\",\n      \"mse of last train data: 0.002833584\\n\",\n      \"mse of last train data: 0.0028792522\\n\",\n      \"mse of last train data: 0.0030756914\\n\",\n      \"mse of last train data: 0.0032068451\\n\",\n      \"mse of last train data: 0.0033346848\\n\",\n      \"mse of last train data: 0.0034521099\\n\",\n      \"mse of last train data: 0.0035960434\\n\",\n      \"mse of last train data: 0.0036712477\\n\",\n      \"mse of last train data: 0.0037712127\\n\",\n      \"mse of last train data: 0.0038479893\\n\",\n      \"mse of last train data: 0.0038579563\\n\",\n      \"mse of last train data: 0.0038726386\\n\",\n      \"mse of last train data: 0.003964872\\n\",\n      \"mse of last train data: 0.004026084\\n\",\n      \"mse of last train data: 0.004028903\\n\",\n      \"mse of last train data: 0.0039217984\\n\",\n      \"mse of last train data: 0.0039538997\\n\",\n      \"mse of last train data: 0.003897768\\n\",\n      \"mse of last train data: 0.00384018\\n\",\n      \"mse of last train data: 0.0037616906\\n\",\n      \"mse of last train data: 0.0037353742\\n\",\n      \"mse of last train data: 0.0037921062\\n\",\n      \"mse of last train data: 0.0038140994\\n\",\n      \"mse of last train data: 0.0039422265\\n\",\n      \"mse of last train data: 0.004063493\\n\",\n      \"mse of last train data: 0.0040876106\\n\",\n      \"mse of last train data: 0.0041476134\\n\",\n      \"mse of last train data: 0.004176664\\n\",\n      \"mse of last train data: 0.004150423\\n\",\n      \"mse of last train data: 0.0041735084\\n\",\n      \"mse of last train data: 0.0041777953\\n\",\n      \"mse of last train data: 0.0041922787\\n\",\n      \"mse of last train data: 0.0041739466\\n\",\n      \"mse of last train data: 0.0041439347\\n\",\n      \"mse of last train data: 0.0040672407\\n\",\n      \"mse of last train data: 0.0038785741\\n\",\n      \"mse of last train data: 0.0038772987\\n\",\n      \"mse of last train data: 0.0038318443\\n\",\n      \"mse of last train data: 0.0037663344\\n\",\n      \"mse of last train data: 0.003679201\\n\",\n      \"mse of last train data: 0.0035277274\\n\",\n      \"mse of last train data: 0.00346549\\n\",\n      \"mse of last train data: 0.0034346743\\n\",\n      \"mse of last train data: 0.0033462397\\n\",\n      \"mse of last train data: 0.0032800194\\n\",\n      \"mse of last train data: 0.0030959256\\n\",\n      \"mse of last train data: 0.00294949\\n\",\n      \"mse of last train data: 0.0027885023\\n\",\n      \"mse of last train data: 0.002630386\\n\",\n      \"mse of last train data: 0.0025397677\\n\",\n      \"mse of last train data: 0.0024446982\\n\",\n      \"mse of last train data: 0.0023684655\\n\",\n      \"mse of last train data: 0.0023111373\\n\",\n      \"mse of last train data: 0.0023532473\\n\",\n      \"mse of last train data: 0.0023284957\\n\",\n      \"mse of last train data: 0.0022286135\\n\",\n      \"mse of last train data: 0.0021931112\\n\",\n      \"mse of last train data: 0.0021555452\\n\",\n      \"mse of last train data: 0.0020743778\\n\",\n      \"mse of last train data: 0.0020993075\\n\",\n      \"mse of last train data: 0.0022181568\\n\",\n      \"mse of last train data: 0.0023018164\\n\",\n      \"mse of last train data: 0.0022113312\\n\",\n      \"mse of last train data: 0.0020134633\\n\",\n      \"mse of last train data: 0.0019012\\n\",\n      \"mse of last train data: 0.001853643\\n\",\n      \"mse of last train data: 0.0018221489\\n\",\n      \"mse of last train data: 0.0018716477\\n\",\n      \"mse of last train data: 0.0018854032\\n\",\n      \"mse of last train data: 0.001888388\\n\",\n      \"mse of last train data: 0.0018411102\\n\",\n      \"mse of last train data: 0.0018166936\\n\",\n      \"mse of last train data: 0.0017583704\\n\",\n      \"mse of last train data: 0.001752599\\n\",\n      \"mse of last train data: 0.0016609089\\n\",\n      \"mse of last train data: 0.0015661017\\n\",\n      \"mse of last train data: 0.0015227802\\n\",\n      \"mse of last train data: 0.0014839825\\n\",\n      \"mse of last train data: 0.0014406227\\n\",\n      \"mse of last train data: 0.0014063524\\n\"\n     ]\n    },\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"mse of last train data: 0.0013464914\\n\",\n      \"mse of last train data: 0.0012574107\\n\",\n      \"mse of last train data: 0.0011973963\\n\",\n      \"mse of last train data: 0.0011483922\\n\",\n      \"mse of last train data: 0.0010861779\\n\",\n      \"mse of last train data: 0.0011279699\\n\",\n      \"mse of last train data: 0.001181956\\n\",\n      \"mse of last train data: 0.0011827709\\n\",\n      \"mse of last train data: 0.0012015909\\n\",\n      \"mse of last train data: 0.0012706444\\n\",\n      \"mse of last train data: 0.0012969548\\n\",\n      \"mse of last train data: 0.0013360518\\n\",\n      \"mse of last train data: 0.0013549714\\n\",\n      \"mse of last train data: 0.001344365\\n\",\n      \"mse of last train data: 0.0013358138\\n\",\n      \"mse of last train data: 0.0012971199\\n\",\n      \"mse of last train data: 0.0012400298\\n\",\n      \"mse of last train data: 0.0011351941\\n\",\n      \"mse of last train data: 0.0011002468\\n\",\n      \"mse of last train data: 0.0011178211\\n\",\n      \"mse of last train data: 0.0011359766\\n\",\n      \"mse of last train data: 0.001113067\\n\",\n      \"mse of last train data: 0.0010521347\\n\",\n      \"mse of last train data: 0.0010077746\\n\",\n      \"mse of last train data: 0.0009265113\\n\",\n      \"mse of last train data: 0.00095399655\\n\",\n      \"mse of last train data: 0.0009676965\\n\",\n      \"mse of last train data: 0.0009533392\\n\",\n      \"mse of last train data: 0.0011021182\\n\",\n      \"mse of last train data: 0.0011843981\\n\",\n      \"mse of last train data: 0.0012056407\\n\",\n      \"mse of last train data: 0.001262295\\n\",\n      \"mse of last train data: 0.0012374771\\n\",\n      \"mse of last train data: 0.0012458236\\n\",\n      \"mse of last train data: 0.0012676963\\n\",\n      \"mse of last train data: 0.0013123781\\n\",\n      \"mse of last train data: 0.0014086295\\n\",\n      \"mse of last train data: 0.0014814095\\n\",\n      \"mse of last train data: 0.0015082511\\n\",\n      \"mse of last train data: 0.0015982826\\n\",\n      \"mse of last train data: 0.0016851957\\n\",\n      \"mse of last train data: 0.0015878333\\n\",\n      \"mse of last train data: 0.0015919523\\n\",\n      \"mse of last train data: 0.0016622652\\n\",\n      \"mse of last train data: 0.0015962254\\n\",\n      \"mse of last train data: 0.0015314275\\n\",\n      \"mse of last train data: 0.0015526952\\n\",\n      \"mse of last train data: 0.0016658702\\n\",\n      \"mse of last train data: 0.0018051107\\n\",\n      \"mse of last train data: 0.0020628015\\n\",\n      \"mse of last train data: 0.0025127074\\n\",\n      \"mse of last train data: 0.0029573862\\n\",\n      \"mse of last train data: 0.0031659596\\n\",\n      \"mse of last train data: 0.0034723885\\n\",\n      \"mse of last train data: 0.0037655572\\n\",\n      \"mse of last train data: 0.0039095846\\n\",\n      \"mse of last train data: 0.003840831\\n\",\n      \"mse of last train data: 0.0040077097\\n\",\n      \"mse of last train data: 0.0039965403\\n\",\n      \"mse of last train data: 0.003927748\\n\",\n      \"mse of last train data: 0.003750622\\n\",\n      \"mse of last train data: 0.0036334356\\n\",\n      \"mse of last train data: 0.003574275\\n\",\n      \"mse of last train data: 0.0037313572\\n\",\n      \"mse of last train data: 0.0037059211\\n\",\n      \"mse of last train data: 0.0036447744\\n\",\n      \"mse of last train data: 0.0035459776\\n\",\n      \"mse of last train data: 0.0033301672\\n\",\n      \"mse of last train data: 0.0031582052\\n\",\n      \"mse of last train data: 0.0030207264\\n\",\n      \"mse of last train data: 0.002874614\\n\",\n      \"mse of last train data: 0.0027405953\\n\",\n      \"mse of last train data: 0.0027124388\\n\",\n      \"mse of last train data: 0.0026437847\\n\",\n      \"mse of last train data: 0.0025770634\\n\",\n      \"mse of last train data: 0.0025967045\\n\",\n      \"mse of last train data: 0.0025350593\\n\",\n      \"mse of last train data: 0.0024819104\\n\",\n      \"mse of last train data: 0.0024936553\\n\",\n      \"mse of last train data: 0.0024477043\\n\",\n      \"mse of last train data: 0.002376865\\n\",\n      \"mse of last train data: 0.0023258424\\n\",\n      \"mse of last train data: 0.0022483987\\n\",\n      \"mse of last train data: 0.0021567186\\n\",\n      \"mse of last train data: 0.002107201\\n\",\n      \"mse of last train data: 0.0020256473\\n\",\n      \"mse of last train data: 0.00197632\\n\",\n      \"mse of last train data: 0.0019731368\\n\",\n      \"mse of last train data: 0.0019368684\\n\",\n      \"mse of last train data: 0.0018914877\\n\",\n      \"mse of last train data: 0.0018475738\\n\",\n      \"mse of last train data: 0.0017605136\\n\",\n      \"mse of last train data: 0.0016986358\\n\",\n      \"mse of last train data: 0.001640756\\n\",\n      \"mse of last train data: 0.0016501561\\n\",\n      \"mse of last train data: 0.001645608\\n\",\n      \"mse of last train data: 0.0016029997\\n\",\n      \"mse of last train data: 0.0015904047\\n\",\n      \"mse of last train data: 0.0016070447\\n\",\n      \"mse of last train data: 0.0016007202\\n\",\n      \"mse of last train data: 0.0015753297\\n\",\n      \"mse of last train data: 0.0015429567\\n\",\n      \"mse of last train data: 0.0015102365\\n\",\n      \"mse of last train data: 0.0014876345\\n\",\n      \"mse of last train data: 0.0014366853\\n\",\n      \"mse of last train data: 0.0014381347\\n\",\n      \"mse of last train data: 0.001439962\\n\",\n      \"mse of last train data: 0.0014420307\\n\",\n      \"mse of last train data: 0.0013792998\\n\",\n      \"mse of last train data: 0.0013424249\\n\",\n      \"mse of last train data: 0.001325422\\n\",\n      \"mse of last train data: 0.0012873164\\n\",\n      \"mse of last train data: 0.0012872552\\n\",\n      \"mse of last train data: 0.0013417456\\n\",\n      \"mse of last train data: 0.0013084626\\n\",\n      \"mse of last train data: 0.0011857317\\n\",\n      \"mse of last train data: 0.0011190426\\n\",\n      \"mse of last train data: 0.0011062514\\n\",\n      \"mse of last train data: 0.0010339685\\n\",\n      \"mse of last train data: 0.0009947165\\n\",\n      \"mse of last train data: 0.0010266803\\n\",\n      \"mse of last train data: 0.0010349512\\n\",\n      \"mse of last train data: 0.0010006244\\n\",\n      \"mse of last train data: 0.0010220367\\n\",\n      \"mse of last train data: 0.0010284391\\n\",\n      \"mse of last train data: 0.0010194151\\n\",\n      \"mse of last train data: 0.001005341\\n\",\n      \"mse of last train data: 0.00097332476\\n\",\n      \"mse of last train data: 0.00093010295\\n\",\n      \"mse of last train data: 0.0010120556\\n\",\n      \"mse of last train data: 0.0010774386\\n\",\n      \"mse of last train data: 0.0011652409\\n\",\n      \"mse of last train data: 0.0012128444\\n\",\n      \"mse of last train data: 0.0012056258\\n\",\n      \"mse of last train data: 0.0011465251\\n\",\n      \"mse of last train data: 0.0011025794\\n\",\n      \"mse of last train data: 0.0010495858\\n\",\n      \"mse of last train data: 0.001023266\\n\",\n      \"mse of last train data: 0.0010484938\\n\",\n      \"mse of last train data: 0.0010513911\\n\",\n      \"mse of last train data: 0.0011392012\\n\",\n      \"mse of last train data: 0.001153798\\n\",\n      \"mse of last train data: 0.0011481759\\n\",\n      \"mse of last train data: 0.0011563408\\n\",\n      \"mse of last train data: 0.0011308886\\n\",\n      \"mse of last train data: 0.0011234374\\n\",\n      \"mse of last train data: 0.0010046205\\n\",\n      \"mse of last train data: 0.0009797511\\n\",\n      \"mse of last train data: 0.0010366986\\n\",\n      \"mse of last train data: 0.0010408676\\n\",\n      \"mse of last train data: 0.001068525\\n\",\n      \"mse of last train data: 0.0011224989\\n\",\n      \"mse of last train data: 0.0011295491\\n\",\n      \"mse of last train data: 0.0011397352\\n\",\n      \"mse of last train data: 0.0011080813\\n\",\n      \"mse of last train data: 0.0010421994\\n\",\n      \"mse of last train data: 0.001017464\\n\",\n      \"mse of last train data: 0.0010206533\\n\",\n      \"mse of last train data: 0.0010339763\\n\",\n      \"mse of last train data: 0.0010672729\\n\",\n      \"mse of last train data: 0.0010636908\\n\",\n      \"mse of last train data: 0.001066436\\n\",\n      \"mse of last train data: 0.0011004284\\n\",\n      \"mse of last train data: 0.001122066\\n\",\n      \"mse of last train data: 0.0011451798\\n\",\n      \"mse of last train data: 0.0011026084\\n\",\n      \"mse of last train data: 0.0010945576\\n\",\n      \"mse of last train data: 0.0010818676\\n\",\n      \"mse of last train data: 0.0010538438\\n\",\n      \"mse of last train data: 0.0010126596\\n\",\n      \"mse of last train data: 0.0009978677\\n\",\n      \"mse of last train data: 0.0010448605\\n\",\n      \"mse of last train data: 0.001026903\\n\",\n      \"mse of last train data: 0.0010198418\\n\",\n      \"mse of last train data: 0.0010114628\\n\",\n      \"mse of last train data: 0.00095845683\\n\",\n      \"mse of last train data: 0.0009462939\\n\",\n      \"mse of last train data: 0.00091534853\\n\",\n      \"mse of last train data: 0.00093770504\\n\",\n      \"mse of last train data: 0.00095898425\\n\",\n      \"mse of last train data: 0.0009854428\\n\",\n      \"mse of last train data: 0.0010664935\\n\",\n      \"mse of last train data: 0.0011825607\\n\",\n      \"mse of last train data: 0.0012450067\\n\",\n      \"mse of last train data: 0.0013338435\\n\",\n      \"mse of last train data: 0.001365015\\n\",\n      \"mse of last train data: 0.0013943445\\n\",\n      \"mse of last train data: 0.0014056767\\n\",\n      \"mse of last train data: 0.0014466769\\n\",\n      \"mse of last train data: 0.0014638149\\n\",\n      \"mse of last train data: 0.0014998874\\n\",\n      \"mse of last train data: 0.0015322582\\n\",\n      \"mse of last train data: 0.0015588865\\n\",\n      \"mse of last train data: 0.0015689052\\n\",\n      \"mse of last train data: 0.0015233936\\n\",\n      \"mse of last train data: 0.001539662\\n\",\n      \"mse of last train data: 0.0015408073\\n\",\n      \"mse of last train data: 0.0015340863\\n\",\n      \"mse of last train data: 0.0015671833\\n\",\n      \"mse of last train data: 0.0016000806\\n\",\n      \"mse of last train data: 0.0016007663\\n\",\n      \"mse of last train data: 0.0016410188\\n\",\n      \"mse of last train data: 0.0016697388\\n\",\n      \"mse of last train data: 0.00175197\\n\",\n      \"mse of last train data: 0.0018563954\\n\",\n      \"mse of last train data: 0.0018630403\\n\",\n      \"mse of last train data: 0.0019535825\\n\",\n      \"mse of last train data: 0.0020532196\\n\",\n      \"mse of last train data: 0.0020106987\\n\",\n      \"mse of last train data: 0.0019743433\\n\",\n      \"mse of last train data: 0.002038095\\n\",\n      \"mse of last train data: 0.0020216114\\n\",\n      \"mse of last train data: 0.001970227\\n\",\n      \"mse of last train data: 0.001974121\\n\",\n      \"mse of last train data: 0.0019642294\\n\",\n      \"mse of last train data: 0.0020083536\\n\",\n      \"mse of last train data: 0.0020098195\\n\",\n      \"mse of last train data: 0.0020158559\\n\",\n      \"mse of last train data: 0.0020010343\\n\",\n      \"mse of last train data: 0.0018690318\\n\",\n      \"mse of last train data: 0.0017491846\\n\",\n      \"mse of last train data: 0.0017250124\\n\",\n      \"mse of last train data: 0.001702088\\n\"\n     ]\n    },\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"mse of last train data: 0.0016329982\\n\",\n      \"mse of last train data: 0.0015298986\\n\",\n      \"mse of last train data: 0.0015420592\\n\",\n      \"mse of last train data: 0.001491368\\n\",\n      \"mse of last train data: 0.0014125028\\n\",\n      \"mse of last train data: 0.0013982751\\n\",\n      \"mse of last train data: 0.0014319657\\n\",\n      \"mse of last train data: 0.0014147809\\n\",\n      \"mse of last train data: 0.0013569839\\n\",\n      \"mse of last train data: 0.0012757038\\n\",\n      \"mse of last train data: 0.0011809135\\n\",\n      \"mse of last train data: 0.0011647923\\n\",\n      \"mse of last train data: 0.001151103\\n\",\n      \"mse of last train data: 0.001145226\\n\",\n      \"mse of last train data: 0.0011862615\\n\",\n      \"mse of last train data: 0.001189354\\n\",\n      \"mse of last train data: 0.001171359\\n\",\n      \"mse of last train data: 0.0011854062\\n\",\n      \"mse of last train data: 0.0011679702\\n\",\n      \"mse of last train data: 0.0011461786\\n\",\n      \"mse of last train data: 0.0011005491\\n\",\n      \"mse of last train data: 0.0010598543\\n\",\n      \"mse of last train data: 0.0010017945\\n\",\n      \"mse of last train data: 0.0009647608\\n\",\n      \"mse of last train data: 0.0009159361\\n\",\n      \"mse of last train data: 0.0008956352\\n\",\n      \"mse of last train data: 0.00088806055\\n\",\n      \"mse of last train data: 0.0008519254\\n\",\n      \"mse of last train data: 0.0008260835\\n\",\n      \"mse of last train data: 0.0008365163\\n\",\n      \"mse of last train data: 0.0008214434\\n\",\n      \"mse of last train data: 0.0008438503\\n\",\n      \"mse of last train data: 0.0008232932\\n\",\n      \"mse of last train data: 0.00079800043\\n\",\n      \"mse of last train data: 0.0007680562\\n\",\n      \"mse of last train data: 0.00074435334\\n\",\n      \"mse of last train data: 0.00073817075\\n\",\n      \"mse of last train data: 0.0007202183\\n\",\n      \"mse of last train data: 0.0007133703\\n\",\n      \"mse of last train data: 0.00071843615\\n\",\n      \"mse of last train data: 0.000768639\\n\",\n      \"mse of last train data: 0.0007931737\\n\",\n      \"mse of last train data: 0.00075426634\\n\",\n      \"mse of last train data: 0.000743786\\n\",\n      \"mse of last train data: 0.0007255434\\n\",\n      \"mse of last train data: 0.000679125\\n\",\n      \"mse of last train data: 0.0006794581\\n\",\n      \"mse of last train data: 0.00067914464\\n\",\n      \"mse of last train data: 0.0006936631\\n\",\n      \"mse of last train data: 0.00069016375\\n\",\n      \"mse of last train data: 0.00071026816\\n\",\n      \"mse of last train data: 0.0007423688\\n\",\n      \"mse of last train data: 0.0007434516\\n\",\n      \"mse of last train data: 0.000724178\\n\",\n      \"mse of last train data: 0.0007543912\\n\",\n      \"mse of last train data: 0.0007858621\\n\",\n      \"mse of last train data: 0.00080036814\\n\",\n      \"mse of last train data: 0.0008466258\\n\",\n      \"mse of last train data: 0.0008750254\\n\",\n      \"mse of last train data: 0.00086509157\\n\",\n      \"mse of last train data: 0.00086944096\\n\",\n      \"mse of last train data: 0.0008660486\\n\",\n      \"mse of last train data: 0.00088088954\\n\",\n      \"mse of last train data: 0.0008952701\\n\",\n      \"mse of last train data: 0.00092487794\\n\",\n      \"mse of last train data: 0.00091398106\\n\",\n      \"mse of last train data: 0.00094530836\\n\",\n      \"mse of last train data: 0.0009165718\\n\",\n      \"mse of last train data: 0.000874996\\n\",\n      \"mse of last train data: 0.0008461645\\n\",\n      \"mse of last train data: 0.0008665467\\n\",\n      \"mse of last train data: 0.0008962643\\n\",\n      \"mse of last train data: 0.000867555\\n\",\n      \"mse of last train data: 0.00085542275\\n\",\n      \"mse of last train data: 0.00084130606\\n\",\n      \"mse of last train data: 0.0008583149\\n\",\n      \"mse of last train data: 0.0009010726\\n\",\n      \"mse of last train data: 0.000943708\\n\",\n      \"mse of last train data: 0.0009260789\\n\",\n      \"mse of last train data: 0.0009556278\\n\",\n      \"mse of last train data: 0.0009409341\\n\",\n      \"mse of last train data: 0.00088871294\\n\",\n      \"mse of last train data: 0.00085274776\\n\",\n      \"mse of last train data: 0.0008155256\\n\",\n      \"mse of last train data: 0.0007758231\\n\",\n      \"mse of last train data: 0.0007605526\\n\",\n      \"mse of last train data: 0.0007996544\\n\",\n      \"mse of last train data: 0.0008727017\\n\",\n      \"mse of last train data: 0.00087935326\\n\",\n      \"mse of last train data: 0.0008888069\\n\",\n      \"mse of last train data: 0.0009274797\\n\",\n      \"mse of last train data: 0.0009084317\\n\",\n      \"mse of last train data: 0.0009072056\\n\",\n      \"mse of last train data: 0.00092767144\\n\",\n      \"mse of last train data: 0.0009333326\\n\",\n      \"mse of last train data: 0.000952322\\n\",\n      \"mse of last train data: 0.00096932956\\n\",\n      \"mse of last train data: 0.0009827061\\n\",\n      \"mse of last train data: 0.0010207826\\n\",\n      \"mse of last train data: 0.0010841498\\n\",\n      \"mse of last train data: 0.0011546806\\n\",\n      \"mse of last train data: 0.0012104256\\n\",\n      \"mse of last train data: 0.0012216566\\n\",\n      \"mse of last train data: 0.0012382811\\n\",\n      \"mse of last train data: 0.001256439\\n\",\n      \"mse of last train data: 0.001238168\\n\",\n      \"mse of last train data: 0.0011961329\\n\",\n      \"mse of last train data: 0.0012093284\\n\",\n      \"mse of last train data: 0.0012249821\\n\",\n      \"mse of last train data: 0.0012608183\\n\",\n      \"mse of last train data: 0.0012794193\\n\",\n      \"mse of last train data: 0.0012739777\\n\",\n      \"mse of last train data: 0.0013050393\\n\",\n      \"mse of last train data: 0.0012952167\\n\",\n      \"mse of last train data: 0.0012893219\\n\",\n      \"mse of last train data: 0.0013364957\\n\",\n      \"mse of last train data: 0.0013219004\\n\",\n      \"mse of last train data: 0.0013564738\\n\",\n      \"mse of last train data: 0.0013818522\\n\",\n      \"mse of last train data: 0.001437685\\n\",\n      \"mse of last train data: 0.0014729805\\n\",\n      \"mse of last train data: 0.0015169979\\n\",\n      \"mse of last train data: 0.0015033745\\n\",\n      \"mse of last train data: 0.0014634663\\n\",\n      \"mse of last train data: 0.0015589262\\n\",\n      \"mse of last train data: 0.0015290685\\n\",\n      \"mse of last train data: 0.0015401517\\n\",\n      \"mse of last train data: 0.0015024173\\n\",\n      \"mse of last train data: 0.0015139772\\n\",\n      \"mse of last train data: 0.0014650718\\n\",\n      \"mse of last train data: 0.0014674219\\n\",\n      \"mse of last train data: 0.0014168425\\n\",\n      \"mse of last train data: 0.0013707344\\n\",\n      \"mse of last train data: 0.0013549054\\n\",\n      \"mse of last train data: 0.0013009903\\n\",\n      \"mse of last train data: 0.0012954032\\n\",\n      \"mse of last train data: 0.0013331287\\n\",\n      \"mse of last train data: 0.0012916501\\n\",\n      \"mse of last train data: 0.0012935335\\n\",\n      \"mse of last train data: 0.0012434056\\n\",\n      \"mse of last train data: 0.0012132756\\n\",\n      \"mse of last train data: 0.0011929887\\n\",\n      \"mse of last train data: 0.0011641278\\n\",\n      \"mse of last train data: 0.0011291781\\n\",\n      \"mse of last train data: 0.001105667\\n\",\n      \"mse of last train data: 0.001068929\\n\",\n      \"mse of last train data: 0.0010534077\\n\",\n      \"mse of last train data: 0.0010043996\\n\",\n      \"mse of last train data: 0.0010471272\\n\",\n      \"mse of last train data: 0.0010445536\\n\",\n      \"mse of last train data: 0.0010292436\\n\",\n      \"mse of last train data: 0.0009952802\\n\",\n      \"mse of last train data: 0.0009422138\\n\",\n      \"mse of last train data: 0.00095950224\\n\",\n      \"mse of last train data: 0.00096409523\\n\",\n      \"mse of last train data: 0.0009150089\\n\",\n      \"mse of last train data: 0.00091790827\\n\",\n      \"mse of last train data: 0.00093758426\\n\",\n      \"mse of last train data: 0.0008784499\\n\",\n      \"mse of last train data: 0.0008645862\\n\",\n      \"mse of last train data: 0.00087230065\\n\",\n      \"mse of last train data: 0.00084728515\\n\",\n      \"mse of last train data: 0.0007924842\\n\",\n      \"mse of last train data: 0.0007767578\\n\",\n      \"mse of last train data: 0.0007844462\\n\",\n      \"mse of last train data: 0.0008004956\\n\",\n      \"mse of last train data: 0.0007891942\\n\",\n      \"mse of last train data: 0.0007798631\\n\",\n      \"mse of last train data: 0.0007435473\\n\",\n      \"mse of last train data: 0.0007671225\\n\",\n      \"mse of last train data: 0.00077114406\\n\",\n      \"mse of last train data: 0.0007509592\\n\",\n      \"mse of last train data: 0.0007833343\\n\",\n      \"mse of last train data: 0.0007639879\\n\",\n      \"mse of last train data: 0.0007625261\\n\",\n      \"mse of last train data: 0.0007714412\\n\",\n      \"mse of last train data: 0.00075920875\\n\",\n      \"mse of last train data: 0.0007519961\\n\",\n      \"mse of last train data: 0.0007488591\\n\",\n      \"mse of last train data: 0.000782313\\n\",\n      \"mse of last train data: 0.0007965821\\n\",\n      \"mse of last train data: 0.00081012276\\n\",\n      \"mse of last train data: 0.0008296337\\n\",\n      \"mse of last train data: 0.00075105747\\n\",\n      \"mse of last train data: 0.0007071131\\n\",\n      \"mse of last train data: 0.0007179317\\n\",\n      \"mse of last train data: 0.00071533705\\n\",\n      \"mse of last train data: 0.0006914794\\n\",\n      \"mse of last train data: 0.00066226\\n\",\n      \"mse of last train data: 0.0007012957\\n\",\n      \"mse of last train data: 0.0006899659\\n\",\n      \"mse of last train data: 0.0006702315\\n\",\n      \"mse of last train data: 0.0006717992\\n\",\n      \"mse of last train data: 0.0006725623\\n\",\n      \"mse of last train data: 0.0007080733\\n\",\n      \"mse of last train data: 0.000677911\\n\",\n      \"mse of last train data: 0.0006701805\\n\",\n      \"mse of last train data: 0.0006941974\\n\",\n      \"mse of last train data: 0.0006673816\\n\",\n      \"mse of last train data: 0.0006817229\\n\",\n      \"mse of last train data: 0.0007079854\\n\",\n      \"mse of last train data: 0.0007285663\\n\",\n      \"mse of last train data: 0.00076610706\\n\",\n      \"mse of last train data: 0.000765858\\n\",\n      \"mse of last train data: 0.0007985458\\n\",\n      \"mse of last train data: 0.0007853478\\n\",\n      \"mse of last train data: 0.00078308955\\n\",\n      \"mse of last train data: 0.0007895325\\n\",\n      \"mse of last train data: 0.0007736814\\n\",\n      \"mse of last train data: 0.0007822404\\n\",\n      \"mse of last train data: 0.0007990075\\n\",\n      \"mse of last train data: 0.0007671225\\n\",\n      \"mse of last train data: 0.0007572188\\n\",\n      \"mse of last train data: 0.0007455763\\n\",\n      \"mse of last train data: 0.0007594815\\n\",\n      \"mse of last train data: 0.00077661604\\n\",\n      \"mse of last train data: 0.0007761848\\n\",\n      \"mse of last train data: 0.0007980282\\n\",\n      \"mse of last train data: 0.00084878586\\n\",\n      \"mse of last train data: 0.00095800543\\n\",\n      \"mse of last train data: 0.0009898231\\n\"\n     ]\n    },\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"mse of last train data: 0.0009541947\\n\",\n      \"mse of last train data: 0.0010108207\\n\",\n      \"mse of last train data: 0.0010364436\\n\",\n      \"mse of last train data: 0.0009894947\\n\",\n      \"mse of last train data: 0.00097643986\\n\",\n      \"mse of last train data: 0.000925609\\n\",\n      \"mse of last train data: 0.0009026852\\n\",\n      \"mse of last train data: 0.00093772635\\n\",\n      \"mse of last train data: 0.0009970642\\n\",\n      \"mse of last train data: 0.0010504007\\n\",\n      \"mse of last train data: 0.0011059847\\n\",\n      \"mse of last train data: 0.0011673279\\n\",\n      \"mse of last train data: 0.0011629892\\n\",\n      \"mse of last train data: 0.0011685679\\n\",\n      \"mse of last train data: 0.0012121707\\n\",\n      \"mse of last train data: 0.0011760428\\n\",\n      \"mse of last train data: 0.0011301434\\n\",\n      \"mse of last train data: 0.0011292599\\n\",\n      \"mse of last train data: 0.0012091325\\n\",\n      \"mse of last train data: 0.0012273844\\n\",\n      \"mse of last train data: 0.0012395179\\n\",\n      \"mse of last train data: 0.0012739047\\n\",\n      \"mse of last train data: 0.0013571507\\n\",\n      \"mse of last train data: 0.0013433759\\n\",\n      \"mse of last train data: 0.0013559854\\n\",\n      \"mse of last train data: 0.0013994459\\n\",\n      \"mse of last train data: 0.0014797584\\n\",\n      \"mse of last train data: 0.0015326106\\n\",\n      \"mse of last train data: 0.0015211492\\n\",\n      \"mse of last train data: 0.0015538143\\n\",\n      \"mse of last train data: 0.0016037362\\n\",\n      \"mse of last train data: 0.0015823002\\n\",\n      \"mse of last train data: 0.0015571585\\n\",\n      \"mse of last train data: 0.001545502\\n\",\n      \"mse of last train data: 0.0015368324\\n\",\n      \"mse of last train data: 0.0014802022\\n\",\n      \"mse of last train data: 0.0014094602\\n\",\n      \"mse of last train data: 0.0013853377\\n\",\n      \"mse of last train data: 0.0012809603\\n\",\n      \"mse of last train data: 0.0012235981\\n\",\n      \"mse of last train data: 0.0012257422\\n\",\n      \"mse of last train data: 0.0012544547\\n\",\n      \"mse of last train data: 0.0012399516\\n\",\n      \"mse of last train data: 0.0012709155\\n\",\n      \"mse of last train data: 0.0012713958\\n\",\n      \"mse of last train data: 0.0012468753\\n\",\n      \"mse of last train data: 0.0012133922\\n\",\n      \"mse of last train data: 0.0011484857\\n\",\n      \"mse of last train data: 0.001122947\\n\",\n      \"mse of last train data: 0.0011318541\\n\",\n      \"mse of last train data: 0.0010868455\\n\",\n      \"mse of last train data: 0.0010498461\\n\",\n      \"mse of last train data: 0.001072044\\n\",\n      \"mse of last train data: 0.0010659883\\n\",\n      \"mse of last train data: 0.0010233234\\n\",\n      \"mse of last train data: 0.0009665305\\n\",\n      \"mse of last train data: 0.00093571533\\n\",\n      \"mse of last train data: 0.0009545754\\n\",\n      \"mse of last train data: 0.000932956\\n\",\n      \"mse of last train data: 0.00092874095\\n\",\n      \"mse of last train data: 0.00093626074\\n\",\n      \"mse of last train data: 0.0009557613\\n\",\n      \"mse of last train data: 0.0009824438\\n\",\n      \"mse of last train data: 0.0009876572\\n\",\n      \"mse of last train data: 0.0009950006\\n\",\n      \"mse of last train data: 0.0009688083\\n\",\n      \"mse of last train data: 0.00096217537\\n\",\n      \"mse of last train data: 0.0009313186\\n\",\n      \"mse of last train data: 0.000918295\\n\",\n      \"mse of last train data: 0.0009082833\\n\",\n      \"mse of last train data: 0.0008865691\\n\",\n      \"mse of last train data: 0.00086521485\\n\",\n      \"mse of last train data: 0.0008536012\\n\",\n      \"mse of last train data: 0.0008478385\\n\",\n      \"mse of last train data: 0.0008322337\\n\",\n      \"mse of last train data: 0.0008125947\\n\",\n      \"mse of last train data: 0.0008112473\\n\",\n      \"mse of last train data: 0.0007705171\\n\",\n      \"mse of last train data: 0.0007348005\\n\",\n      \"mse of last train data: 0.0007527921\\n\",\n      \"mse of last train data: 0.0007673946\\n\",\n      \"mse of last train data: 0.00075016933\\n\",\n      \"mse of last train data: 0.00074245286\\n\",\n      \"mse of last train data: 0.0007343074\\n\",\n      \"mse of last train data: 0.00077942637\\n\",\n      \"mse of last train data: 0.00078259496\\n\",\n      \"mse of last train data: 0.00079123955\\n\",\n      \"mse of last train data: 0.00080244197\\n\",\n      \"mse of last train data: 0.0007918219\\n\",\n      \"mse of last train data: 0.0007765784\\n\",\n      \"mse of last train data: 0.0007558805\\n\",\n      \"mse of last train data: 0.00078713265\\n\",\n      \"mse of last train data: 0.0008180782\\n\",\n      \"mse of last train data: 0.00081295223\\n\",\n      \"mse of last train data: 0.0007907967\\n\",\n      \"mse of last train data: 0.0007853339\\n\",\n      \"mse of last train data: 0.00078770664\\n\",\n      \"mse of last train data: 0.00077738496\\n\",\n      \"mse of last train data: 0.00073202804\\n\",\n      \"mse of last train data: 0.0007404461\\n\",\n      \"mse of last train data: 0.0007666396\\n\",\n      \"mse of last train data: 0.00081070245\\n\",\n      \"mse of last train data: 0.0008375156\\n\",\n      \"mse of last train data: 0.00087021873\\n\",\n      \"mse of last train data: 0.0008757806\\n\",\n      \"mse of last train data: 0.00089811\\n\",\n      \"mse of last train data: 0.0008853341\\n\",\n      \"mse of last train data: 0.00087567733\\n\",\n      \"mse of last train data: 0.00089108734\\n\",\n      \"mse of last train data: 0.0008722552\\n\",\n      \"mse of last train data: 0.0008424445\\n\",\n      \"mse of last train data: 0.0008453589\\n\",\n      \"mse of last train data: 0.00085609156\\n\",\n      \"mse of last train data: 0.0008375242\\n\",\n      \"mse of last train data: 0.0007777993\\n\",\n      \"mse of last train data: 0.0007801824\\n\",\n      \"mse of last train data: 0.0007780854\\n\",\n      \"mse of last train data: 0.00074772915\\n\",\n      \"mse of last train data: 0.0008021815\\n\",\n      \"mse of last train data: 0.000852052\\n\",\n      \"mse of last train data: 0.0008834996\\n\",\n      \"mse of last train data: 0.00088296935\\n\",\n      \"mse of last train data: 0.0009120857\\n\",\n      \"mse of last train data: 0.0009316169\\n\",\n      \"mse of last train data: 0.00089627743\\n\",\n      \"mse of last train data: 0.00087186054\\n\",\n      \"mse of last train data: 0.0008672923\\n\",\n      \"mse of last train data: 0.0008451662\\n\",\n      \"mse of last train data: 0.0008207845\\n\",\n      \"mse of last train data: 0.0007788843\\n\",\n      \"mse of last train data: 0.00076644396\\n\",\n      \"mse of last train data: 0.00078863965\\n\",\n      \"mse of last train data: 0.0008183467\\n\",\n      \"mse of last train data: 0.0008206188\\n\",\n      \"mse of last train data: 0.0008191548\\n\",\n      \"mse of last train data: 0.0008181697\\n\",\n      \"mse of last train data: 0.0008295404\\n\",\n      \"mse of last train data: 0.0008369502\\n\",\n      \"mse of last train data: 0.00087504473\\n\",\n      \"mse of last train data: 0.00094807264\\n\",\n      \"mse of last train data: 0.00095168565\\n\",\n      \"mse of last train data: 0.00093786785\\n\",\n      \"mse of last train data: 0.0009494926\\n\",\n      \"mse of last train data: 0.00095221156\\n\",\n      \"mse of last train data: 0.00096416246\\n\",\n      \"mse of last train data: 0.0010382076\\n\",\n      \"mse of last train data: 0.0010461614\\n\",\n      \"mse of last train data: 0.0010444447\\n\",\n      \"mse of last train data: 0.0010638619\\n\",\n      \"mse of last train data: 0.0010496473\\n\",\n      \"mse of last train data: 0.0010483713\\n\",\n      \"mse of last test data: 0.0010384414\\n\",\n      \"mse of last test data: 0.001307694\\n\",\n      \"mse of last test data: 0.0017374953\\n\",\n      \"mse of last test data: 0.0023031589\\n\",\n      \"mse of last test data: 0.0029748592\\n\",\n      \"mse of last test data: 0.0037031618\\n\",\n      \"mse of last test data: 0.0045573018\\n\",\n      \"mse of last test data: 0.0055009406\\n\",\n      \"mse of last test data: 0.006388207\\n\",\n      \"mse of last test data: 0.007588866\\n\",\n      \"mse of last test data: 0.00892342\\n\",\n      \"mse of last test data: 0.009982019\\n\",\n      \"mse of last test data: 0.011053708\\n\",\n      \"mse of last test data: 0.012057285\\n\",\n      \"mse of last test data: 0.013137471\\n\",\n      \"mse of last test data: 0.014322686\\n\",\n      \"mse of last test data: 0.015435629\\n\",\n      \"mse of last test data: 0.0164074\\n\",\n      \"mse of last test data: 0.017558564\\n\",\n      \"mse of last test data: 0.018451324\\n\",\n      \"mse of last test data: 0.019547584\\n\",\n      \"mse of last test data: 0.020846648\\n\",\n      \"mse of last test data: 0.022295011\\n\",\n      \"mse of last test data: 0.023751698\\n\",\n      \"mse of last test data: 0.025166908\\n\",\n      \"mse of last test data: 0.026294477\\n\",\n      \"mse of last test data: 0.027411463\\n\",\n      \"mse of last test data: 0.028650785\\n\",\n      \"mse of last test data: 0.029543892\\n\",\n      \"mse of last test data: 0.03069337\\n\",\n      \"mse of last test data: 0.031689584\\n\",\n      \"mse of last test data: 0.032348324\\n\",\n      \"mse of last test data: 0.032735217\\n\",\n      \"mse of last test data: 0.032774836\\n\",\n      \"mse of last test data: 0.033247374\\n\",\n      \"mse of last test data: 0.033966284\\n\",\n      \"mse of last test data: 0.034178574\\n\",\n      \"mse of last test data: 0.034851965\\n\",\n      \"mse of last test data: 0.03574161\\n\",\n      \"mse of last test data: 0.03627641\\n\",\n      \"mse of last test data: 0.037307043\\n\",\n      \"mse of last test data: 0.03826935\\n\",\n      \"mse of last test data: 0.039126046\\n\",\n      \"mse of last test data: 0.040106446\\n\",\n      \"mse of last test data: 0.040581167\\n\",\n      \"mse of last test data: 0.040892914\\n\",\n      \"mse of last test data: 0.041396786\\n\",\n      \"mse of last test data: 0.04206962\\n\",\n      \"mse of last test data: 0.042384546\\n\",\n      \"mse of last test data: 0.04255963\\n\",\n      \"mse of last test data: 0.042533204\\n\",\n      \"mse of last test data: 0.042531297\\n\",\n      \"mse of last test data: 0.04243757\\n\",\n      \"mse of last test data: 0.042328015\\n\",\n      \"mse of last test data: 0.04236642\\n\",\n      \"mse of last test data: 0.042201947\\n\",\n      \"mse of last test data: 0.042245027\\n\",\n      \"mse of last test data: 0.04205504\\n\",\n      \"mse of last test data: 0.041910607\\n\",\n      \"mse of last test data: 0.041927192\\n\",\n      \"mse of last test data: 0.0419992\\n\",\n      \"mse of last test data: 0.042246398\\n\",\n      \"mse of last test data: 0.042536404\\n\",\n      \"mse of last test data: 0.042835034\\n\",\n      \"mse of last test data: 0.042819537\\n\",\n      \"mse of last test data: 0.04295462\\n\",\n      \"mse of last test data: 0.043051228\\n\",\n      \"mse of last test data: 0.043088567\\n\",\n      \"mse of last test data: 0.043004733\\n\",\n      \"mse of last test data: 0.042714253\\n\",\n      \"mse of last test data: 0.042343702\\n\",\n      \"mse of last test data: 0.04196994\\n\",\n      \"mse of last test data: 0.041456442\\n\",\n      \"mse of last test data: 0.041171037\\n\"\n     ]\n    },\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"mse of last test data: 0.04082334\\n\",\n      \"mse of last test data: 0.040083185\\n\",\n      \"mse of last test data: 0.03985819\\n\",\n      \"mse of last test data: 0.039754167\\n\",\n      \"mse of last test data: 0.039474037\\n\",\n      \"mse of last test data: 0.039507117\\n\",\n      \"mse of last test data: 0.039683733\\n\",\n      \"mse of last test data: 0.039667007\\n\",\n      \"mse of last test data: 0.03954234\\n\",\n      \"mse of last test data: 0.03914306\\n\",\n      \"mse of last test data: 0.0385736\\n\",\n      \"mse of last test data: 0.038148172\\n\",\n      \"mse of last test data: 0.037649598\\n\",\n      \"mse of last test data: 0.037061617\\n\",\n      \"mse of last test data: 0.036700785\\n\",\n      \"mse of last test data: 0.036190856\\n\",\n      \"mse of last test data: 0.035422195\\n\",\n      \"mse of last test data: 0.034796197\\n\",\n      \"mse of last test data: 0.034407858\\n\",\n      \"mse of last test data: 0.034019623\\n\",\n      \"mse of last test data: 0.033275053\\n\",\n      \"mse of last test data: 0.03250243\\n\",\n      \"mse of last test data: 0.031793736\\n\",\n      \"mse of last test data: 0.03122516\\n\",\n      \"mse of last test data: 0.030735435\\n\",\n      \"mse of last test data: 0.030259106\\n\",\n      \"mse of last test data: 0.030017732\\n\",\n      \"mse of last test data: 0.02974167\\n\",\n      \"mse of last test data: 0.02909848\\n\",\n      \"mse of last test data: 0.02833938\\n\",\n      \"mse of last test data: 0.02780824\\n\",\n      \"mse of last test data: 0.027193166\\n\",\n      \"mse of last test data: 0.026475754\\n\",\n      \"mse of last test data: 0.025667634\\n\",\n      \"mse of last test data: 0.024950879\\n\",\n      \"mse of last test data: 0.024222\\n\",\n      \"mse of last test data: 0.023429502\\n\",\n      \"mse of last test data: 0.02254987\\n\",\n      \"mse of last test data: 0.02196828\\n\",\n      \"mse of last test data: 0.021193521\\n\",\n      \"mse of last test data: 0.02028674\\n\",\n      \"mse of last test data: 0.019646509\\n\",\n      \"mse of last test data: 0.018891536\\n\",\n      \"mse of last test data: 0.018168326\\n\",\n      \"mse of last test data: 0.0175475\\n\",\n      \"mse of last test data: 0.016908957\\n\",\n      \"mse of last test data: 0.01619197\\n\",\n      \"mse of last test data: 0.01544866\\n\",\n      \"mse of last test data: 0.014649941\\n\",\n      \"mse of last test data: 0.013815872\\n\",\n      \"mse of last test data: 0.012977094\\n\",\n      \"mse of last test data: 0.012175543\\n\",\n      \"mse of last test data: 0.011358927\\n\",\n      \"mse of last test data: 0.010680771\\n\",\n      \"mse of last test data: 0.009901247\\n\",\n      \"mse of last test data: 0.009313815\\n\",\n      \"mse of last test data: 0.008677138\\n\",\n      \"mse of last test data: 0.008175264\\n\",\n      \"mse of last test data: 0.007842597\\n\",\n      \"mse of last test data: 0.007610578\\n\",\n      \"mse of last test data: 0.007446367\\n\",\n      \"mse of last test data: 0.007328755\\n\",\n      \"mse of last test data: 0.0072706873\\n\",\n      \"mse of last test data: 0.0072315196\\n\",\n      \"mse of last test data: 0.0072507737\\n\",\n      \"mse of last test data: 0.0074456963\\n\",\n      \"mse of last test data: 0.0076559093\\n\",\n      \"mse of last test data: 0.007952152\\n\",\n      \"mse of last test data: 0.008333183\\n\",\n      \"mse of last test data: 0.008844702\\n\",\n      \"mse of last test data: 0.009205255\\n\",\n      \"mse of last test data: 0.009758698\\n\",\n      \"mse of last test data: 0.010508039\\n\",\n      \"mse of last test data: 0.011222202\\n\",\n      \"mse of last test data: 0.012041376\\n\",\n      \"mse of last test data: 0.013106552\\n\",\n      \"mse of last test data: 0.014052004\\n\",\n      \"mse of last test data: 0.014951649\\n\",\n      \"mse of last test data: 0.01584717\\n\",\n      \"mse of last test data: 0.016637348\\n\",\n      \"mse of last test data: 0.017568303\\n\",\n      \"mse of last test data: 0.01823545\\n\",\n      \"mse of last test data: 0.018862344\\n\",\n      \"mse of last test data: 0.01954903\\n\",\n      \"mse of last test data: 0.020380951\\n\",\n      \"mse of last test data: 0.021499444\\n\",\n      \"mse of last test data: 0.022486042\\n\",\n      \"mse of last test data: 0.023462072\\n\",\n      \"mse of last test data: 0.024444459\\n\",\n      \"mse of last test data: 0.025658702\\n\",\n      \"mse of last test data: 0.026623877\\n\",\n      \"mse of last test data: 0.027497932\\n\",\n      \"mse of last test data: 0.028352885\\n\",\n      \"mse of last test data: 0.029477308\\n\",\n      \"mse of last test data: 0.030210283\\n\",\n      \"mse of last test data: 0.03099371\\n\",\n      \"mse of last test data: 0.031869322\\n\",\n      \"mse of last test data: 0.032669522\\n\",\n      \"mse of last test data: 0.03350015\\n\",\n      \"mse of last test data: 0.034063555\\n\",\n      \"mse of last test data: 0.034736462\\n\",\n      \"mse of last test data: 0.035724353\\n\",\n      \"mse of last test data: 0.036485925\\n\",\n      \"mse of last test data: 0.036842436\\n\",\n      \"mse of last test data: 0.037415814\\n\",\n      \"mse of last test data: 0.037718218\\n\",\n      \"mse of last test data: 0.03796529\\n\",\n      \"mse of last test data: 0.038130216\\n\",\n      \"mse of last test data: 0.038551964\\n\",\n      \"mse of last test data: 0.038782805\\n\",\n      \"mse of last test data: 0.038809787\\n\",\n      \"mse of last test data: 0.0388401\\n\",\n      \"mse of last test data: 0.038793024\\n\",\n      \"mse of last test data: 0.03895594\\n\",\n      \"mse of last test data: 0.03914743\\n\",\n      \"mse of last test data: 0.039296836\\n\",\n      \"mse of last test data: 0.039728686\\n\",\n      \"mse of last test data: 0.040101677\\n\",\n      \"mse of last test data: 0.040367268\\n\",\n      \"mse of last test data: 0.040627647\\n\",\n      \"mse of last test data: 0.040936448\\n\",\n      \"mse of last test data: 0.041172534\\n\",\n      \"mse of last test data: 0.041425318\\n\",\n      \"mse of last test data: 0.04147524\\n\",\n      \"mse of last test data: 0.04157543\\n\",\n      \"mse of last test data: 0.041296557\\n\",\n      \"mse of last test data: 0.041335024\\n\",\n      \"mse of last test data: 0.041136358\\n\",\n      \"mse of last test data: 0.040835697\\n\",\n      \"mse of last test data: 0.04065752\\n\",\n      \"mse of last test data: 0.04041579\\n\",\n      \"mse of last test data: 0.040381014\\n\",\n      \"mse of last test data: 0.04044666\\n\",\n      \"mse of last test data: 0.04036908\\n\",\n      \"mse of last test data: 0.040147748\\n\",\n      \"mse of last test data: 0.04003042\\n\",\n      \"mse of last test data: 0.03965651\\n\",\n      \"mse of last test data: 0.03932365\\n\",\n      \"mse of last test data: 0.03912295\\n\",\n      \"mse of last test data: 0.038741607\\n\",\n      \"mse of last test data: 0.038381852\\n\",\n      \"mse of last test data: 0.038367312\\n\",\n      \"mse of last test data: 0.03811866\\n\",\n      \"mse of last test data: 0.037675697\\n\",\n      \"mse of last test data: 0.037530858\\n\",\n      \"mse of last test data: 0.03723132\\n\",\n      \"mse of last test data: 0.03688892\\n\",\n      \"mse of last test data: 0.03685664\\n\",\n      \"mse of last test data: 0.03657884\\n\",\n      \"mse of last test data: 0.03635766\\n\",\n      \"mse of last test data: 0.03633707\\n\",\n      \"mse of last test data: 0.036062397\\n\",\n      \"mse of last test data: 0.035945144\\n\",\n      \"mse of last test data: 0.035621196\\n\",\n      \"mse of last test data: 0.03516288\\n\",\n      \"mse of last test data: 0.03473452\\n\",\n      \"mse of last test data: 0.03427851\\n\",\n      \"mse of last test data: 0.0338027\\n\",\n      \"mse of last test data: 0.03323697\\n\",\n      \"mse of last test data: 0.032772798\\n\",\n      \"mse of last test data: 0.032562565\\n\",\n      \"mse of last test data: 0.032350477\\n\",\n      \"mse of last test data: 0.032089394\\n\",\n      \"mse of last test data: 0.031830788\\n\",\n      \"mse of last test data: 0.031764828\\n\",\n      \"mse of last test data: 0.03166443\\n\",\n      \"mse of last test data: 0.03170151\\n\",\n      \"mse of last test data: 0.031261694\\n\",\n      \"mse of last test data: 0.030939216\\n\",\n      \"mse of last test data: 0.03081177\\n\",\n      \"mse of last test data: 0.030562615\\n\",\n      \"mse of last test data: 0.030256944\\n\",\n      \"mse of last test data: 0.030192852\\n\",\n      \"mse of last test data: 0.029942954\\n\",\n      \"mse of last test data: 0.029430553\\n\",\n      \"mse of last test data: 0.028814787\\n\",\n      \"mse of last test data: 0.028157063\\n\",\n      \"mse of last test data: 0.027540611\\n\",\n      \"mse of last test data: 0.027061442\\n\",\n      \"mse of last test data: 0.026554784\\n\",\n      \"mse of last test data: 0.026266748\\n\",\n      \"mse of last test data: 0.025907198\\n\",\n      \"mse of last test data: 0.025414491\\n\",\n      \"mse of last test data: 0.024933107\\n\",\n      \"mse of last test data: 0.024703918\\n\",\n      \"mse of last test data: 0.0248048\\n\",\n      \"mse of last test data: 0.024647307\\n\",\n      \"mse of last test data: 0.024336813\\n\",\n      \"mse of last test data: 0.023993976\\n\",\n      \"mse of last test data: 0.023803623\\n\",\n      \"mse of last test data: 0.023561517\\n\",\n      \"mse of last test data: 0.023275027\\n\",\n      \"mse of last test data: 0.022709692\\n\",\n      \"mse of last test data: 0.022081068\\n\",\n      \"mse of last test data: 0.021661425\\n\",\n      \"mse of last test data: 0.021428918\\n\",\n      \"mse of last test data: 0.021290788\\n\",\n      \"mse of last test data: 0.021268034\\n\",\n      \"mse of last test data: 0.021303197\\n\",\n      \"mse of last test data: 0.021500012\\n\",\n      \"mse of last test data: 0.021755792\\n\",\n      \"mse of last test data: 0.021958767\\n\",\n      \"mse of last test data: 0.022109263\\n\",\n      \"mse of last test data: 0.022315828\\n\",\n      \"mse of last test data: 0.022623992\\n\",\n      \"mse of last test data: 0.022780182\\n\",\n      \"mse of last test data: 0.023006381\\n\",\n      \"mse of last test data: 0.023298213\\n\",\n      \"mse of last test data: 0.023594327\\n\",\n      \"mse of last test data: 0.023626985\\n\",\n      \"mse of last test data: 0.023717942\\n\",\n      \"mse of last test data: 0.024134878\\n\",\n      \"mse of last test data: 0.024442924\\n\",\n      \"mse of last test data: 0.024846632\\n\",\n      \"mse of last test data: 0.025394179\\n\",\n      \"mse of last test data: 0.026140306\\n\",\n      \"mse of last test data: 0.026889877\\n\",\n      \"mse of last test data: 0.027327998\\n\",\n      \"mse of last test data: 0.027573977\\n\",\n      \"mse of last test data: 0.02802628\\n\",\n      \"mse of last test data: 0.028345205\\n\",\n      \"mse of last test data: 0.02849541\\n\",\n      \"mse of last test data: 0.028633604\\n\",\n      \"mse of last test data: 0.029166307\\n\",\n      \"mse of last test data: 0.029777998\\n\",\n      \"mse of last test data: 0.030415766\\n\",\n      \"mse of last test data: 0.030932292\\n\",\n      \"mse of last test data: 0.03141561\\n\",\n      \"mse of last test data: 0.031903934\\n\",\n      \"mse of last test data: 0.032281023\\n\",\n      \"mse of last test data: 0.0326458\\n\",\n      \"mse of last test data: 0.033046126\\n\",\n      \"mse of last test data: 0.03333811\\n\",\n      \"mse of last test data: 0.033477485\\n\",\n      \"mse of last test data: 0.033775162\\n\",\n      \"mse of last test data: 0.034282345\\n\",\n      \"mse of last test data: 0.03464786\\n\"\n     ]\n    },\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"mse of last test data: 0.035031658\\n\",\n      \"mse of last test data: 0.035490207\\n\",\n      \"mse of last test data: 0.03572595\\n\",\n      \"mse of last test data: 0.03601049\\n\",\n      \"mse of last test data: 0.03597831\\n\",\n      \"mse of last test data: 0.036039367\\n\",\n      \"mse of last test data: 0.03608627\\n\",\n      \"mse of last test data: 0.03606685\\n\",\n      \"mse of last test data: 0.03624761\\n\",\n      \"mse of last test data: 0.036428586\\n\",\n      \"mse of last test data: 0.03631103\\n\",\n      \"mse of last test data: 0.036340993\\n\",\n      \"mse of last test data: 0.036536086\\n\",\n      \"mse of last test data: 0.036383446\\n\",\n      \"mse of last test data: 0.03621247\\n\",\n      \"mse of last test data: 0.03625416\\n\",\n      \"mse of last test data: 0.036143474\\n\",\n      \"mse of last test data: 0.036067598\\n\",\n      \"mse of last test data: 0.036154605\\n\",\n      \"mse of last test data: 0.03604631\\n\",\n      \"mse of last test data: 0.0359825\\n\",\n      \"mse of last test data: 0.036142346\\n\",\n      \"mse of last test data: 0.036077425\\n\",\n      \"mse of last test data: 0.03606107\\n\",\n      \"mse of last test data: 0.036258876\\n\",\n      \"mse of last test data: 0.03632675\\n\",\n      \"mse of last test data: 0.036120854\\n\",\n      \"mse of last test data: 0.036069844\\n\",\n      \"mse of last test data: 0.036016762\\n\",\n      \"mse of last test data: 0.03600339\\n\",\n      \"mse of last test data: 0.036333516\\n\",\n      \"mse of last test data: 0.036598675\\n\",\n      \"mse of last test data: 0.036708616\\n\",\n      \"mse of last test data: 0.03702915\\n\",\n      \"mse of last test data: 0.03743927\\n\",\n      \"mse of last test data: 0.037524562\\n\",\n      \"mse of last test data: 0.037685137\\n\",\n      \"mse of last test data: 0.037835393\\n\",\n      \"mse of last test data: 0.037793335\\n\",\n      \"mse of last test data: 0.03783053\\n\",\n      \"mse of last test data: 0.03790146\\n\",\n      \"mse of last test data: 0.03799495\\n\",\n      \"mse of last test data: 0.038179226\\n\",\n      \"mse of last test data: 0.03811621\\n\",\n      \"mse of last test data: 0.037942342\\n\",\n      \"mse of last test data: 0.03772454\\n\",\n      \"mse of last test data: 0.037465274\\n\",\n      \"mse of last test data: 0.03732606\\n\",\n      \"mse of last test data: 0.037236284\\n\",\n      \"mse of last test data: 0.037277386\\n\",\n      \"mse of last test data: 0.037350263\\n\",\n      \"mse of last test data: 0.037502833\\n\",\n      \"mse of last test data: 0.037746042\\n\",\n      \"mse of last test data: 0.038084935\\n\",\n      \"mse of last test data: 0.038162284\\n\",\n      \"mse of last test data: 0.037942823\\n\",\n      \"mse of last test data: 0.037823606\\n\",\n      \"mse of last test data: 0.037551586\\n\",\n      \"mse of last test data: 0.037443716\\n\",\n      \"mse of last test data: 0.037281357\\n\",\n      \"mse of last test data: 0.037416983\\n\",\n      \"mse of last test data: 0.037451915\\n\",\n      \"mse of last test data: 0.037382595\\n\",\n      \"mse of last test data: 0.037274934\\n\",\n      \"mse of last test data: 0.037476376\\n\",\n      \"mse of last test data: 0.03734141\\n\",\n      \"mse of last test data: 0.037266914\\n\",\n      \"mse of last test data: 0.037171412\\n\",\n      \"mse of last test data: 0.037094492\\n\",\n      \"mse of last test data: 0.036912702\\n\",\n      \"mse of last test data: 0.036717176\\n\",\n      \"mse of last test data: 0.03696139\\n\",\n      \"mse of last test data: 0.037003577\\n\",\n      \"mse of last test data: 0.037010066\\n\",\n      \"mse of last test data: 0.037026666\\n\",\n      \"mse of last test data: 0.037105616\\n\",\n      \"mse of last test data: 0.037414543\\n\",\n      \"mse of last test data: 0.037588768\\n\",\n      \"mse of last test data: 0.037979055\\n\",\n      \"mse of last test data: 0.03834311\\n\",\n      \"mse of last test data: 0.03848743\\n\",\n      \"mse of last test data: 0.038371816\\n\",\n      \"mse of last test data: 0.038517695\\n\",\n      \"mse of last test data: 0.03890951\\n\",\n      \"mse of last test data: 0.039032325\\n\",\n      \"mse of last test data: 0.038940143\\n\",\n      \"mse of last test data: 0.039055612\\n\",\n      \"mse of last test data: 0.03948929\\n\",\n      \"mse of last test data: 0.039855823\\n\",\n      \"mse of last test data: 0.039860543\\n\",\n      \"mse of last test data: 0.039730966\\n\",\n      \"mse of last test data: 0.039699364\\n\",\n      \"mse of last test data: 0.039754596\\n\",\n      \"mse of last test data: 0.039835285\\n\",\n      \"mse of last test data: 0.039802346\\n\",\n      \"mse of last test data: 0.03984447\\n\",\n      \"mse of last test data: 0.0399325\\n\",\n      \"mse of last test data: 0.04027743\\n\",\n      \"mse of last test data: 0.04030818\\n\",\n      \"mse of last test data: 0.040431373\\n\",\n      \"mse of last test data: 0.04068201\\n\",\n      \"mse of last test data: 0.041012682\\n\",\n      \"mse of last test data: 0.04120658\\n\",\n      \"mse of last test data: 0.041185886\\n\",\n      \"mse of last test data: 0.041001167\\n\",\n      \"mse of last test data: 0.041156203\\n\",\n      \"mse of last test data: 0.041229323\\n\",\n      \"mse of last test data: 0.04103733\\n\",\n      \"mse of last test data: 0.04084468\\n\",\n      \"mse of last test data: 0.040916957\\n\",\n      \"mse of last test data: 0.041137584\\n\",\n      \"mse of last test data: 0.04123667\\n\",\n      \"mse of last test data: 0.04103982\\n\",\n      \"mse of last test data: 0.040686384\\n\",\n      \"mse of last test data: 0.04060656\\n\",\n      \"mse of last test data: 0.04076821\\n\",\n      \"mse of last test data: 0.04075272\\n\",\n      \"mse of last test data: 0.040907077\\n\",\n      \"mse of last test data: 0.040763214\\n\",\n      \"mse of last test data: 0.04057824\\n\",\n      \"mse of last test data: 0.040400766\\n\",\n      \"mse of last test data: 0.04029853\\n\",\n      \"mse of last test data: 0.04030188\\n\",\n      \"mse of last test data: 0.04051611\\n\",\n      \"mse of last test data: 0.040467434\\n\",\n      \"mse of last test data: 0.04032812\\n\",\n      \"mse of last test data: 0.040335715\\n\",\n      \"mse of last test data: 0.0405933\\n\",\n      \"mse of last test data: 0.040547967\\n\",\n      \"mse of last test data: 0.04082879\\n\",\n      \"mse of last test data: 0.04097587\\n\",\n      \"mse of last test data: 0.040699992\\n\",\n      \"mse of last test data: 0.040394023\\n\",\n      \"mse of last test data: 0.040129915\\n\",\n      \"mse of last test data: 0.039803337\\n\",\n      \"mse of last test data: 0.039406665\\n\",\n      \"mse of last test data: 0.039154865\\n\",\n      \"mse of last test data: 0.03869359\\n\",\n      \"mse of last test data: 0.0383316\\n\",\n      \"mse of last test data: 0.0379935\\n\",\n      \"mse of last test data: 0.03787038\\n\",\n      \"mse of last test data: 0.037636872\\n\",\n      \"mse of last test data: 0.037317097\\n\",\n      \"mse of last test data: 0.037037548\\n\",\n      \"mse of last test data: 0.03698923\\n\",\n      \"mse of last test data: 0.037039768\\n\",\n      \"mse of last test data: 0.036923762\\n\",\n      \"mse of last test data: 0.03671856\\n\",\n      \"mse of last test data: 0.03651316\\n\",\n      \"mse of last test data: 0.036244605\\n\",\n      \"mse of last test data: 0.036072135\\n\",\n      \"mse of last test data: 0.035909202\\n\",\n      \"mse of last test data: 0.035528228\\n\",\n      \"mse of last test data: 0.03558189\\n\",\n      \"mse of last test data: 0.035503305\\n\",\n      \"mse of last test data: 0.035497822\\n\",\n      \"mse of last test data: 0.035637442\\n\",\n      \"mse of last test data: 0.035471745\\n\",\n      \"mse of last test data: 0.035452746\\n\",\n      \"mse of last test data: 0.03572343\\n\",\n      \"mse of last test data: 0.0359579\\n\",\n      \"mse of last test data: 0.03599089\\n\",\n      \"mse of last test data: 0.03591044\\n\",\n      \"mse of last test data: 0.036002126\\n\",\n      \"mse of last test data: 0.03595816\\n\",\n      \"mse of last test data: 0.035726678\\n\",\n      \"mse of last test data: 0.035456814\\n\",\n      \"mse of last test data: 0.035001807\\n\",\n      \"mse of last test data: 0.034719385\\n\",\n      \"mse of last test data: 0.03468811\\n\",\n      \"mse of last test data: 0.034629267\\n\",\n      \"mse of last test data: 0.034678638\\n\",\n      \"mse of last test data: 0.034925133\\n\",\n      \"mse of last test data: 0.035014037\\n\",\n      \"mse of last test data: 0.03494468\\n\",\n      \"mse of last test data: 0.035068564\\n\",\n      \"mse of last test data: 0.035189286\\n\",\n      \"mse of last test data: 0.035209198\\n\",\n      \"mse of last test data: 0.035288822\\n\",\n      \"mse of last test data: 0.035522904\\n\",\n      \"mse of last test data: 0.035889734\\n\",\n      \"mse of last test data: 0.03612873\\n\",\n      \"mse of last test data: 0.036274746\\n\",\n      \"mse of last test data: 0.03674327\\n\",\n      \"mse of last test data: 0.037314296\\n\",\n      \"mse of last test data: 0.037749104\\n\",\n      \"mse of last test data: 0.03806662\\n\",\n      \"mse of last test data: 0.038177904\\n\",\n      \"mse of last test data: 0.038116015\\n\",\n      \"mse of last test data: 0.038094003\\n\",\n      \"mse of last test data: 0.038104504\\n\",\n      \"mse of last test data: 0.03827262\\n\",\n      \"mse of last test data: 0.038561925\\n\",\n      \"mse of last test data: 0.038967945\\n\",\n      \"mse of last test data: 0.039505426\\n\",\n      \"mse of last test data: 0.040004343\\n\",\n      \"mse of last test data: 0.040388074\\n\",\n      \"mse of last test data: 0.04060459\\n\",\n      \"mse of last test data: 0.041038353\\n\",\n      \"mse of last test data: 0.04167475\\n\",\n      \"mse of last test data: 0.04242282\\n\",\n      \"mse of last test data: 0.042974524\\n\",\n      \"mse of last test data: 0.043507062\\n\",\n      \"mse of last test data: 0.043978337\\n\",\n      \"mse of last test data: 0.044552732\\n\",\n      \"mse of last test data: 0.044811197\\n\",\n      \"mse of last test data: 0.044948854\\n\",\n      \"mse of last test data: 0.0453248\\n\",\n      \"mse of last test data: 0.045763493\\n\",\n      \"mse of last test data: 0.045807287\\n\",\n      \"mse of last test data: 0.04584695\\n\",\n      \"mse of last test data: 0.045835588\\n\",\n      \"mse of last test data: 0.046063326\\n\",\n      \"mse of last test data: 0.046142258\\n\",\n      \"mse of last test data: 0.04619061\\n\",\n      \"mse of last test data: 0.04602862\\n\",\n      \"mse of last test data: 0.046279095\\n\",\n      \"mse of last test data: 0.04648937\\n\",\n      \"mse of last test data: 0.046688378\\n\",\n      \"mse of last test data: 0.047017314\\n\",\n      \"mse of last test data: 0.04759529\\n\",\n      \"mse of last test data: 0.048187714\\n\",\n      \"mse of last test data: 0.04876649\\n\",\n      \"mse of last test data: 0.049561806\\n\",\n      \"mse of last test data: 0.050339673\\n\",\n      \"mse of last test data: 0.050895724\\n\",\n      \"mse of last test data: 0.051403012\\n\",\n      \"mse of last test data: 0.051551413\\n\",\n      \"mse of last test data: 0.05184145\\n\",\n      \"mse of last test data: 0.05213111\\n\",\n      \"mse of last test data: 0.05201789\\n\",\n      \"mse of last test data: 0.05168149\\n\",\n      \"mse of last test data: 0.05192534\\n\",\n      \"mse of last test data: 0.05235551\\n\",\n      \"mse of last test data: 0.052856937\\n\",\n      \"mse of last test data: 0.053938713\\n\",\n      \"mse of last test data: 0.054606132\\n\",\n      \"mse of last test data: 0.055008397\\n\",\n      \"mse of last test data: 0.055384487\\n\",\n      \"mse of last test data: 0.05562475\\n\",\n      \"mse of last test data: 0.05541428\\n\",\n      \"mse of last test data: 0.055100046\\n\"\n     ]\n    },\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"mse of last test data: 0.054605152\\n\",\n      \"mse of last test data: 0.054154\\n\",\n      \"mse of last test data: 0.05385637\\n\",\n      \"mse of last test data: 0.0536435\\n\",\n      \"mse of last test data: 0.05328147\\n\",\n      \"mse of last test data: 0.053027265\\n\",\n      \"mse of last test data: 0.053042434\\n\",\n      \"mse of last test data: 0.05267731\\n\",\n      \"mse of last test data: 0.052673582\\n\",\n      \"mse of last test data: 0.05239616\\n\",\n      \"mse of last test data: 0.051708102\\n\",\n      \"mse of last test data: 0.051275477\\n\",\n      \"mse of last test data: 0.05111995\\n\",\n      \"mse of last test data: 0.050987016\\n\",\n      \"mse of last test data: 0.050700914\\n\",\n      \"mse of last test data: 0.050172016\\n\",\n      \"mse of last test data: 0.049366377\\n\",\n      \"mse of last test data: 0.048903815\\n\",\n      \"mse of last test data: 0.04788856\\n\",\n      \"mse of last test data: 0.0470797\\n\",\n      \"mse of last test data: 0.046200998\\n\",\n      \"mse of last test data: 0.045548897\\n\",\n      \"mse of last test data: 0.044755854\\n\",\n      \"mse of last test data: 0.04399403\\n\",\n      \"mse of last test data: 0.04330141\\n\",\n      \"mse of last test data: 0.042683505\\n\",\n      \"mse of last test data: 0.04236841\\n\",\n      \"mse of last test data: 0.04186626\\n\",\n      \"mse of last test data: 0.0416881\\n\",\n      \"mse of last test data: 0.041540608\\n\",\n      \"mse of last test data: 0.04154751\\n\",\n      \"mse of last test data: 0.041715562\\n\",\n      \"mse of last test data: 0.041812643\\n\",\n      \"mse of last test data: 0.041822653\\n\",\n      \"mse of last test data: 0.041784607\\n\",\n      \"mse of last test data: 0.04144943\\n\",\n      \"mse of last test data: 0.041050747\\n\",\n      \"mse of last test data: 0.040759165\\n\",\n      \"mse of last test data: 0.040293314\\n\",\n      \"mse of last test data: 0.039935593\\n\",\n      \"mse of last test data: 0.039261766\\n\",\n      \"mse of last test data: 0.038622603\\n\",\n      \"mse of last test data: 0.038196854\\n\",\n      \"mse of last test data: 0.03789666\\n\",\n      \"mse of last test data: 0.037674353\\n\",\n      \"mse of last test data: 0.037321392\\n\",\n      \"mse of last test data: 0.037049852\\n\",\n      \"mse of last test data: 0.03672101\\n\",\n      \"mse of last test data: 0.036547102\\n\",\n      \"mse of last test data: 0.03663898\\n\",\n      \"mse of last test data: 0.03675339\\n\",\n      \"mse of last test data: 0.036771975\\n\",\n      \"mse of last test data: 0.03672096\\n\",\n      \"mse of last test data: 0.03690495\\n\",\n      \"mse of last test data: 0.03713462\\n\",\n      \"mse of last test data: 0.03707089\\n\",\n      \"mse of last test data: 0.0369767\\n\",\n      \"mse of last test data: 0.036843468\\n\",\n      \"mse of last test data: 0.0366896\\n\",\n      \"mse of last test data: 0.036693912\\n\",\n      \"mse of last test data: 0.036737178\\n\",\n      \"mse of last test data: 0.036925703\\n\",\n      \"mse of last test data: 0.037359696\\n\",\n      \"mse of last test data: 0.03801434\\n\",\n      \"mse of last test data: 0.038453683\\n\",\n      \"mse of last test data: 0.0388445\\n\",\n      \"mse of last test data: 0.03943726\\n\",\n      \"mse of last test data: 0.040112153\\n\",\n      \"mse of last test data: 0.040496938\\n\",\n      \"mse of last test data: 0.040723853\\n\",\n      \"mse of last test data: 0.041014466\\n\",\n      \"mse of last test data: 0.041356135\\n\",\n      \"mse of last test data: 0.041903637\\n\",\n      \"mse of last test data: 0.04234812\\n\",\n      \"mse of last test data: 0.042939443\\n\",\n      \"mse of last test data: 0.043498352\\n\",\n      \"mse of last test data: 0.043968774\\n\",\n      \"mse of last test data: 0.044493068\\n\",\n      \"mse of last test data: 0.04521411\\n\",\n      \"mse of last test data: 0.045771904\\n\",\n      \"mse of last test data: 0.046629895\\n\",\n      \"mse of last test data: 0.047299497\\n\",\n      \"mse of last test data: 0.047667027\\n\",\n      \"mse of last test data: 0.047989164\\n\",\n      \"mse of last test data: 0.048167024\\n\",\n      \"mse of last test data: 0.048462152\\n\",\n      \"mse of last test data: 0.048996046\\n\",\n      \"mse of last test data: 0.049763598\\n\",\n      \"mse of last test data: 0.050080504\\n\",\n      \"mse of last test data: 0.050239693\\n\",\n      \"mse of last test data: 0.050378412\\n\",\n      \"mse of last test data: 0.050598167\\n\",\n      \"mse of last test data: 0.05105101\\n\",\n      \"mse of last test data: 0.051576763\\n\",\n      \"mse of last test data: 0.052223917\\n\",\n      \"mse of last test data: 0.053182542\\n\",\n      \"mse of last test data: 0.054220323\\n\",\n      \"mse of last test data: 0.055362917\\n\",\n      \"mse of last test data: 0.056611493\\n\",\n      \"mse of last test data: 0.057848323\\n\",\n      \"mse of last test data: 0.05854145\\n\",\n      \"mse of last test data: 0.059256084\\n\",\n      \"mse of last test data: 0.059849508\\n\",\n      \"mse of last test data: 0.060376026\\n\",\n      \"mse of last test data: 0.060621083\\n\",\n      \"mse of last test data: 0.06094754\\n\",\n      \"mse of last test data: 0.061078124\\n\",\n      \"mse of last test data: 0.06154837\\n\",\n      \"mse of last test data: 0.06218207\\n\",\n      \"mse of last test data: 0.062612005\\n\",\n      \"mse of last test data: 0.06316759\\n\",\n      \"mse of last test data: 0.06364927\\n\",\n      \"mse of last test data: 0.06395581\\n\",\n      \"mse of last test data: 0.06490716\\n\",\n      \"mse of last test data: 0.0659104\\n\",\n      \"mse of last test data: 0.066883266\\n\",\n      \"mse of last test data: 0.06799279\\n\",\n      \"mse of last test data: 0.06883022\\n\",\n      \"mse of last test data: 0.06999637\\n\",\n      \"mse of last test data: 0.07040557\\n\",\n      \"mse of last test data: 0.07055467\\n\",\n      \"mse of last test data: 0.0704412\\n\",\n      \"mse of last test data: 0.070556104\\n\",\n      \"mse of last test data: 0.07039124\\n\",\n      \"mse of last test data: 0.070203714\\n\",\n      \"mse of last test data: 0.06943795\\n\",\n      \"mse of last test data: 0.06905787\\n\",\n      \"mse of last test data: 0.06877463\\n\",\n      \"mse of last test data: 0.06792161\\n\",\n      \"mse of last test data: 0.067531504\\n\",\n      \"mse of last test data: 0.06737344\\n\",\n      \"mse of last test data: 0.067189686\\n\",\n      \"mse of last test data: 0.06694325\\n\",\n      \"mse of last test data: 0.06666852\\n\",\n      \"mse of last test data: 0.065830804\\n\",\n      \"mse of last test data: 0.06537669\\n\",\n      \"mse of last test data: 0.06491417\\n\",\n      \"mse of last test data: 0.06468389\\n\",\n      \"mse of last test data: 0.06437395\\n\",\n      \"mse of last test data: 0.06392299\\n\",\n      \"mse of last test data: 0.06348827\\n\",\n      \"mse of last test data: 0.063527524\\n\",\n      \"mse of last test data: 0.063115045\\n\",\n      \"mse of last test data: 0.0627057\\n\",\n      \"mse of last test data: 0.062102113\\n\",\n      \"mse of last test data: 0.061501656\\n\",\n      \"mse of last test data: 0.061108947\\n\",\n      \"mse of last test data: 0.060269404\\n\",\n      \"mse of last test data: 0.05914622\\n\",\n      \"mse of last test data: 0.058618482\\n\",\n      \"mse of last test data: 0.057946824\\n\",\n      \"mse of last test data: 0.057315763\\n\",\n      \"mse of last test data: 0.056833602\\n\",\n      \"mse of last test data: 0.056032997\\n\",\n      \"mse of last test data: 0.055409484\\n\",\n      \"mse of last test data: 0.054566707\\n\",\n      \"mse of last test data: 0.05363072\\n\",\n      \"mse of last test data: 0.052835308\\n\",\n      \"mse of last test data: 0.052092392\\n\",\n      \"mse of last test data: 0.051302966\\n\",\n      \"mse of last test data: 0.050705142\\n\",\n      \"mse of last test data: 0.0497013\\n\",\n      \"mse of last test data: 0.04873594\\n\",\n      \"mse of last test data: 0.047886934\\n\",\n      \"mse of last test data: 0.047256593\\n\",\n      \"mse of last test data: 0.046389896\\n\",\n      \"mse of last test data: 0.045826245\\n\",\n      \"mse of last test data: 0.045038085\\n\",\n      \"mse of last test data: 0.04472146\\n\",\n      \"mse of last test data: 0.04450987\\n\",\n      \"mse of last test data: 0.043820444\\n\",\n      \"mse of last test data: 0.043335173\\n\",\n      \"mse of last test data: 0.043237902\\n\",\n      \"mse of last test data: 0.042693343\\n\",\n      \"mse of last test data: 0.0420492\\n\",\n      \"mse of last test data: 0.041761592\\n\",\n      \"mse of last test data: 0.041558076\\n\",\n      \"mse of last test data: 0.04113762\\n\",\n      \"mse of last test data: 0.040989418\\n\",\n      \"mse of last test data: 0.040603217\\n\",\n      \"mse of last test data: 0.040685717\\n\",\n      \"mse of last test data: 0.040991854\\n\",\n      \"mse of last test data: 0.041050777\\n\",\n      \"mse of last test data: 0.04132885\\n\",\n      \"mse of last test data: 0.041440982\\n\",\n      \"mse of last test data: 0.041547675\\n\",\n      \"mse of last test data: 0.041578636\\n\",\n      \"mse of last test data: 0.041851215\\n\",\n      \"mse of last test data: 0.041640528\\n\",\n      \"mse of last test data: 0.041732017\\n\",\n      \"mse of last test data: 0.0419739\\n\",\n      \"mse of last test data: 0.04194562\\n\",\n      \"mse of last test data: 0.04221782\\n\",\n      \"mse of last test data: 0.042523533\\n\",\n      \"mse of last test data: 0.043012597\\n\",\n      \"mse of last test data: 0.043684058\\n\",\n      \"mse of last test data: 0.04402702\\n\",\n      \"mse of last test data: 0.044481214\\n\",\n      \"mse of last test data: 0.0450937\\n\",\n      \"mse of last test data: 0.045700084\\n\",\n      \"mse of last test data: 0.046173405\\n\",\n      \"mse of last test data: 0.0467588\\n\",\n      \"mse of last test data: 0.047187176\\n\",\n      \"mse of last test data: 0.047719445\\n\",\n      \"mse of last test data: 0.04842757\\n\",\n      \"mse of last test data: 0.049238943\\n\",\n      \"mse of last test data: 0.04988231\\n\",\n      \"mse of last test data: 0.050821222\\n\",\n      \"mse of last test data: 0.051694877\\n\",\n      \"mse of last test data: 0.05214913\\n\",\n      \"mse of last test data: 0.052437652\\n\",\n      \"mse of last test data: 0.052969992\\n\",\n      \"mse of last test data: 0.053789765\\n\",\n      \"mse of last test data: 0.054559898\\n\",\n      \"mse of last test data: 0.05517614\\n\",\n      \"mse of last test data: 0.055931017\\n\",\n      \"mse of last test data: 0.056781147\\n\",\n      \"mse of last test data: 0.0573848\\n\",\n      \"mse of last test data: 0.057863265\\n\",\n      \"mse of last test data: 0.05891953\\n\",\n      \"mse of last test data: 0.059961736\\n\",\n      \"mse of last test data: 0.060802933\\n\",\n      \"mse of last test data: 0.061579917\\n\",\n      \"mse of last test data: 0.06266324\\n\",\n      \"mse of last test data: 0.06371082\\n\",\n      \"mse of last test data: 0.06462453\\n\",\n      \"mse of last test data: 0.06564987\\n\",\n      \"mse of last test data: 0.06654139\\n\",\n      \"mse of last test data: 0.067626685\\n\",\n      \"mse of last test data: 0.06854836\\n\",\n      \"mse of last test data: 0.06957363\\n\",\n      \"mse of last test data: 0.07085023\\n\",\n      \"mse of last test data: 0.07175384\\n\",\n      \"mse of last test data: 0.07260185\\n\",\n      \"mse of last test data: 0.073333375\\n\",\n      \"mse of last test data: 0.074260205\\n\",\n      \"mse of last test data: 0.07508073\\n\",\n      \"mse of last test data: 0.075647935\\n\",\n      \"mse of last test data: 0.07631055\\n\",\n      \"mse of last test data: 0.07694918\\n\",\n      \"mse of last test data: 0.076984815\\n\",\n      \"mse of last test data: 0.077071525\\n\",\n      \"mse of last test data: 0.077484496\\n\"\n     ]\n    },\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"mse of last test data: 0.07809034\\n\",\n      \"mse of last test data: 0.07847417\\n\",\n      \"mse of last test data: 0.079089314\\n\",\n      \"mse of last test data: 0.07933486\\n\",\n      \"mse of last test data: 0.079938\\n\",\n      \"mse of last test data: 0.08079829\\n\",\n      \"mse of last test data: 0.081314266\\n\",\n      \"mse of last test data: 0.08216548\\n\",\n      \"mse of last test data: 0.0826575\\n\",\n      \"mse of last test data: 0.08339308\\n\",\n      \"mse of last test data: 0.083519086\\n\",\n      \"mse of last test data: 0.0840565\\n\",\n      \"mse of last test data: 0.084472895\\n\",\n      \"mse of last test data: 0.08464473\\n\",\n      \"mse of last test data: 0.08453613\\n\",\n      \"mse of last test data: 0.083544716\\n\",\n      \"mse of last test data: 0.082723804\\n\",\n      \"mse of last test data: 0.08207079\\n\",\n      \"mse of last test data: 0.08183347\\n\",\n      \"mse of last test data: 0.0817586\\n\",\n      \"mse of last test data: 0.081749596\\n\",\n      \"mse of last test data: 0.08135106\\n\",\n      \"mse of last test data: 0.08085264\\n\",\n      \"mse of last test data: 0.08009475\\n\",\n      \"mse of last test data: 0.07935655\\n\",\n      \"mse of last test data: 0.07896202\\n\",\n      \"mse of last test data: 0.07839527\\n\",\n      \"mse of last test data: 0.07789573\\n\",\n      \"mse of last test data: 0.077722974\\n\",\n      \"mse of last test data: 0.07696794\\n\",\n      \"mse of last test data: 0.07575168\\n\",\n      \"mse of last test data: 0.074648835\\n\",\n      \"mse of last test data: 0.073912315\\n\",\n      \"mse of last test data: 0.07296068\\n\",\n      \"mse of last test data: 0.072213\\n\",\n      \"mse of last test data: 0.07117133\\n\",\n      \"mse of last test data: 0.070252426\\n\",\n      \"mse of last test data: 0.06944831\\n\",\n      \"mse of last test data: 0.068270326\\n\",\n      \"mse of last test data: 0.0670842\\n\",\n      \"mse of last test data: 0.06638204\\n\",\n      \"mse of last test data: 0.06568636\\n\",\n      \"mse of last test data: 0.06470476\\n\",\n      \"mse of last test data: 0.06364994\\n\",\n      \"mse of last test data: 0.06275745\\n\",\n      \"mse of last test data: 0.06165835\\n\",\n      \"mse of last test data: 0.06073502\\n\",\n      \"mse of last test data: 0.059538607\\n\",\n      \"mse of last test data: 0.05833644\\n\",\n      \"mse of last test data: 0.05694349\\n\",\n      \"mse of last test data: 0.055479866\\n\",\n      \"mse of last test data: 0.054633502\\n\",\n      \"mse of last test data: 0.05381038\\n\",\n      \"mse of last test data: 0.05303871\\n\",\n      \"mse of last test data: 0.052432828\\n\",\n      \"mse of last test data: 0.05182874\\n\",\n      \"mse of last test data: 0.051080927\\n\",\n      \"mse of last test data: 0.050386973\\n\",\n      \"mse of last test data: 0.049565386\\n\",\n      \"mse of last test data: 0.049125805\\n\",\n      \"mse of last test data: 0.048725173\\n\",\n      \"mse of last test data: 0.04790157\\n\",\n      \"mse of last test data: 0.04716007\\n\",\n      \"mse of last test data: 0.046846654\\n\",\n      \"mse of last test data: 0.046007197\\n\",\n      \"mse of last test data: 0.045369487\\n\",\n      \"mse of last test data: 0.044932183\\n\",\n      \"mse of last test data: 0.04426895\\n\",\n      \"mse of last test data: 0.043891855\\n\",\n      \"mse of last test data: 0.043293122\\n\",\n      \"mse of last test data: 0.04309746\\n\",\n      \"mse of last test data: 0.04310781\\n\",\n      \"mse of last test data: 0.04271647\\n\",\n      \"mse of last test data: 0.042131722\\n\",\n      \"mse of last test data: 0.042267226\\n\",\n      \"mse of last test data: 0.04246434\\n\",\n      \"mse of last test data: 0.042620976\\n\",\n      \"mse of last test data: 0.042942483\\n\",\n      \"mse of last test data: 0.04303761\\n\",\n      \"mse of last test data: 0.04349474\\n\",\n      \"mse of last test data: 0.0437899\\n\",\n      \"mse of last test data: 0.044176083\\n\",\n      \"mse of last test data: 0.044732552\\n\",\n      \"mse of last test data: 0.04543317\\n\",\n      \"mse of last test data: 0.045993652\\n\",\n      \"mse of last test data: 0.046672627\\n\",\n      \"mse of last test data: 0.04723318\\n\",\n      \"mse of last test data: 0.047575876\\n\",\n      \"mse of last test data: 0.048151337\\n\",\n      \"mse of last test data: 0.04898234\\n\",\n      \"mse of last test data: 0.04950618\\n\",\n      \"mse of last test data: 0.04985728\\n\",\n      \"mse of last test data: 0.050079018\\n\",\n      \"mse of last test data: 0.050002214\\n\",\n      \"mse of last test data: 0.04996802\\n\",\n      \"mse of last test data: 0.050199352\\n\",\n      \"mse of last test data: 0.05039392\\n\",\n      \"mse of last test data: 0.050659057\\n\",\n      \"mse of last test data: 0.05120479\\n\",\n      \"mse of last test data: 0.05144986\\n\",\n      \"mse of last test data: 0.051979337\\n\",\n      \"mse of last test data: 0.05278858\\n\",\n      \"mse of last test data: 0.053678963\\n\",\n      \"mse of last test data: 0.0549005\\n\",\n      \"mse of last test data: 0.056104675\\n\",\n      \"mse of last test data: 0.05728328\\n\",\n      \"mse of last test data: 0.058226917\\n\",\n      \"mse of last test data: 0.059043556\\n\",\n      \"mse of last test data: 0.05978783\\n\",\n      \"mse of last test data: 0.06066101\\n\",\n      \"mse of last test data: 0.061586507\\n\",\n      \"mse of last test data: 0.062372074\\n\",\n      \"mse of last test data: 0.063418165\\n\",\n      \"mse of last test data: 0.0644478\\n\",\n      \"mse of last test data: 0.06523493\\n\",\n      \"mse of last test data: 0.06619985\\n\",\n      \"mse of last test data: 0.06691338\\n\",\n      \"mse of last test data: 0.06766483\\n\",\n      \"mse of last test data: 0.06823798\\n\",\n      \"mse of last test data: 0.069028705\\n\",\n      \"mse of last test data: 0.07040166\\n\",\n      \"mse of last test data: 0.07137897\\n\",\n      \"mse of last test data: 0.07202942\\n\",\n      \"mse of last test data: 0.072754875\\n\",\n      \"mse of last test data: 0.07371439\\n\",\n      \"mse of last test data: 0.07483628\\n\",\n      \"mse of last test data: 0.07592519\\n\",\n      \"mse of last test data: 0.07681563\\n\",\n      \"mse of last test data: 0.07812281\\n\",\n      \"mse of last test data: 0.07933848\\n\",\n      \"mse of last test data: 0.08018373\\n\",\n      \"mse of last test data: 0.08074742\\n\",\n      \"mse of last test data: 0.08127048\\n\",\n      \"mse of last test data: 0.081600845\\n\",\n      \"mse of last test data: 0.08173432\\n\",\n      \"mse of last test data: 0.08185565\\n\",\n      \"mse of last test data: 0.08203371\\n\",\n      \"mse of last test data: 0.08234206\\n\",\n      \"mse of last test data: 0.08275901\\n\",\n      \"mse of last test data: 0.0827084\\n\",\n      \"mse of last test data: 0.08287379\\n\",\n      \"mse of last test data: 0.08255896\\n\",\n      \"mse of last test data: 0.08321978\\n\",\n      \"mse of last test data: 0.08352913\\n\",\n      \"mse of last test data: 0.08377892\\n\",\n      \"mse of last test data: 0.08411917\\n\",\n      \"mse of last test data: 0.08434226\\n\",\n      \"mse of last test data: 0.08462197\\n\",\n      \"mse of last test data: 0.08449116\\n\",\n      \"mse of last test data: 0.0841965\\n\",\n      \"mse of last test data: 0.083713956\\n\",\n      \"mse of last test data: 0.08332585\\n\",\n      \"mse of last test data: 0.08333279\\n\",\n      \"mse of last test data: 0.08346157\\n\",\n      \"mse of last test data: 0.08324353\\n\",\n      \"mse of last test data: 0.08334021\\n\",\n      \"mse of last test data: 0.08322359\\n\",\n      \"mse of last test data: 0.08286543\\n\",\n      \"mse of last test data: 0.0823608\\n\",\n      \"mse of last test data: 0.08179303\\n\",\n      \"mse of last test data: 0.08076766\\n\",\n      \"mse of last test data: 0.08036916\\n\",\n      \"mse of last test data: 0.079468556\\n\",\n      \"mse of last test data: 0.07863285\\n\",\n      \"mse of last test data: 0.077711366\\n\",\n      \"mse of last test data: 0.07701495\\n\",\n      \"mse of last test data: 0.07648523\\n\",\n      \"mse of last test data: 0.076334864\\n\",\n      \"mse of last test data: 0.07590014\\n\",\n      \"mse of last test data: 0.075278714\\n\",\n      \"mse of last test data: 0.07451074\\n\",\n      \"mse of last test data: 0.073665306\\n\",\n      \"mse of last test data: 0.072604604\\n\",\n      \"mse of last test data: 0.071306616\\n\",\n      \"mse of last test data: 0.069950886\\n\",\n      \"mse of last test data: 0.068437\\n\",\n      \"mse of last test data: 0.067476794\\n\",\n      \"mse of last test data: 0.0665985\\n\",\n      \"mse of last test data: 0.0661967\\n\",\n      \"mse of last test data: 0.06555315\\n\",\n      \"mse of last test data: 0.064645395\\n\",\n      \"mse of last test data: 0.06402787\\n\",\n      \"mse of last test data: 0.063268885\\n\",\n      \"mse of last test data: 0.06259369\\n\",\n      \"mse of last test data: 0.061966043\\n\",\n      \"mse of last test data: 0.061628904\\n\",\n      \"mse of last test data: 0.06091293\\n\",\n      \"mse of last test data: 0.060561795\\n\",\n      \"mse of last test data: 0.059895515\\n\",\n      \"mse of last test data: 0.0587479\\n\",\n      \"mse of last test data: 0.058090683\\n\",\n      \"mse of last test data: 0.0575988\\n\",\n      \"mse of last test data: 0.0569736\\n\",\n      \"mse of last test data: 0.056413162\\n\",\n      \"mse of last test data: 0.055881493\\n\",\n      \"mse of last test data: 0.055156387\\n\",\n      \"mse of last test data: 0.054764092\\n\",\n      \"mse of last test data: 0.05379415\\n\",\n      \"mse of last test data: 0.05341845\\n\",\n      \"mse of last test data: 0.052721445\\n\",\n      \"mse of last test data: 0.051884793\\n\",\n      \"mse of last test data: 0.051117186\\n\",\n      \"mse of last test data: 0.050562695\\n\",\n      \"mse of last test data: 0.05040292\\n\",\n      \"mse of last test data: 0.050410375\\n\",\n      \"mse of last test data: 0.050853588\\n\",\n      \"mse of last test data: 0.051424023\\n\",\n      \"mse of last test data: 0.051752765\\n\",\n      \"mse of last test data: 0.05224338\\n\",\n      \"mse of last test data: 0.052897\\n\",\n      \"mse of last test data: 0.052691735\\n\",\n      \"mse of last test data: 0.05253566\\n\",\n      \"mse of last test data: 0.052735034\\n\",\n      \"mse of last test data: 0.052889466\\n\",\n      \"mse of last test data: 0.052931055\\n\",\n      \"mse of last test data: 0.05241148\\n\",\n      \"mse of last test data: 0.051971577\\n\",\n      \"mse of last test data: 0.052343342\\n\",\n      \"mse of last test data: 0.0528425\\n\",\n      \"mse of last test data: 0.0532845\\n\",\n      \"mse of last test data: 0.05380743\\n\",\n      \"mse of last test data: 0.054178886\\n\",\n      \"mse of last test data: 0.05485781\\n\",\n      \"mse of last test data: 0.054932643\\n\",\n      \"mse of last test data: 0.055016536\\n\",\n      \"mse of last test data: 0.0553546\\n\",\n      \"mse of last test data: 0.05567089\\n\",\n      \"mse of last test data: 0.055940997\\n\",\n      \"mse of last test data: 0.056046944\\n\",\n      \"mse of last test data: 0.056290556\\n\",\n      \"mse of last test data: 0.05663026\\n\",\n      \"mse of last test data: 0.057073623\\n\",\n      \"mse of last test data: 0.057451386\\n\",\n      \"mse of last test data: 0.05813381\\n\",\n      \"mse of last test data: 0.05874961\\n\",\n      \"mse of last test data: 0.059299555\\n\",\n      \"mse of last test data: 0.05980952\\n\",\n      \"mse of last test data: 0.060260225\\n\",\n      \"mse of last test data: 0.0608641\\n\"\n     ]\n    },\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"mse of last test data: 0.061568096\\n\",\n      \"mse of last test data: 0.062518425\\n\",\n      \"mse of last test data: 0.06325057\\n\",\n      \"mse of last test data: 0.06402895\\n\",\n      \"mse of last test data: 0.06497191\\n\",\n      \"mse of last test data: 0.06579888\\n\",\n      \"mse of last test data: 0.067111544\\n\",\n      \"mse of last test data: 0.068179786\\n\",\n      \"mse of last test data: 0.06903188\\n\",\n      \"mse of last test data: 0.07017574\\n\",\n      \"mse of last test data: 0.07141715\\n\",\n      \"mse of last test data: 0.07240259\\n\",\n      \"mse of last test data: 0.07312126\\n\",\n      \"mse of last test data: 0.07356385\\n\",\n      \"mse of last test data: 0.07393713\\n\",\n      \"mse of last test data: 0.07472873\\n\",\n      \"mse of last test data: 0.07574809\\n\",\n      \"mse of last test data: 0.07669301\\n\",\n      \"mse of last test data: 0.0775595\\n\",\n      \"mse of last test data: 0.078188\\n\",\n      \"mse of last test data: 0.07941976\\n\",\n      \"mse of last test data: 0.080385394\\n\",\n      \"mse of last test data: 0.08167663\\n\",\n      \"mse of last test data: 0.08269441\\n\",\n      \"mse of last test data: 0.08372783\\n\",\n      \"mse of last test data: 0.084634386\\n\",\n      \"mse of last test data: 0.08485869\\n\",\n      \"mse of last test data: 0.085374646\\n\",\n      \"mse of last test data: 0.085740976\\n\",\n      \"mse of last test data: 0.08663443\\n\",\n      \"mse of last test data: 0.08713622\\n\",\n      \"mse of last test data: 0.08758123\\n\",\n      \"mse of last test data: 0.08789659\\n\",\n      \"mse of last test data: 0.08796546\\n\",\n      \"mse of last test data: 0.0878321\\n\",\n      \"mse of last test data: 0.087539405\\n\",\n      \"mse of last test data: 0.08747789\\n\",\n      \"mse of last test data: 0.088020965\\n\",\n      \"mse of last test data: 0.08858664\\n\",\n      \"mse of last test data: 0.088778175\\n\",\n      \"mse of last test data: 0.089013495\\n\",\n      \"mse of last test data: 0.08898069\\n\",\n      \"mse of last test data: 0.08858915\\n\",\n      \"mse of last test data: 0.08817425\\n\",\n      \"mse of last test data: 0.08775721\\n\",\n      \"mse of last test data: 0.08751199\\n\",\n      \"mse of last test data: 0.08770336\\n\",\n      \"mse of last test data: 0.08773042\\n\",\n      \"mse of last test data: 0.08756273\\n\",\n      \"mse of last test data: 0.087514915\\n\",\n      \"mse of last test data: 0.087031506\\n\",\n      \"mse of last test data: 0.08626881\\n\",\n      \"mse of last test data: 0.08545341\\n\",\n      \"mse of last test data: 0.08504947\\n\",\n      \"mse of last test data: 0.08450457\\n\",\n      \"mse of last test data: 0.08383059\\n\",\n      \"mse of last test data: 0.082974434\\n\",\n      \"mse of last test data: 0.08217745\\n\",\n      \"mse of last test data: 0.08167454\\n\",\n      \"mse of last test data: 0.08074595\\n\",\n      \"mse of last test data: 0.08006667\\n\",\n      \"mse of last test data: 0.078919806\\n\",\n      \"mse of last test data: 0.07762168\\n\",\n      \"mse of last test data: 0.07612659\\n\",\n      \"mse of last test data: 0.07543544\\n\",\n      \"mse of last test data: 0.07471285\\n\",\n      \"mse of last test data: 0.07409527\\n\",\n      \"mse of last test data: 0.07324239\\n\",\n      \"mse of last test data: 0.07200914\\n\",\n      \"mse of last test data: 0.07094035\\n\",\n      \"mse of last test data: 0.06998237\\n\",\n      \"mse of last test data: 0.0689911\\n\",\n      \"mse of last test data: 0.06862763\\n\",\n      \"mse of last test data: 0.068846315\\n\",\n      \"mse of last test data: 0.06896952\\n\",\n      \"mse of last test data: 0.069029845\\n\",\n      \"mse of last test data: 0.06876393\\n\",\n      \"mse of last test data: 0.06822805\\n\",\n      \"mse of last test data: 0.067627475\\n\",\n      \"mse of last test data: 0.066910386\\n\",\n      \"mse of last test data: 0.06596285\\n\",\n      \"mse of last test data: 0.06475239\\n\",\n      \"mse of last test data: 0.06337351\\n\",\n      \"mse of last test data: 0.06190893\\n\",\n      \"mse of last test data: 0.060455818\\n\",\n      \"mse of last test data: 0.05945335\\n\",\n      \"mse of last test data: 0.058874406\\n\",\n      \"mse of last test data: 0.058529194\\n\",\n      \"mse of last test data: 0.05847619\\n\",\n      \"mse of last test data: 0.058467004\\n\",\n      \"mse of last test data: 0.058635216\\n\",\n      \"mse of last test data: 0.05900268\\n\",\n      \"mse of last test data: 0.05964228\\n\",\n      \"mse of last test data: 0.060126405\\n\",\n      \"mse of last test data: 0.06030947\\n\",\n      \"mse of last test data: 0.06021211\\n\",\n      \"mse of last test data: 0.060109865\\n\",\n      \"mse of last test data: 0.05989852\\n\",\n      \"mse of last test data: 0.059676565\\n\",\n      \"mse of last test data: 0.058915537\\n\",\n      \"mse of last test data: 0.05818829\\n\",\n      \"mse of last test data: 0.05793772\\n\",\n      \"mse of last test data: 0.057634525\\n\",\n      \"mse of last test data: 0.05776301\\n\",\n      \"mse of last test data: 0.05802423\\n\",\n      \"mse of last test data: 0.058413498\\n\",\n      \"mse of last test data: 0.05889824\\n\",\n      \"mse of last test data: 0.059561614\\n\",\n      \"mse of last test data: 0.05995116\\n\",\n      \"mse of last test data: 0.060674265\\n\",\n      \"mse of last test data: 0.061642237\\n\",\n      \"mse of last test data: 0.062265716\\n\",\n      \"mse of last test data: 0.06261126\\n\",\n      \"mse of last test data: 0.06321956\\n\",\n      \"mse of last test data: 0.06385407\\n\",\n      \"mse of last test data: 0.06478457\\n\",\n      \"mse of last test data: 0.06547407\\n\",\n      \"mse of last test data: 0.06600813\\n\",\n      \"mse of last test data: 0.066247664\\n\",\n      \"mse of last test data: 0.06696937\\n\",\n      \"mse of last test data: 0.06712928\\n\",\n      \"mse of last test data: 0.067296825\\n\",\n      \"mse of last test data: 0.06803123\\n\",\n      \"mse of last test data: 0.068576775\\n\",\n      \"mse of last test data: 0.068736695\\n\",\n      \"mse of last test data: 0.06898644\\n\",\n      \"mse of last test data: 0.06920508\\n\",\n      \"mse of last test data: 0.06966729\\n\",\n      \"mse of last test data: 0.07024488\\n\",\n      \"mse of last test data: 0.0707083\\n\",\n      \"mse of last test data: 0.071489014\\n\",\n      \"mse of last test data: 0.072244056\\n\",\n      \"mse of last test data: 0.072727054\\n\",\n      \"mse of last test data: 0.07265602\\n\",\n      \"mse of last test data: 0.07259401\\n\",\n      \"mse of last test data: 0.07283661\\n\",\n      \"mse of last test data: 0.07355048\\n\",\n      \"mse of last test data: 0.07413451\\n\",\n      \"mse of last test data: 0.07455221\\n\",\n      \"mse of last test data: 0.074991226\\n\",\n      \"mse of last test data: 0.07586654\\n\",\n      \"mse of last test data: 0.07635737\\n\",\n      \"mse of last test data: 0.0767616\\n\",\n      \"mse of last test data: 0.07676927\\n\",\n      \"mse of last test data: 0.07701653\\n\",\n      \"mse of last test data: 0.07765571\\n\",\n      \"mse of last test data: 0.07808881\\n\",\n      \"mse of last test data: 0.07842322\\n\",\n      \"mse of last test data: 0.0786469\\n\",\n      \"mse of last test data: 0.07885746\\n\",\n      \"mse of last test data: 0.078998715\\n\",\n      \"mse of last test data: 0.079190984\\n\",\n      \"mse of last test data: 0.07954396\\n\",\n      \"mse of last test data: 0.079925425\\n\",\n      \"mse of last test data: 0.0804836\\n\",\n      \"mse of last test data: 0.080848426\\n\",\n      \"mse of last test data: 0.08105866\\n\",\n      \"mse of last test data: 0.081377424\\n\",\n      \"mse of last test data: 0.081521235\\n\",\n      \"mse of last test data: 0.08179761\\n\",\n      \"mse of last test data: 0.08261895\\n\",\n      \"mse of last test data: 0.08329921\\n\",\n      \"mse of last test data: 0.083642446\\n\",\n      \"mse of last test data: 0.08394619\\n\",\n      \"mse of last test data: 0.08432225\\n\",\n      \"(1200, 30, 30, 3)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"import tensorflow as tf\\n\",\n    \"import utils as util\\n\",\n    \"import numpy as np\\n\",\n    \"import os\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"def cnn_encoder_layer(data, filter_layer, strides):\\n\",\n    \"    \\\"\\\"\\\"\\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\",\n    \"                 the third layer is 15 * 15 * 64, the fourth layer is 8 * 8 * 128\\n\",\n    \"    :param filter_layer:\\n\",\n    \"    :param strides:\\n\",\n    \"    :return: the result after conv, the first layer is 30 * 30 * 32, the second layer is 15 * 15 * 64, the third layer\\n\",\n    \"             is 8 * 8 * 128, the final layer is 4 * 4 * 256\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"\\n\",\n    \"    result = tf.nn.conv2d(\\n\",\n    \"        input=data,\\n\",\n    \"        filters=filter_layer,\\n\",\n    \"        strides=strides,\\n\",\n    \"        padding=\\\"SAME\\\")\\n\",\n    \"    return tf.nn.selu(result)\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"def tensor_variable(shape, name):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    Tensor variable declaration initialization\\n\",\n    \"    :param shape:\\n\",\n    \"    :param name:\\n\",\n    \"    :return:\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    variable = tf.Variable(tf.zeros(shape), name=name)\\n\",\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    \"    \\n\",\n    \"    return variable\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"def cnn_encoder(data):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"\\n\",\n    \"    :param data: the input data size is 5 * 30 * 30 * 3\\n\",\n    \"    :return:\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    # the first layer,the output size is 30 * 30 * 32\\n\",\n    \"    filter1 = tensor_variable([3, 3, 3, 32], \\\"filter1\\\")\\n\",\n    \"    strides1 = (1, 1, 1, 1)\\n\",\n    \"    cnn1_out = cnn_encoder_layer(data, filter1, strides1)\\n\",\n    \"\\n\",\n    \"    # the second layer, the output size is 15 * 15 * 64\\n\",\n    \"    filter2 = tensor_variable([3, 3, 32, 64], \\\"filter2\\\")\\n\",\n    \"    strides2 = (1, 2, 2, 1)\\n\",\n    \"    cnn2_out = cnn_encoder_layer(cnn1_out, filter2, strides2)\\n\",\n    \"\\n\",\n    \"    # the third layer, the output size is 8 * 8 * 128\\n\",\n    \"    filter3 = tensor_variable([2, 2, 64, 128], \\\"filter3\\\")\\n\",\n    \"    strides3 = (1, 2, 2, 1)\\n\",\n    \"    cnn3_out = cnn_encoder_layer(cnn2_out, filter3, strides3)\\n\",\n    \"\\n\",\n    \"    # the fourth layer, the output size is 4 * 4 * 256\\n\",\n    \"    filter4 = tensor_variable([2, 2, 128, 256], \\\"filter4\\\")\\n\",\n    \"    strides4 = (1, 2, 2, 1)\\n\",\n    \"    cnn4_out = cnn_encoder_layer(cnn3_out, filter4, strides4)\\n\",\n    \"\\n\",\n    \"    return cnn1_out, cnn2_out, cnn3_out, cnn4_out\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"def cnn_lstm_attention_layer(input_data, layer_number):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"\\n\",\n    \"    :param input_data:\\n\",\n    \"    :param layer_number:\\n\",\n    \"    :return:\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    convlstm_layer = tf.contrib.rnn.ConvLSTMCell(\\n\",\n    \"        conv_ndims=2,\\n\",\n    \"        input_shape=[input_data.shape[2], input_data.shape[3], input_data.shape[4]],\\n\",\n    \"        output_channels=input_data.shape[-1],\\n\",\n    \"        kernel_shape=[2, 2],\\n\",\n    \"        use_bias=True,\\n\",\n    \"        skip_connection=False,\\n\",\n    \"        forget_bias=1.0,\\n\",\n    \"        initializers=None,\\n\",\n    \"        name=\\\"conv_lstm_cell\\\" + str(layer_number))\\n\",\n    \"\\n\",\n    \"    outputs, state = tf.compat.v1.nn.dynamic_rnn(convlstm_layer, input_data, dtype=input_data.dtype)\\n\",\n    \"\\n\",\n    \"    # attention based on inner-product between feature representation of last step and other steps\\n\",\n    \"    attention_w = []\\n\",\n    \"    for k in range(util.step_max):\\n\",\n    \"        attention_w.append(tf.reduce_sum(input_tensor=tf.multiply(outputs[0][k], outputs[0][-1])) / util.step_max)\\n\",\n    \"    attention_w = tf.reshape(tf.nn.softmax(tf.stack(attention_w)), [1, util.step_max])\\n\",\n    \"\\n\",\n    \"    outputs = tf.reshape(outputs[0], [util.step_max, -1])\\n\",\n    \"    outputs = tf.matmul(attention_w, outputs)\\n\",\n    \"    outputs = tf.reshape(outputs, [1, input_data.shape[2], input_data.shape[3], input_data.shape[4]])\\n\",\n    \"\\n\",\n    \"    return outputs, attention_w\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"def cnn_decoder_layer(conv_lstm_out_c, filter, output_shape, strides):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"\\n\",\n    \"    :param conv_lstm_out_c:\\n\",\n    \"    :param filter:\\n\",\n    \"    :param output_shape:\\n\",\n    \"    :param strides:\\n\",\n    \"    :return:\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"\\n\",\n    \"    deconv = tf.nn.conv2d_transpose(\\n\",\n    \"        input=conv_lstm_out_c,\\n\",\n    \"        filters=filter,\\n\",\n    \"        output_shape=output_shape,\\n\",\n    \"        strides=strides,\\n\",\n    \"        padding=\\\"SAME\\\")\\n\",\n    \"    deconv = tf.nn.selu(deconv)\\n\",\n    \"    return deconv\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"def cnn_decoder(lstm1_out, lstm2_out, lstm3_out, lstm4_out):\\n\",\n    \"    d_filter4 = tensor_variable([2, 2, 128, 256], \\\"d_filter4\\\")\\n\",\n    \"    dec4 = cnn_decoder_layer(lstm4_out, d_filter4, [1, 8, 8, 128], (1, 2, 2, 1))\\n\",\n    \"    dec4_concat = tf.concat([dec4, lstm3_out], axis=3)\\n\",\n    \"\\n\",\n    \"    d_filter3 = tensor_variable([2, 2, 64, 256], \\\"d_filter3\\\")\\n\",\n    \"    dec3 = cnn_decoder_layer(dec4_concat, d_filter3, [1, 15, 15, 64], (1, 2, 2, 1))\\n\",\n    \"    dec3_concat = tf.concat([dec3, lstm2_out], axis=3)\\n\",\n    \"\\n\",\n    \"    d_filter2 = tensor_variable([3, 3, 32, 128], \\\"d_filter2\\\")\\n\",\n    \"    dec2 = cnn_decoder_layer(dec3_concat, d_filter2, [1, 30, 30, 32], (1, 2, 2, 1))\\n\",\n    \"    dec2_concat = tf.concat([dec2, lstm1_out], axis=3)\\n\",\n    \"\\n\",\n    \"    d_filter1 = tensor_variable([3, 3, 3, 64], \\\"d_filter1\\\")\\n\",\n    \"    dec1 = cnn_decoder_layer(dec2_concat, d_filter1, [1, 30, 30, 3], (1, 1, 1, 1))\\n\",\n    \"\\n\",\n    \"    return dec1\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"def main():\\n\",\n    \"    # Read dataset from file\\n\",\n    \"    matrix_data_path = util.train_data_path + \\\"train.npy\\\"\\n\",\n    \"    matrix_gt_1 = np.load(matrix_data_path)\\n\",\n    \"\\n\",\n    \"    sess = tf.compat.v1.Session()\\n\",\n    \"    data_input = tf.compat.v1.placeholder(tf.float32, [util.step_max, 30, 30, 3])\\n\",\n    \"\\n\",\n    \"    # cnn encoder\\n\",\n    \"    conv1_out, conv2_out, conv3_out, conv4_out = cnn_encoder(data_input)\\n\",\n    \"\\n\",\n    \"    conv1_out = tf.reshape(conv1_out, [-1, 5, 30, 30, 32])\\n\",\n    \"    conv2_out = tf.reshape(conv2_out, [-1, 5, 15, 15, 64])\\n\",\n    \"    conv3_out = tf.reshape(conv3_out, [-1, 5, 8, 8, 128])\\n\",\n    \"    conv4_out = tf.reshape(conv4_out, [-1, 5, 4, 4, 256])\\n\",\n    \"\\n\",\n    \"    # lstm with attention\\n\",\n    \"    conv1_lstm_attention_out, atten_weight_1 = cnn_lstm_attention_layer(conv1_out, 1)\\n\",\n    \"    conv2_lstm_attention_out, atten_weight_2 = cnn_lstm_attention_layer(conv2_out, 2)\\n\",\n    \"    conv3_lstm_attention_out, atten_weight_3 = cnn_lstm_attention_layer(conv3_out, 3)\\n\",\n    \"    conv4_lstm_attention_out, atten_weight_4 = cnn_lstm_attention_layer(conv4_out, 4)\\n\",\n    \"\\n\",\n    \"    # cnn decoder\\n\",\n    \"    deconv_out = cnn_decoder(conv1_lstm_attention_out, conv2_lstm_attention_out, conv3_lstm_attention_out,\\n\",\n    \"                             conv4_lstm_attention_out)\\n\",\n    \"    # loss function: reconstruction error of last step matrix\\n\",\n    \"    loss = tf.reduce_mean(input_tensor=tf.square(data_input[-1] - deconv_out))\\n\",\n    \"    optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=util.learning_rate).minimize(loss)\\n\",\n    \"\\n\",\n    \"    # variable initialization\\n\",\n    \"    init = tf.compat.v1.global_variables_initializer()\\n\",\n    \"    sess.run(init)\\n\",\n    \"\\n\",\n    \"    # training\\n\",\n    \"    for idx in range(util.train_start_id, util.train_end_id):\\n\",\n    \"        matrix_gt = matrix_gt_1[idx - util.train_start_id]\\n\",\n    \"        feed_dict = {data_input: np.asarray(matrix_gt)}\\n\",\n    \"        a, loss_value = sess.run([optimizer, loss], feed_dict)\\n\",\n    \"        print(\\\"mse of last train data: \\\" + str(loss_value))\\n\",\n    \"\\n\",\n    \"    # test\\n\",\n    \"    # Read the data from test file.\\n\",\n    \"    matrix_data_path = util.test_data_path + \\\"test.npy\\\"\\n\",\n    \"    matrix_gt_1 = np.load(matrix_data_path)\\n\",\n    \"    result_all = []\\n\",\n    \"    for idx in range(util.test_start_id, util.test_end_id):\\n\",\n    \"        matrix_gt = matrix_gt_1[idx - util.test_start_id]\\n\",\n    \"        feed_dict = {data_input: np.asarray(matrix_gt)}\\n\",\n    \"        result, loss_value = sess.run([deconv_out, loss], feed_dict)\\n\",\n    \"        result_all.append(result)\\n\",\n    \"        print(\\\"mse of last test data: \\\" + str(loss_value))\\n\",\n    \"\\n\",\n    \"    # Write the reconstructed matrix to the file\\n\",\n    \"    reconstructed_path = util.reconstructed_data_path\\n\",\n    \"    if not os.path.exists(reconstructed_path):\\n\",\n    \"        os.makedirs(reconstructed_path)\\n\",\n    \"    reconstructed_path = reconstructed_path + \\\"test_reconstructed.npy\\\"\\n\",\n    \"\\n\",\n    \"    result_all = np.asarray(result_all).reshape((-1, 30, 30, 3))\\n\",\n    \"    print(result_all.shape)\\n\",\n    \"    np.save(reconstructed_path, result_all)\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"if __name__ == '__main__':\\n\",\n    \"    main()\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.5.4\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "02_Python/MSCRED/cnn_lstm/convlstm.py",
    "content": "import tensorflow as tf\nimport cnn_lstm.utils as util\nimport numpy as np\nimport os\n\n\ndef 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        filter=filter_layer,\n        strides=strides,\n        padding=\"SAME\")\n    return tf.nn.selu(result)\n\n\ndef 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.contrib.layers.xavier_initializer())\n    return variable\n\n\ndef 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\ndef 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.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(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\ndef 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        value=conv_lstm_out_c,\n        filter=filter,\n        output_shape=output_shape,\n        strides=strides,\n        padding=\"SAME\")\n    deconv = tf.nn.selu(deconv)\n    return deconv\n\n\ndef 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\ndef 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.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(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.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\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "02_Python/MSCRED/cnn_lstm/evaluation.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"The shape of test data is (1200, 30, 30, 3)\\n\",\n      \"The shape of reconstructed data is (1200, 30, 30, 3)\\n\",\n      \"Max valid anom is 2.00\\n\",\n      \"Threshold is 3.00\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x20b02cab470>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"import numpy as np\\n\",\n    \"import matplotlib.pyplot as plt\\n\",\n    \"import os\\n\",\n    \"import utils as util\\n\",\n    \"import re\\n\",\n    \"\\n\",\n    \"# score initialization\\n\",\n    \"valid_anomaly_score = np.zeros((util.valid_end_id - util.valid_start_id, 1))\\n\",\n    \"test_anomaly_score = np.zeros((util.test_end_id - util.valid_end_id, 1))\\n\",\n    \"\\n\",\n    \"# load the data from file\\n\",\n    \"test_data_path = util.test_data_path\\n\",\n    \"reconstructed_data_path = util.reconstructed_data_path\\n\",\n    \"test_data_path = os.path.join(test_data_path, \\\"test.npy\\\")\\n\",\n    \"reconstructed_data_path = os.path.join(reconstructed_data_path, \\\"test_reconstructed.npy\\\")\\n\",\n    \"test_data = np.load(test_data_path)\\n\",\n    \"test_data = test_data[:, -1, ...]  # only compare the last matrix with the reconstructed data\\n\",\n    \"reconstructed_data = np.load(reconstructed_data_path)\\n\",\n    \"print(\\\"The shape of test data is {}\\\".format(test_data.shape))\\n\",\n    \"print(\\\"The shape of reconstructed data is {}\\\".format(reconstructed_data.shape))\\n\",\n    \"\\n\",\n    \"valid_len = util.valid_end_id - util.valid_start_id\\n\",\n    \"\\n\",\n    \"# compute the threshold, threshold = alpha * max{s(t)} , s(t) is the anomaly scores over validation period.\\n\",\n    \"for i in range(util.valid_end_id - util.valid_start_id):\\n\",\n    \"\\terror = np.square(np.subtract(test_data[i, ..., 0], reconstructed_data[i, ..., 0]))\\n\",\n    \"\\tnum_anom = len(np.where(error > util.threhold))\\n\",\n    \"\\tvalid_anomaly_score[i] = num_anom\\n\",\n    \"\\n\",\n    \"max_valid_anom = np.max(valid_anomaly_score)\\n\",\n    \"threshold = max_valid_anom * util.alpha\\n\",\n    \"\\n\",\n    \"print(\\\"Max valid anom is %.2f\\\" % max_valid_anom)\\n\",\n    \"print(\\\"Threshold is %.2f\\\" % threshold)\\n\",\n    \"\\n\",\n    \"# compute the anomaly score in the test data.\\n\",\n    \"for i in range(util.test_end_id - util.valid_end_id):\\n\",\n    \"\\terror = np.square(np.subtract(test_data[i, ..., 0], reconstructed_data[i, ..., 0]))\\n\",\n    \"\\tnum_anom = len(np.where(error > threshold))\\n\",\n    \"\\ttest_anomaly_score[i - valid_len] = num_anom\\n\",\n    \"\\n\",\n    \"# plot anomaly score curve and identification result\\n\",\n    \"anomaly_pos = np.zeros(5)\\n\",\n    \"root_cause_gt = np.zeros((5, 3))\\n\",\n    \"anomaly_span = [10, 30, 90]\\n\",\n    \"\\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\",\n    \"# root cause.\\n\",\n    \"root_cause_f = open(\\\"../data/test_anomaly.csv\\\", \\\"r\\\")\\n\",\n    \"\\n\",\n    \"root_cause_gt = np.loadtxt(root_cause_f, delimiter=\\\",\\\", dtype=np.int32)\\n\",\n    \"anomaly_pos = root_cause_gt[:, 0]\\n\",\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\",\n    \"for i in range(5):\\n\",\n    \"\\troot_cause_gt[i][0] = anomaly_pos[i]\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"fig, axes = plt.subplots()\\n\",\n    \"test_num = util.test_end_id - util.test_start_id\\n\",\n    \"plt.xticks(fontsize = 25)\\n\",\n    \"plt.ylim((0, 100))\\n\",\n    \"plt.yticks(np.arange(0, 101, 20), fontsize = 25)\\n\",\n    \"plt.plot(test_anomaly_score, 'b', linewidth = 2)\\n\",\n    \"threshold = np.full((test_num), max_valid_anom * util.alpha)\\n\",\n    \"axes.plot(threshold, color = 'black', linestyle = '--',linewidth = 2)\\n\",\n    \"for k in range(len(anomaly_pos)):\\n\",\n    \"\\taxes.axvspan(anomaly_pos[k], anomaly_pos[k] + anomaly_span[k%3]/util.gap_time, color='red', linewidth=2)\\n\",\n    \"\\n\",\n    \"labels = [' ', '0e3', '2e3', '4e3', '6e3', '8e3', '10e3']\\n\",\n    \"axes.set_xticklabels(labels, rotation = 25, fontsize = 20)\\n\",\n    \"plt.xlabel('Test Time', fontsize = 25)\\n\",\n    \"plt.ylabel('Anomaly Score', fontsize = 25)\\n\",\n    \"axes.spines['right'].set_visible(False)\\n\",\n    \"axes.spines['top'].set_visible(False)\\n\",\n    \"axes.yaxis.set_ticks_position('left')\\n\",\n    \"axes.xaxis.set_ticks_position('bottom')\\n\",\n    \"fig.subplots_adjust(bottom=0.25)\\n\",\n    \"fig.subplots_adjust(left=0.25)\\n\",\n    \"plt.title(\\\"MSCRED\\\", size = 25)\\n\",\n    \"plt.show()\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"array([[[[ 7.04064071e-01,  3.74522775e-01,  4.47765976e-01],\\n\",\n       \"         [-2.98897862e-01, -7.66673505e-01,  4.26859260e-01],\\n\",\n       \"         [ 5.42617023e-01,  3.69995445e-01, -6.44724131e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [-1.01098157e-01,  2.04227835e-01, -5.04897773e-01],\\n\",\n       \"         [-3.84952039e-01, -3.95544618e-01,  5.00987656e-02],\\n\",\n       \"         [-8.38977844e-02, -8.14120397e-02, -5.31205954e-03]],\\n\",\n       \"\\n\",\n       \"        [[-2.64311314e-01, -2.52485245e-01, -3.25333983e-01],\\n\",\n       \"         [ 4.30644780e-01,  3.51560205e-01, -2.94740409e-01],\\n\",\n       \"         [-3.42947125e-01, -2.47012973e-01,  3.40349197e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [-1.42371416e-01,  2.19778404e-01, -4.18861330e-01],\\n\",\n       \"         [-3.53498220e-01, -4.27131832e-01,  1.35710686e-01],\\n\",\n       \"         [-5.40348962e-02, -1.22621477e-01,  4.99183722e-02]],\\n\",\n       \"\\n\",\n       \"        [[ 5.22105038e-01,  3.02384377e-01,  3.36110651e-01],\\n\",\n       \"         [-2.89837956e-01, -6.70089483e-01,  3.94490510e-01],\\n\",\n       \"         [ 5.53662360e-01,  2.92761773e-01, -5.11705399e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [ 1.09688327e-01, -2.00070634e-01,  7.28469133e-01],\\n\",\n       \"         [ 6.70080245e-01,  5.83485782e-01, -4.08666655e-02],\\n\",\n       \"         [ 3.99453044e-02,  9.08637345e-02,  2.97329854e-04]],\\n\",\n       \"\\n\",\n       \"        ...,\\n\",\n       \"\\n\",\n       \"        [[-8.80392268e-02, -1.00941710e-01, -8.62924680e-02],\\n\",\n       \"         [ 1.50133893e-01,  5.63429408e-02, -1.44342631e-01],\\n\",\n       \"         [-1.02274962e-01, -1.17299981e-01,  1.09629296e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [ 4.11492251e-02, -8.19874480e-02,  9.28616762e-01],\\n\",\n       \"         [ 8.15970778e-01,  6.26959145e-01,  9.17455405e-02],\\n\",\n       \"         [-1.12580411e-01, -9.61837843e-02,  1.77792534e-01]],\\n\",\n       \"\\n\",\n       \"        [[-7.37436175e-01, -3.24902683e-01, -3.88478458e-01],\\n\",\n       \"         [ 2.23024666e-01,  9.28885818e-01, -3.27060014e-01],\\n\",\n       \"         [-5.19271135e-01, -3.01478446e-01,  6.87132418e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [-1.10190757e-01,  1.62858039e-01,  3.14977206e-02],\\n\",\n       \"         [ 1.10810861e-01, -5.14560975e-02,  2.63920635e-01],\\n\",\n       \"         [-1.16073824e-01, -1.91061035e-01,  1.34103924e-01]],\\n\",\n       \"\\n\",\n       \"        [[ 6.41601160e-03, -4.35149409e-02, -6.51849583e-02],\\n\",\n       \"         [ 1.22927040e-01, -5.28241433e-02, -6.55850545e-02],\\n\",\n       \"         [-8.67857132e-03, -8.20624754e-02, -3.15133445e-02],\\n\",\n       \"         ...,\\n\",\n       \"         [-1.82486519e-01,  1.31603345e-01,  1.33611903e-01],\\n\",\n       \"         [ 2.04952165e-01,  1.11552589e-02,  1.28105909e-01],\\n\",\n       \"         [-1.99556217e-01, -1.64938122e-01,  2.04542413e-01]]],\\n\",\n       \"\\n\",\n       \"\\n\",\n       \"       [[[ 6.79917336e-01,  3.55985790e-01,  4.28662121e-01],\\n\",\n       \"         [-2.83477157e-01, -7.54773140e-01,  4.19623792e-01],\\n\",\n       \"         [ 5.27973533e-01,  3.61982346e-01, -6.18236363e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [-8.83809477e-02,  1.91086918e-01, -4.80915755e-01],\\n\",\n       \"         [-3.57060909e-01, -3.69313687e-01,  4.88834903e-02],\\n\",\n       \"         [-8.70463327e-02, -7.39597306e-02, -1.31816452e-03]],\\n\",\n       \"\\n\",\n       \"        [[-2.44989142e-01, -2.38429546e-01, -3.16050351e-01],\\n\",\n       \"         [ 4.24357980e-01,  3.54713440e-01, -2.89681107e-01],\\n\",\n       \"         [-3.22282493e-01, -2.24485964e-01,  3.35882634e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [-1.34595096e-01,  2.10720986e-01, -4.09628510e-01],\\n\",\n       \"         [-3.48464072e-01, -4.15548891e-01,  1.32037923e-01],\\n\",\n       \"         [-4.62375097e-02, -1.18703760e-01,  3.54624651e-02]],\\n\",\n       \"\\n\",\n       \"        [[ 5.02865314e-01,  2.85199761e-01,  3.22424948e-01],\\n\",\n       \"         [-2.97595859e-01, -6.55339897e-01,  3.88778359e-01],\\n\",\n       \"         [ 5.20777166e-01,  2.72323757e-01, -4.73876327e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [ 9.89991277e-02, -1.82224751e-01,  7.15534508e-01],\\n\",\n       \"         [ 6.50987029e-01,  5.61722100e-01, -2.38141473e-02],\\n\",\n       \"         [ 3.26592848e-02,  8.09843168e-02,  1.06586050e-02]],\\n\",\n       \"\\n\",\n       \"        ...,\\n\",\n       \"\\n\",\n       \"        [[-7.64092207e-02, -8.32142308e-02, -7.65090808e-02],\\n\",\n       \"         [ 1.42628595e-01,  3.80489193e-02, -1.45639628e-01],\\n\",\n       \"         [-7.68235624e-02, -9.94603857e-02,  9.94035080e-02],\\n\",\n       \"         ...,\\n\",\n       \"         [ 3.20766978e-02, -3.54966559e-02,  9.33479607e-01],\\n\",\n       \"         [ 8.21256816e-01,  6.11127853e-01,  1.14048757e-01],\\n\",\n       \"         [-1.36615664e-01, -1.28301144e-01,  2.08944276e-01]],\\n\",\n       \"\\n\",\n       \"        [[-7.35684097e-01, -3.12582195e-01, -3.77254516e-01],\\n\",\n       \"         [ 2.21078888e-01,  9.28260028e-01, -2.96603888e-01],\\n\",\n       \"         [-5.13130128e-01, -2.98380405e-01,  6.79174542e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [-1.11217394e-01,  1.74280569e-01,  4.29298021e-02],\\n\",\n       \"         [ 1.26864836e-01, -4.78857681e-02,  2.73473918e-01],\\n\",\n       \"         [-1.24763295e-01, -1.92039981e-01,  1.41049162e-01]],\\n\",\n       \"\\n\",\n       \"        [[ 1.32945245e-02, -3.87203358e-02, -6.21801876e-02],\\n\",\n       \"         [ 1.21750608e-01, -7.69304484e-02, -6.02132604e-02],\\n\",\n       \"         [-1.58674363e-03, -8.07843432e-02, -5.53307384e-02],\\n\",\n       \"         ...,\\n\",\n       \"         [-1.75814062e-01,  1.33520216e-01,  1.49803266e-01],\\n\",\n       \"         [ 2.20021561e-01,  1.84681676e-02,  1.31551251e-01],\\n\",\n       \"         [-2.04605982e-01, -1.67672649e-01,  2.10331142e-01]]],\\n\",\n       \"\\n\",\n       \"\\n\",\n       \"       [[[ 6.52920544e-01,  3.35909814e-01,  4.09017503e-01],\\n\",\n       \"         [-2.76899219e-01, -7.40868509e-01,  4.06494081e-01],\\n\",\n       \"         [ 5.16137540e-01,  3.56847495e-01, -5.93396425e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [-7.08877817e-02,  1.74005613e-01, -4.63341177e-01],\\n\",\n       \"         [-3.26822639e-01, -3.38207126e-01,  4.29577343e-02],\\n\",\n       \"         [-7.95312524e-02, -5.43444492e-02, -1.07008256e-02]],\\n\",\n       \"\\n\",\n       \"        [[-2.24392816e-01, -2.20552221e-01, -2.93454707e-01],\\n\",\n       \"         [ 4.12042409e-01,  3.54120970e-01, -2.68817008e-01],\\n\",\n       \"         [-2.92297423e-01, -1.98751420e-01,  3.31134677e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [-1.23868063e-01,  1.93920195e-01, -3.80687058e-01],\\n\",\n       \"         [-3.35400194e-01, -3.89126062e-01,  1.20310627e-01],\\n\",\n       \"         [-2.72770673e-02, -9.98448581e-02,  2.90213507e-02]],\\n\",\n       \"\\n\",\n       \"        [[ 4.90766495e-01,  2.69954264e-01,  3.09346884e-01],\\n\",\n       \"         [-3.00604820e-01, -6.45075738e-01,  3.70979786e-01],\\n\",\n       \"         [ 4.93564457e-01,  2.60388762e-01, -4.44828093e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [ 8.86952132e-02, -1.64795712e-01,  7.12646186e-01],\\n\",\n       \"         [ 6.58571661e-01,  5.52982032e-01,  3.04084923e-03],\\n\",\n       \"         [ 1.83560643e-02,  6.79676682e-02,  3.19759510e-02]],\\n\",\n       \"\\n\",\n       \"        ...,\\n\",\n       \"\\n\",\n       \"        [[-6.24664761e-02, -6.57579601e-02, -6.79971278e-02],\\n\",\n       \"         [ 1.39382973e-01,  1.91848613e-02, -1.49713799e-01],\\n\",\n       \"         [-3.93616557e-02, -7.71472603e-02,  9.43215862e-02],\\n\",\n       \"         ...,\\n\",\n       \"         [ 1.82397887e-02,  4.21114964e-03,  9.38782632e-01],\\n\",\n       \"         [ 8.26476872e-01,  5.98676145e-01,  1.36195764e-01],\\n\",\n       \"         [-1.59242004e-01, -1.58888862e-01,  2.33872399e-01]],\\n\",\n       \"\\n\",\n       \"        [[-7.30418801e-01, -3.03994894e-01, -3.59382868e-01],\\n\",\n       \"         [ 2.08334461e-01,  9.24598396e-01, -2.77217895e-01],\\n\",\n       \"         [-5.08326411e-01, -2.95484096e-01,  6.56581044e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [-1.08930230e-01,  1.84923634e-01,  5.60650229e-02],\\n\",\n       \"         [ 1.41883463e-01, -3.83467562e-02,  2.73193657e-01],\\n\",\n       \"         [-1.21756844e-01, -1.80763751e-01,  1.42212972e-01]],\\n\",\n       \"\\n\",\n       \"        [[ 1.09339440e-02, -3.85531969e-02, -6.03271686e-02],\\n\",\n       \"         [ 1.26041695e-01, -8.69184881e-02, -5.33027239e-02],\\n\",\n       \"         [-1.33838924e-03, -8.33624080e-02, -6.58709183e-02],\\n\",\n       \"         ...,\\n\",\n       \"         [-1.72450170e-01,  1.36239484e-01,  1.61665335e-01],\\n\",\n       \"         [ 2.30772883e-01,  2.10260451e-02,  1.33851498e-01],\\n\",\n       \"         [-2.07984760e-01, -1.68746337e-01,  2.15266049e-01]]],\\n\",\n       \"\\n\",\n       \"\\n\",\n       \"       ...,\\n\",\n       \"\\n\",\n       \"\\n\",\n       \"       [[[ 3.28091562e-01,  2.31943071e-01,  3.14745069e-01],\\n\",\n       \"         [-1.57922059e-01, -3.69662017e-01,  4.29991275e-01],\\n\",\n       \"         [ 1.38514131e-01,  6.90799952e-02,  4.04169001e-02],\\n\",\n       \"         ...,\\n\",\n       \"         [-3.36202681e-02,  3.79698873e-01,  5.83139472e-02],\\n\",\n       \"         [-1.52178168e-01, -2.67343760e-01,  1.01641491e-01],\\n\",\n       \"         [ 8.24085176e-02, -7.91617557e-02,  1.62353024e-01]],\\n\",\n       \"\\n\",\n       \"        [[-1.64384618e-01,  2.79992763e-02, -9.60212499e-02],\\n\",\n       \"         [ 1.73426345e-01, -1.67210206e-01,  5.19643784e-01],\\n\",\n       \"         [-4.87699091e-01, -3.44360441e-01, -3.71591836e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [ 7.17706442e-01,  5.90285540e-01, -2.06201538e-01],\\n\",\n       \"         [-7.54648209e-01, -5.48575699e-01,  1.69417053e-01],\\n\",\n       \"         [ 4.39212680e-01,  3.24219108e-01,  2.90745378e-01]],\\n\",\n       \"\\n\",\n       \"        [[ 1.15504839e-01, -3.59496236e-01,  2.11073101e-01],\\n\",\n       \"         [-6.04588687e-01, -2.78948098e-02, -6.96893752e-01],\\n\",\n       \"         [ 9.27109957e-01,  6.12412393e-01,  7.39015758e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [-8.95947635e-01, -2.06889696e-02,  2.18627051e-01],\\n\",\n       \"         [ 7.65301168e-01,  2.25973502e-01, -5.38723655e-02],\\n\",\n       \"         [-4.61084932e-01, -2.26172164e-01, -2.31560826e-01]],\\n\",\n       \"\\n\",\n       \"        ...,\\n\",\n       \"\\n\",\n       \"        [[ 4.29580957e-02,  2.00401142e-01, -9.89372656e-03],\\n\",\n       \"         [ 2.80811816e-01, -5.80144167e-01,  6.62714303e-01],\\n\",\n       \"         [-8.62461567e-01, -8.50817740e-01, -6.59833968e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [-3.38320106e-01, -4.47020203e-01,  3.65264952e-01],\\n\",\n       \"         [ 5.08716524e-01,  1.64203539e-01,  2.79004216e-01],\\n\",\n       \"         [-1.48775503e-01,  2.80653563e-04, -2.43095998e-02]],\\n\",\n       \"\\n\",\n       \"        [[ 7.59837553e-02, -3.04642200e-01,  7.23583251e-02],\\n\",\n       \"         [-3.56067806e-01,  1.97861642e-01, -6.84033215e-01],\\n\",\n       \"         [ 6.93900704e-01,  5.06925106e-01,  6.18374407e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [-4.82215174e-02, -7.39484131e-02,  2.66021729e-01],\\n\",\n       \"         [-2.97970474e-01, -1.82971597e-01,  1.40596166e-01],\\n\",\n       \"         [ 6.37628734e-02, -1.64584979e-01, -6.98368391e-03]],\\n\",\n       \"\\n\",\n       \"        [[-1.52346035e-02,  7.06654638e-02, -1.95035860e-01],\\n\",\n       \"         [ 3.47436965e-01, -3.62274557e-01,  4.49141830e-01],\\n\",\n       \"         [-3.07297379e-01, -2.55061120e-01, -4.59841579e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [ 5.57698607e-01,  4.91494775e-01, -6.12601228e-02],\\n\",\n       \"         [-6.95904195e-01, -4.71823573e-01,  1.46396654e-02],\\n\",\n       \"         [ 2.97390342e-01,  1.40025854e-01,  4.26453441e-01]]],\\n\",\n       \"\\n\",\n       \"\\n\",\n       \"       [[[ 3.24486405e-01,  2.35852838e-01,  3.16618949e-01],\\n\",\n       \"         [-1.47060588e-01, -3.71782124e-01,  4.39458400e-01],\\n\",\n       \"         [ 1.24793984e-01,  6.01639412e-02,  4.02406976e-02],\\n\",\n       \"         ...,\\n\",\n       \"         [-4.24607433e-02,  3.75543803e-01,  5.36665022e-02],\\n\",\n       \"         [-1.58329174e-01, -2.62590230e-01,  8.84788856e-02],\\n\",\n       \"         [ 7.86422864e-02, -8.49000067e-02,  1.59324989e-01]],\\n\",\n       \"\\n\",\n       \"        [[-1.56178862e-01,  3.88972163e-02, -8.18306804e-02],\\n\",\n       \"         [ 1.84061542e-01, -1.79109320e-01,  5.51241696e-01],\\n\",\n       \"         [-5.04722238e-01, -3.61917734e-01, -3.77561033e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [ 7.31009662e-01,  6.15777791e-01, -2.33439296e-01],\\n\",\n       \"         [-7.76671290e-01, -5.65945387e-01,  1.57402903e-01],\\n\",\n       \"         [ 4.49532956e-01,  3.28452915e-01,  2.99394101e-01]],\\n\",\n       \"\\n\",\n       \"        [[ 1.02626652e-01, -3.79289985e-01,  2.02140883e-01],\\n\",\n       \"         [-6.18043244e-01, -2.82461736e-02, -7.26448536e-01],\\n\",\n       \"         [ 9.41066682e-01,  6.22839689e-01,  7.20671415e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [-8.86739612e-01, -2.51042284e-02,  2.30643317e-01],\\n\",\n       \"         [ 7.48107672e-01,  2.05714211e-01, -3.81364413e-02],\\n\",\n       \"         [-4.56352353e-01, -2.17234656e-01, -2.21152052e-01]],\\n\",\n       \"\\n\",\n       \"        ...,\\n\",\n       \"\\n\",\n       \"        [[ 4.88667563e-02,  2.08087280e-01,  2.22599614e-04],\\n\",\n       \"         [ 2.77121454e-01, -5.75004578e-01,  6.66037500e-01],\\n\",\n       \"         [-8.59576702e-01, -8.47260952e-01, -6.52055919e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [-3.55650306e-01, -4.60160762e-01,  3.68615270e-01],\\n\",\n       \"         [ 5.20491242e-01,  1.72276929e-01,  2.78160036e-01],\\n\",\n       \"         [-1.54244632e-01,  1.75210810e-03, -3.07583250e-02]],\\n\",\n       \"\\n\",\n       \"        [[ 6.62929937e-02, -3.24058682e-01,  6.67889863e-02],\\n\",\n       \"         [-3.66179794e-01,  1.99684113e-01, -6.91476703e-01],\\n\",\n       \"         [ 7.09880829e-01,  5.20802855e-01,  6.20879591e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [-7.47452453e-02, -9.68089625e-02,  2.69781321e-01],\\n\",\n       \"         [-2.67466784e-01, -1.57957792e-01,  1.42870709e-01],\\n\",\n       \"         [ 5.39872609e-02, -1.61136732e-01, -6.13016216e-03]],\\n\",\n       \"\\n\",\n       \"        [[-1.50470277e-02,  6.99529871e-02, -1.96954578e-01],\\n\",\n       \"         [ 3.42375636e-01, -3.51661652e-01,  4.33758259e-01],\\n\",\n       \"         [-2.95699447e-01, -2.37829417e-01, -4.44642812e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [ 5.50044358e-01,  4.92978215e-01, -7.66981244e-02],\\n\",\n       \"         [-6.90217018e-01, -4.70508039e-01,  5.79284364e-03],\\n\",\n       \"         [ 2.85830498e-01,  1.34887442e-01,  4.29425836e-01]]],\\n\",\n       \"\\n\",\n       \"\\n\",\n       \"       [[[ 3.22824657e-01,  2.41062775e-01,  3.19095403e-01],\\n\",\n       \"         [-1.33742616e-01, -3.75967473e-01,  4.45875257e-01],\\n\",\n       \"         [ 1.09649576e-01,  5.39407656e-02,  2.87951119e-02],\\n\",\n       \"         ...,\\n\",\n       \"         [-4.55035567e-02,  3.71275246e-01,  5.01804650e-02],\\n\",\n       \"         [-1.81368187e-01, -2.69674420e-01,  8.57768580e-02],\\n\",\n       \"         [ 7.66498372e-02, -8.69410187e-02,  1.54167458e-01]],\\n\",\n       \"\\n\",\n       \"        [[-1.47284225e-01,  5.40608615e-02, -6.48469031e-02],\\n\",\n       \"         [ 1.95705503e-01, -1.93635330e-01,  5.73859096e-01],\\n\",\n       \"         [-5.27484119e-01, -3.80984455e-01, -3.97037566e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [ 7.26183951e-01,  6.15301311e-01, -2.34625325e-01],\\n\",\n       \"         [-7.81320512e-01, -5.73726118e-01,  1.32431850e-01],\\n\",\n       \"         [ 4.48875099e-01,  3.27830642e-01,  2.97908694e-01]],\\n\",\n       \"\\n\",\n       \"        [[ 9.61836874e-02, -3.76938581e-01,  1.92711875e-01],\\n\",\n       \"         [-6.23054445e-01, -4.85291816e-02, -7.19452918e-01],\\n\",\n       \"         [ 9.25066173e-01,  6.09999716e-01,  7.03961849e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [-8.86654675e-01, -3.78013216e-02,  2.37394124e-01],\\n\",\n       \"         [ 7.53812671e-01,  2.03501374e-01, -6.07147906e-03],\\n\",\n       \"         [-4.62591290e-01, -2.21702829e-01, -2.10880756e-01]],\\n\",\n       \"\\n\",\n       \"        ...,\\n\",\n       \"\\n\",\n       \"        [[ 5.16885631e-02,  2.13301256e-01,  6.57005655e-03],\\n\",\n       \"         [ 2.78806061e-01, -5.69760323e-01,  6.82743192e-01],\\n\",\n       \"         [-8.65907311e-01, -8.49609911e-01, -6.51102364e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [-3.74296576e-01, -4.66497570e-01,  3.73103946e-01],\\n\",\n       \"         [ 5.29079616e-01,  1.75842151e-01,  2.83917338e-01],\\n\",\n       \"         [-1.62859187e-01,  5.19873691e-04, -3.13235670e-02]],\\n\",\n       \"\\n\",\n       \"        [[ 6.07125461e-02, -3.37973148e-01,  6.29941672e-02],\\n\",\n       \"         [-3.81902844e-01,  1.94704801e-01, -7.04610884e-01],\\n\",\n       \"         [ 7.16744184e-01,  5.26270092e-01,  6.13018990e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [-1.20134160e-01, -1.33741260e-01,  2.75083065e-01],\\n\",\n       \"         [-2.27044120e-01, -1.26904070e-01,  1.43584237e-01],\\n\",\n       \"         [ 3.92883942e-02, -1.60847932e-01, -1.08369496e-02]],\\n\",\n       \"\\n\",\n       \"        [[-8.11249111e-03,  7.45976344e-02, -1.99472487e-01],\\n\",\n       \"         [ 3.41928095e-01, -3.49469543e-01,  4.36438680e-01],\\n\",\n       \"         [-2.98026115e-01, -2.31392533e-01, -4.40462291e-01],\\n\",\n       \"         ...,\\n\",\n       \"         [ 5.49112678e-01,  4.93310511e-01, -9.49802548e-02],\\n\",\n       \"         [-6.88755691e-01, -4.68035698e-01, -1.30833518e-02],\\n\",\n       \"         [ 2.80838847e-01,  1.32115334e-01,  4.35462296e-01]]]],\\n\",\n       \"      dtype=float32)\"\n      ]\n     },\n     \"execution_count\": 9,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"reconstructed_data\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.5.4\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "02_Python/MSCRED/cnn_lstm/evalution.py",
    "content": "import numpy as np\nimport matplotlib.pyplot as plt\nimport os\nimport cnn_lstm.utils as util\nimport re\n\n# score initialization\nvalid_anomaly_score = np.zeros((util.valid_end_id - util.valid_start_id, 1))\ntest_anomaly_score = np.zeros((util.test_end_id - util.valid_end_id, 1))\n\n# load the data from file\ntest_data_path = util.test_data_path\nreconstructed_data_path = util.reconstructed_data_path\ntest_data_path = os.path.join(test_data_path, \"test.npy\")\nreconstructed_data_path = os.path.join(reconstructed_data_path, \"test_reconstructed.npy\")\ntest_data = np.load(test_data_path)\ntest_data = test_data[:, -1, ...]  # only compare the last matrix with the reconstructed data\nreconstructed_data = np.load(reconstructed_data_path)\nprint(\"The shape of test data is {}\".format(test_data.shape))\nprint(\"The shape of reconstructed data is {}\".format(reconstructed_data.shape))\n\nvalid_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.\nfor 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\nmax_valid_anom = np.max(valid_anomaly_score)\nthreshold = max_valid_anom * util.alpha\n\nprint(\"Max valid anom is %.2f\" % max_valid_anom)\nprint(\"Threshold is %.2f\" % threshold)\n\n# compute the anomaly score in the test data.\nfor 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\nanomaly_pos = np.zeros(5)\nroot_cause_gt = np.zeros((5, 3))\nanomaly_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.\nroot_cause_f = open(\"../data/test_anomaly.csv\", \"r\")\n\nroot_cause_gt = np.loadtxt(root_cause_f, delimiter=\",\", dtype=np.int32)\nanomaly_pos = root_cause_gt[:, 0]\nanomaly_pos = [(anomaly_pos[i]/util.gap_time-util.test_start_id-anomaly_span[i % 3]/util.gap_time) for i in range(5)]\nfor i in range(5):\n\troot_cause_gt[i][0] = anomaly_pos[i]\n\n\nfig, axes = plt.subplots()\ntest_num = util.test_end_id - util.test_start_id\nplt.xticks(fontsize = 25)\nplt.ylim((0, 100))\nplt.yticks(np.arange(0, 101, 20), fontsize = 25)\nplt.plot(test_anomaly_score, 'b', linewidth = 2)\nthreshold = np.full((test_num), max_valid_anom * util.alpha)\naxes.plot(threshold, color = 'black', linestyle = '--',linewidth = 2)\nfor 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\nlabels = [' ', '0e3', '2e3', '4e3', '6e3', '8e3', '10e3']\naxes.set_xticklabels(labels, rotation = 25, fontsize = 20)\nplt.xlabel('Test Time', fontsize = 25)\nplt.ylabel('Anomaly Score', fontsize = 25)\naxes.spines['right'].set_visible(False)\naxes.spines['top'].set_visible(False)\naxes.yaxis.set_ticks_position('left')\naxes.xaxis.set_ticks_position('bottom')\nfig.subplots_adjust(bottom=0.25)\nfig.subplots_adjust(left=0.25)\nplt.title(\"MSCRED\", size = 25)\nplt.show()\n"
  },
  {
    "path": "02_Python/MSCRED/cnn_lstm/generation_signature_matrice.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"series_number is 30\\n\",\n      \"series_length is 20000\\n\",\n      \"signature_matrices_number is 2000\\n\",\n      \"the shape of signature_matrices is (3, 2000, 30, 30)\\n\",\n      \"train dataset shape is (790, 5, 30, 30, 3)\\n\",\n      \"test dataset shape is (1200, 5, 30, 30, 3)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"\\\"\\\"\\\"\\n\",\n    \"To represent the inter-correlations between different pairs of time series om a multivariate\\n\",\n    \"time  series segment from t-w to t, we construct an n * n signature matrix M based upon the\\n\",\n    \"pairwise inner-product of two time series within the segment.\\n\",\n    \"\\n\",\n    \"Construct s (s = 3) signature matrices with different lengths(w = 10, 30, 60)\\n\",\n    \"\\\"\\\"\\\"\\n\",\n    \"\\n\",\n    \"import numpy as np\\n\",\n    \"import pandas as pd\\n\",\n    \"import utils as util\\n\",\n    \"import os\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"class SignatureMatrices:\\n\",\n    \"    def __init__(self):\\n\",\n    \"\\n\",\n    \"        self.raw_data = pd.read_csv(util.raw_data_path, header=None)\\n\",\n    \"        self.series_number = self.raw_data.shape[0]\\n\",\n    \"        self.series_length = self.raw_data.shape[1]\\n\",\n    \"        self.signature_matrices_number = int(self.series_length / util.gap_time)\\n\",\n    \"\\n\",\n    \"        print(\\\"series_number is\\\", self.series_number)\\n\",\n    \"        print(\\\"series_length is\\\", self.series_length)\\n\",\n    \"        print(\\\"signature_matrices_number is\\\", self.signature_matrices_number)\\n\",\n    \"\\n\",\n    \"    def signature_matrices_generation(self, win):\\n\",\n    \"        \\\"\\\"\\\"\\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\",\n    \"        time series, T is the length of time series.\\n\",\n    \"        To represent the inter-correlations between different pairs of time series in a multivariate time series segment\\n\",\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\",\n    \"        within this segment.\\n\",\n    \"        :param win: the length of the time series segment\\n\",\n    \"        :return: the signature matrices\\n\",\n    \"        \\\"\\\"\\\"\\n\",\n    \"\\n\",\n    \"        if win == 0:\\n\",\n    \"            print(\\\"The size of win cannot be 0\\\")\\n\",\n    \"\\n\",\n    \"        raw_data = np.asarray(self.raw_data)\\n\",\n    \"        signature_matrices = np.zeros((self.signature_matrices_number, self.series_number, self.series_number))\\n\",\n    \"\\n\",\n    \"        for t in range(win, self.signature_matrices_number):\\n\",\n    \"            raw_data_t = raw_data[:, t - win:t]\\n\",\n    \"            signature_matrices[t] = np.dot(raw_data_t, raw_data_t.T) / win\\n\",\n    \"\\n\",\n    \"        return signature_matrices\\n\",\n    \"\\n\",\n    \"    def generate_train_test(self, signature_matrices):\\n\",\n    \"        \\\"\\\"\\\"\\n\",\n    \"        Generate train and test dataset, and store them to ../data/train/train.npy and ../data/test/test.npy\\n\",\n    \"        :param signature_matrices:\\n\",\n    \"        :return:\\n\",\n    \"        \\\"\\\"\\\"\\n\",\n    \"        train_dataset = []\\n\",\n    \"        test_dataset = []\\n\",\n    \"\\n\",\n    \"        for data_id in range(self.signature_matrices_number):\\n\",\n    \"            index = data_id - util.step_max + 1\\n\",\n    \"            if data_id < util.train_start_id:\\n\",\n    \"                continue\\n\",\n    \"            index_dataset = signature_matrices[:, index:index + util.step_max]\\n\",\n    \"            if data_id < util.test_start_id:\\n\",\n    \"                train_dataset.append(index_dataset)\\n\",\n    \"            else:\\n\",\n    \"                test_dataset.append(index_dataset)\\n\",\n    \"\\n\",\n    \"        train_dataset = np.asarray(train_dataset)\\n\",\n    \"        train_dataset = np.reshape(train_dataset, [-1, util.step_max, self.series_number, self.series_number,\\n\",\n    \"                                                   signature_matrices.shape[0]])\\n\",\n    \"        test_dataset = np.asarray(test_dataset)\\n\",\n    \"        test_dataset = np.reshape(test_dataset, [-1, util.step_max,self.series_number, self.series_number,\\n\",\n    \"                                                signature_matrices.shape[0]])\\n\",\n    \"\\n\",\n    \"        print(\\\"train dataset shape is\\\", train_dataset.shape)\\n\",\n    \"        print(\\\"test dataset shape is\\\", test_dataset.shape)\\n\",\n    \"\\n\",\n    \"        train_path = \\\"../data/train/\\\"\\n\",\n    \"        if not os.path.exists(train_path):\\n\",\n    \"            os.makedirs(train_path)\\n\",\n    \"        train_path = train_path + \\\"train.npy\\\"\\n\",\n    \"\\n\",\n    \"        test_path = \\\"../data/test/\\\"\\n\",\n    \"        if not os.path.exists(test_path):\\n\",\n    \"            os.makedirs(test_path)\\n\",\n    \"        test_path = test_path + \\\"test.npy\\\"\\n\",\n    \"\\n\",\n    \"        np.save(train_path, train_dataset)\\n\",\n    \"        np.save(test_path, test_dataset)\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"if __name__ == '__main__':\\n\",\n    \"    Matrices = SignatureMatrices()\\n\",\n    \"    signature_matrices = []\\n\",\n    \"\\n\",\n    \"    # Generation signature matrices according the win size w\\n\",\n    \"    for w in util.win_size:\\n\",\n    \"        signature_matrices.append(Matrices.signature_matrices_generation(w))\\n\",\n    \"\\n\",\n    \"    signature_matrices = np.asarray(signature_matrices)\\n\",\n    \"    print(\\\"the shape of signature_matrices is\\\", signature_matrices.shape)\\n\",\n    \"\\n\",\n    \"    # Generate train and test dataset\\n\",\n    \"    Matrices.generate_train_test(signature_matrices)\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"hide_input\": false,\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.8.8\"\n  },\n  \"toc\": {\n   \"base_numbering\": 1,\n   \"nav_menu\": {},\n   \"number_sections\": true,\n   \"sideBar\": true,\n   \"skip_h1_title\": false,\n   \"title_cell\": \"Table of Contents\",\n   \"title_sidebar\": \"Contents\",\n   \"toc_cell\": false,\n   \"toc_position\": {},\n   \"toc_section_display\": true,\n   \"toc_window_display\": false\n  },\n  \"varInspector\": {\n   \"cols\": {\n    \"lenName\": 16,\n    \"lenType\": 16,\n    \"lenVar\": 40\n   },\n   \"kernels_config\": {\n    \"python\": {\n     \"delete_cmd_postfix\": \"\",\n     \"delete_cmd_prefix\": \"del \",\n     \"library\": \"var_list.py\",\n     \"varRefreshCmd\": \"print(var_dic_list())\"\n    },\n    \"r\": {\n     \"delete_cmd_postfix\": \") \",\n     \"delete_cmd_prefix\": \"rm(\",\n     \"library\": \"var_list.r\",\n     \"varRefreshCmd\": \"cat(var_dic_list()) \"\n    }\n   },\n   \"types_to_exclude\": [\n    \"module\",\n    \"function\",\n    \"builtin_function_or_method\",\n    \"instance\",\n    \"_Feature\"\n   ],\n   \"window_display\": false\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "02_Python/MSCRED/cnn_lstm/generation_signature_matrice.py",
    "content": "\"\"\"\nTo represent the inter-correlations between different pairs of time series om a multivariate\ntime  series segment from t-w to t, we construct an n * n signature matrix M based upon the\npairwise inner-product of two time series within the segment.\n\nConstruct s (s = 3) signature matrices with different lengths(w = 10, 30, 60)\n\"\"\"\n\nimport numpy as np\nimport pandas as pd\nimport cnn_lstm.utils as util\nimport os\n\n\nclass 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\nif __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"
  },
  {
    "path": "02_Python/MSCRED/cnn_lstm/report.txt",
    "content": "TensorFlow 2.0 Upgrade Script\n-----------------------------\nConverted 1 files\nDetected 3 issues that require attention\n--------------------------------------------------------------------------------\n--------------------------------------------------------------------------------\nFile: convlstm.py\n--------------------------------------------------------------------------------\nconvlstm.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.\nconvlstm.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.\nconvlstm.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================================================================================\nDetailed log follows:\n\n================================================================================\n--------------------------------------------------------------------------------\nProcessing file 'convlstm.py'\n outputting to 'convlstm-update.py'\n--------------------------------------------------------------------------------\n\n17:13: INFO: Renamed keyword argument for tf.nn.conv2d from filter to filters\n33:72: INFO: Changing tf.contrib.layers xavier initializer to a tf.compat.v1.keras.initializers.VarianceScaling and converting arguments.\n\n73: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.\n73: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.\n84:21: INFO: Renamed 'tf.nn.dynamic_rnn' to 'tf.compat.v1.nn.dynamic_rnn'\n89:27: INFO: Added keywords to args of function 'tf.reduce_sum'\n109:13: INFO: Renamed keyword argument for tf.nn.conv2d_transpose from value to input\n109:13: INFO: Renamed keyword argument for tf.nn.conv2d_transpose from filter to filters\n143:11: INFO: Renamed 'tf.Session' to 'tf.compat.v1.Session'\n164:11: INFO: Added keywords to args of function 'tf.reduce_mean'\n168:11: INFO: Renamed 'tf.global_variables_initializer' to 'tf.compat.v1.global_variables_initializer'\n198: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"
  },
  {
    "path": "02_Python/MSCRED/cnn_lstm/utils.py",
    "content": "# Parameter initialization\n\ngap_time = 10  # gap time between each segment\nwin_size = [10, 30, 60]  # window size of each segment\nstep_max = 5 # maximum step of ConvLSTM\n\nraw_data_path = '../data/synthetic_data_with_anomaly-s-1.csv'  # path to load raw data\nmodel_path = '../MSCRED/'\ntrain_data_path = \"../data/train/\"\ntest_data_path = \"../data/test/\"\nreconstructed_data_path = \"../data/reconstructed/\"\n\n\ntrain_start_id = 10\ntrain_end_id = 800\n\ntest_start_id = 800\ntest_end_id = 2000\n\nvalid_start_id = 800\nvalid_end_id = 1000\n\ntraining_iters = 5\nsave_model_step = 1\n\nlearning_rate = 0.0002\n\nthrehold = 0.005\nalpha = 1.5"
  },
  {
    "path": "02_Python/Mean_Shift.py",
    "content": "#================================================================================================================\n#----------------------------------------------------------------------------------------------------------------\n#\t\t\t\t\t\t\t\t\tMEAN SHIFT\n#----------------------------------------------------------------------------------------------------------------\n#================================================================================================================\n\nimport math\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom matplotlib import style\nimport pandas\nimport datetime\nfrom sklearn import preprocessing, cross_validation\n\n#for plotting\nplt.style.use('ggplot')\n\nclass CustomMS:\n\t\n\tdef __init__(self):\n\t\tpass\n\t\t\n\t\t\t\ndef main():\n\t'''\n\tPclass Passenger Class (1 = 1st; 2 = 2nd; 3 = 3rd)\n\tsurvival Survival (0 = No; 1 = Yes)\n\tname Name\n\tsex Sex\n\tage Age\n\tsibsp Number of Siblings/Spouses Aboard\n\tparch Number of Parents/Children Aboard\n\tticket Ticket Number\n\tfare Passenger Fare (British pound)\n\tcabin Cabin\n\tembarked Port of Embarkation (C = Cherbourg; Q = Queenstown; S = Southampton)\n\tboat Lifeboat\n\tbody Body Identification Number\n\thome.dest Home/Destination\n\t'''\n\n\tdf = pd.read_excel('data/titanic.xls')\n\n\toriginal_df = pd.DataFrame.copy(df)\n\tdf.drop(['body','name'], 1, inplace=True)\n\tdf.fillna(0,inplace=True)\n\n\tdef handle_non_numerical_data(df):\n\t\t\n\t\t# handling non-numerical data: must convert.\n\t\tcolumns = df.columns.values\n\n\t\tfor column in columns:\n\t\t\ttext_digit_vals = {}\n\t\t\tdef convert_to_int(val):\n\t\t\t\treturn text_digit_vals[val]\n\n\t\t\t#print(column,df[column].dtype)\n\t\t\tif df[column].dtype != np.int64 and df[column].dtype != np.float64:\n\t\t\t\t\n\t\t\t\tcolumn_contents = df[column].values.tolist()\n\t\t\t\t#finding just the uniques\n\t\t\t\tunique_elements = set(column_contents)\n\t\t\t\t# great, found them. \n\t\t\t\tx = 0\n\t\t\t\tfor unique in unique_elements:\n\t\t\t\t\tif unique not in text_digit_vals:\n\t\t\t\t\t\t# creating dict that contains new\n\t\t\t\t\t\t# id per unique string\n\t\t\t\t\t\ttext_digit_vals[unique] = x\n\t\t\t\t\t\tx+=1\n\t\t\t\t# now we map the new \"id\" vlaue\n\t\t\t\t# to replace the string. \n\t\t\t\tdf[column] = list(map(convert_to_int,df[column]))\n\n\t\treturn df\n\n\tdf = handle_non_numerical_data(df)\n\tdf.drop(['ticket','home.dest'], 1, inplace=True)\n\n\tX = np.array(df.drop(['survived'], 1).astype(float))\n\tX = preprocessing.scale(X)\n\ty = np.array(df['survived'])\n\tms = CustomMS()\n\n\tms.fit(dataset = dataset)\n\t\n\t\nif __name__ == \"__main__\":\n\tmain()\n"
  },
  {
    "path": "02_Python/Naive_Bayes.py",
    "content": "#================================================================================================================\n#----------------------------------------------------------------------------------------------------------------\n#\t\t\t\t\t\t\t\t\tNAIVE BAYES\n#----------------------------------------------------------------------------------------------------------------\n#================================================================================================================\n\n#Using Naive Bayes to classify emails as spam and non-spam\n\nimport math\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom matplotlib import style\nimport pandas as pd\nimport nltk\nimport re\n\n#for plotting\nplt.style.use('ggplot')\n\nclass CustomNB:\n\t\n\tdef __init__(self):\n\t\tpass\n\t\n\tdef create_freq_table(self, texts, labels=None):\n\t\t#create the dataframe\n\t\tft = pd.DataFrame([])\n\t\t#iterate through them emails\n\t\tfor index, trm in enumerate(texts):\n\t\t\tvocabulary = trm #all the words of the email\n\t\t\t#amount of times each word occurs in the dictionary\n\t\t\tfreq_dict = pd.Series({ v : trm.count(v) for v in vocabulary})\n\n\t\t\tif labels!=None:\n\t\t\t\tfreq_dict['CLASS'] = labels[index]\n\t\t\tft = ft.append(freq_dict, ignore_index=True)\n\t\tft = ft.fillna(0)\n\t\treturn \tft\n\n\tdef train(self, freq):\n\t\tfq = freq.iloc[:,1:]\n\t\tlabels = fq.iloc[:, 0].values\n\t\tvocabulary = list(fq.columns.values)\n\t\ts, ns = pd.DataFrame([]), pd.DataFrame([])\n\t\tfor index, rw in fq.iterrows():\n\t\t\tif labels[index] == 1:\n\t\t\t\ts = s.append(rw)\n\t\t\telse:\n\t\t\t\tns = ns.append(rw)\n\t\t\n\t\tswc = sum([word for word in s.sum()])\n\t\tnswc = sum([word for word in ns.sum()])\n\t\t\n\t\t#Create the dicts for storing the model\n\t\tnon_spam_model, spam_model = {}, {}\n\t\t\n\t\talpha = 0.5\n\t\tfor word in vocabulary:\n\t\t\tspam_occurances = s[word].sum()\n\t\t\tnon_spam_occurances = ns[word].sum()\n\t\t\t#Now, the crux of the algo, the bayesian probablity\n\t\t\tbayesian_probablity_for_spam = ( spam_occurances + alpha ) / ( swc )\n\t\t\tbayesian_probablity_for_non_spam = ( non_spam_occurances + alpha ) / ( nswc )\n\t\t\t#Update the model\n\t\t\tnon_spam_model[word], spam_model[word] = bayesian_probablity_for_spam , bayesian_probablity_for_non_spam\n\t\t\n\t\treturn spam_model, non_spam_model\n\n\tdef predict(self, text, spam_model,non_spam_model):\n\t\ttext = [x for x in text.replace('\\n', ' ')]\n\t\ttext = [''.join(text).split()]\n\t\tf_table = self.create_freq_table(text)\n\t\tvocabulary = f_table.columns.values\n\t\t\n\t\tspam_prob = 0\n\t\tnon_spam_prob = 0\n\t\t\n\t\tfor word in vocabulary:\n\t\t\tif word in spam_model:\n\t\t\t\tspam_prob += spam_model[word]\n\t\t\tif word in non_spam_model:\n\t\t\t\tnon_spam_prob += non_spam_model[word]\n\n\t\tprint(spam_prob, non_spam_prob)\n\t\treturn (spam_prob / non_spam_prob)\n\ndef main():\n\t\n\t# 0 means spam, 1 means not spam\n\temails = {\"0\": [\"Dear friend, win 1000$ cash right now!!.\", \" Webcams Day & Night - All LIVE - Webcams Contest\",\n\t\t\t\"Congratulations, you've won a free car!\"], \n\t\t\t\"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\",\n\t\t\t\"Open the Pod bay doors, HAL.\" , \" I'm sorry, Dave. I'm afraid I can't do that.\"]}\n\tt= []\n\tlabl = []\n\n\tfor k in emails:\n\t\tfor mail in emails[k]:\n\t\t\ttokens = [word.lower() for sent in nltk.sent_tokenize(mail) for word in nltk.word_tokenize(sent)]\n\t\t\tfiltered_tokens = []\n\t\t\t# filter out any tokens not containing letters (e.g., numeric tokens, raw punctuation)\n\t\t\tfor token in tokens:\n\t\t\t\tif re.search('[a-zA-Z]', token):\n\t\t\t\t\tfiltered_tokens.append(token)\n\t\t\tt.append(' '.join(filtered_tokens))\n\t\t\tlabl.append(k)\n\tfor i in range(len(t)):\n\t\tt[i] = t[i].split()\n\t\n\tnb = CustomNB()\n\tfreq_table = nb.create_freq_table(t, labl)\n\tsp, nsp = nb.train(freq_table)\n\t#ip = \"Hey, Can you redo the presentation and send it on by Friday?\"\n\t#ip = \"Webcams Day & Night - All LIVE - Webcams Contest\"\n\tip = \"Open the Pod bay doors, HAL.\"\n\t#ip = \"I'm sorry, Dave. I'm afraid I can't do that.\"\n\t\n\tpropr_ip = []\n\tfor ch in nltk.word_tokenize(ip):\n\t\tif re.search('[a-zA-Z]', ch):\n\t\t\tpropr_ip.append(ch.lower())\n\tpropr_ip = ' '.join(propr_ip)\n\tx = nb.predict(propr_ip, sp, nsp)\n\n\tprint(x)\n\tif x < 0.5:\n\t\tprint(\"spam\")\n\telse:\n\t\tprint(\"not spam\")\n\nif __name__ == \"__main__\":\n\tmain()"
  },
  {
    "path": "02_Python/README.md",
    "content": "<p align=\"center\"> \n<a href=\"https://github.com/milaan9\"><img src=\"https://img.shields.io/static/v1?logo=github&label=maintainer&message=milaan9&color=ff3300\" alt=\"Last Commit\"/></a> \n<a href=\"https://hits.seeyoufarm.com\"><img src=\"https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2Fmilaan9%2FClustering_Algorithms_from_Scratch%2Ftree%2Fmain%2F02_Python&count_bg=%231DC92C&title_bg=%23555555&icon=&icon_color=%23E7E7E7&title=views&edge_flat=false\"/></a>\n</p> \n<!--<img src=\"https://badges.pufler.dev/contributors/milaan9/01_Python_Introduction?size=50&padding=5&bots=true\" alt=\"milaan9\"/>-->\n \n# Clustering Algorithms with Python\n \nImplementing machine learning algorithms from scratch.\n\n## Algorithms implemented so far:\n\n1. Simple Linear Regression.  \n   Dataset: Stock data from Quandl  \n\n2. Logistic Regression.  \n   Dataset: Stanford ML course dataset  \n\n3. Naive Bayes Classifier.  \n   Dataset: Email spam/non-span  \n\n4. Decision Trees\n\n5. K Nearest Neighbours.  \n   K Nearest Neighbours in Parallel.  \n   Dataset: Chronic Kidney disease data from UCI  \n\n6. A-Star Algorithm\n\n7. K Means Clustering.  \n   K Means Clustering in Parallel.  \n   Dataset: IPL player stats norm data\n\n8. Support Vector Machine\n"
  },
  {
    "path": "02_Python/Random_Forest_Classifier.py",
    "content": "import pandas as pd\nimport numpy as np\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.ensemble import RandomForestClassifier\n\nRSEED = 50\n\n# Load in data\ndf = pd.read_csv('https://s3.amazonaws.com/projects-rf/clean_data.csv')\n\n# Full dataset: https://www.kaggle.com/cdc/behavioral-risk-factor-surveillance-system\n\n# Extract the labels\nlabels = np.array(df.pop('label'))\n\n# 30% examples in test data\ntrain, test, train_labels, test_labels = train_test_split(df,\n                                         labels, \n                                         stratify = labels,\n                                         test_size = 0.3, \n                                         random_state = RSEED)\n\n# Imputation of missing values\ntrain = train.fillna(train.mean())\ntest = test.fillna(test.mean())\n\n# Features for feature importances\nfeatures = list(train.columns)\n\n# Create the model with 100 trees\nmodel = RandomForestClassifier(n_estimators=100, \n                               random_state=RSEED, \n                               max_features = 'sqrt',\n                               n_jobs=-1, verbose = 1)\n\n# Fit on training data\nmodel.fit(train, train_labels)\n\n\nn_nodes = []\nmax_depths = []\n\n# Stats about the trees in random forest\nfor ind_tree in model.estimators_:\n    n_nodes.append(ind_tree.tree_.node_count)\n    max_depths.append(ind_tree.tree_.max_depth)\n    \nprint(f'Average number of nodes {int(np.mean(n_nodes))}')\nprint(f'Average maximum depth {int(np.mean(max_depths))}')\n\n# Training predictions (to demonstrate overfitting)\ntrain_rf_predictions = model.predict(train)\ntrain_rf_probs = model.predict_proba(train)[:, 1]\n\n# Testing predictions (to determine performance)\nrf_predictions = model.predict(test)\nrf_probs = model.predict_proba(test)[:, 1]\n\nfrom sklearn.metrics import precision_score, recall_score, roc_auc_score, roc_curve\nimport matplotlib.pyplot as plt\n\n# Plot formatting\nplt.style.use('fivethirtyeight')\nplt.rcParams['font.size'] = 18\n\ndef evaluate_model(predictions, probs, train_predictions, train_probs):\n    \"\"\"Compare machine learning model to baseline performance.\n    Computes statistics and shows ROC curve.\"\"\"\n    \n    baseline = {}\n    \n    baseline['recall'] = recall_score(test_labels, \n                                     [1 for _ in range(len(test_labels))])\n    baseline['precision'] = precision_score(test_labels, \n                                      [1 for _ in range(len(test_labels))])\n    baseline['roc'] = 0.5\n    \n    results = {}\n    \n    results['recall'] = recall_score(test_labels, predictions)\n    results['precision'] = precision_score(test_labels, predictions)\n    results['roc'] = roc_auc_score(test_labels, probs)\n    \n    train_results = {}\n    train_results['recall'] = recall_score(train_labels, train_predictions)\n    train_results['precision'] = precision_score(train_labels, train_predictions)\n    train_results['roc'] = roc_auc_score(train_labels, train_probs)\n    \n    for metric in ['recall', 'precision', 'roc']:\n        print(f'{metric.capitalize()} Baseline: {round(baseline[metric], 2)} Test: {round(results[metric], 2)} Train: {round(train_results[metric], 2)}')\n    \n    # Calculate false positive rates and true positive rates\n    base_fpr, base_tpr, _ = roc_curve(test_labels, [1 for _ in range(len(test_labels))])\n    model_fpr, model_tpr, _ = roc_curve(test_labels, probs)\n\n    plt.figure(figsize = (8, 6))\n    plt.rcParams['font.size'] = 16\n    \n    # Plot both curves\n    plt.plot(base_fpr, base_tpr, 'b', label = 'baseline')\n    plt.plot(model_fpr, model_tpr, 'r', label = 'model')\n    plt.legend();\n    plt.xlabel('False Positive Rate'); \n    plt.ylabel('True Positive Rate'); plt.title('ROC Curves');\n    plt.show();\n\nevaluate_model(rf_predictions, rf_probs, train_rf_predictions, train_rf_probs)\nplt.savefig('roc_auc_curve.png')\n\nfrom sklearn.metrics import confusion_matrix\nimport itertools\n\ndef plot_confusion_matrix(cm, classes,\n                          normalize=False,\n                          title='Confusion matrix',\n                          cmap=plt.cm.Oranges):\n    \"\"\"\n    This function prints and plots the confusion matrix.\n    Normalization can be applied by setting `normalize=True`.\n    Source: http://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html\n    \"\"\"\n    if normalize:\n        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n        print(\"Normalized confusion matrix\")\n    else:\n        print('Confusion matrix, without normalization')\n\n    print(cm)\n\n    # Plot the confusion matrix\n    plt.figure(figsize = (10, 10))\n    plt.imshow(cm, interpolation='nearest', cmap=cmap)\n    plt.title(title, size = 24)\n    plt.colorbar(aspect=4)\n    tick_marks = np.arange(len(classes))\n    plt.xticks(tick_marks, classes, rotation=45, size = 14)\n    plt.yticks(tick_marks, classes, size = 14)\n\n    fmt = '.2f' if normalize else 'd'\n    thresh = cm.max() / 2.\n    \n    # Labeling the plot\n    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n        plt.text(j, i, format(cm[i, j], fmt), fontsize = 20,\n                 horizontalalignment=\"center\",\n                 color=\"white\" if cm[i, j] > thresh else \"black\")\n        \n    plt.grid(None)\n    plt.tight_layout()\n    plt.ylabel('True label', size = 18)\n    plt.xlabel('Predicted label', size = 18)\n\n# Confusion matrix\ncm = confusion_matrix(test_labels, rf_predictions)\nplot_confusion_matrix(cm, classes = ['Poor Health', 'Good Health'],\n                      title = 'Health Confusion Matrix')\n\nplt.savefig('cm.png')\n"
  },
  {
    "path": "02_Python/Support_Vector_Machine.py",
    "content": "#================================================================================================================\n#----------------------------------------------------------------------------------------------------------------\n#\t\t\t\t\t\t\t\t\tSUPPORT VECTOR MACHINE\n#----------------------------------------------------------------------------------------------------------------\n#================================================================================================================\n\nimport math\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom matplotlib import style\nimport pandas as pd\nimport datetime\nimport random\n\n#for plotting\nplt.style.use('ggplot')\n\nclass CustomSVM:\n\n\tdef __init__(self):\n\t\tpass\n\n\n\t#Use the data and find a 'model' ie the values for W and b. Maximize b and minimize b\n\tdef fit(self, dataset):\n\t\tself.dataset = dataset\n\n\t\t# Magnitude of W is the key, list of W and b is the value\n\t\toptions = {}\n\n\n\t\tall_feature_values = []\n\n\t\tfor yi, attrs in self.dataset.items():\n\t\t\tfor attr in attrs:\n\t\t\t\tfor f in attr:\n\t\t\t\t\tall_feature_values.append(f)\n\n\t\tself.max_attr = max(all_feature_values)\n\t\tself.min_attr = min(all_feature_values)\n\t\tdel all_feature_values\n\n\t\tstep_size = [self.max_attr * 0.1,self.max_attr * 0.01,self.max_attr * 0.005]\n\t\tlatest_optimum = 10 * self.max_attr\n\n\t\tb_range = 5\n\t\tb_multiple = 5\n\n\t\ttrans =  [[1, 1, 1, 1], [1, 1, 1, -1], [1, 1,-1, 1], [1, 1,-1,-1], [1 ,-1, 1, 1], [1 ,-1, -1, 1], [1 ,-1, 1, -1], [1 ,-1, -1, -1], [-1, 1, 1, 1], [-1, 1, 1, -1], [-1, 1, -1, 1], [-1, 1, -1, -1], [-1,-1, 1, 1], [-1,-1, 1, -1], [-1,-1, -1, 1], [-1,-1, -1, -1]]\n\n\t\tfor step in step_size:\n\t\t\tW = np.array([latest_optimum,latest_optimum, latest_optimum, latest_optimum])\n\t\t\toptimization_flag = False\n\n\t\t\twhile not optimization_flag:\n\t\t\t\tfor b in np.arange(-1*(self.max_attr* b_range ), self.max_attr * b_range, step * b_multiple):\n\t\t\t\t\tfor transformation in trans:\n\t\t\t\t\t\tW_t = W * transformation\n\t\t\t\t\t\tfound = True\n\t\t\t\t\t\tfor yi, attributes in self.dataset.items():\n\t\t\t\t\t\t\tfor xi in attributes:\n\t\t\t\t\t\t\t\tif not (yi * (np.dot(xi, W_t)  +b )) >= 1:\n\t\t\t\t\t\t\t\t\tfound = False\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tif found:\n\t\t\t\t\t\t\toptions[np.linalg.norm(W_t)] = [W_t, b]\n\t\t\t\tif W[0]<0:\n\t\t\t\t\toptimization_flag = True\n\t\t\t\telse:\n\t\t\t\t\tW = np.array(list(map(lambda w: w-step, W)))\n\n\t\t\tnorms = min([n for n in options])\n\t\t\tself.W = options[norms][0]\n\t\t\tself.b = options[norms][1]\n\n\t\t\tlatest_optimum = options[norms][0][0] + step*2\n\n\tdef predict(self, attrs):\n\t\t#sign of the X(i).W + b defines the class\n\t\tdot_product = np.dot(np.array(attrs), self.W)\n\t\tclassification = np.sign(dot_product + self.b)\n\n\t\treturn classification\n\n\tdef test(self, test_set):\n\t\tself.accurate_predictions, self.total_predictions = 0, 0 \n\t\tfor group in test_set:\n\t\t\tfor data in test_set[group]:\n\t\t\t\tpredicted_class = self.predict(data)\n\t\t\t\tif predicted_class == group:\n\t\t\t\t\tself.accurate_predictions += 1\n\t\t\t\tself.total_predictions += 1\n\t\tself.accuracy = 100*(self.accurate_predictions/self.total_predictions)\n\t\tprint(\"\\nAcurracy :\", str(self.accuracy) + \"%\")\n\ndef main():\n\n\tdf = pd.read_csv(r\"./data/iris.csv\") #Reading from the data file\n\n\tdf.replace('Iris-setosa', -1, inplace = True)\n\tdf.replace('Iris-versicolor', 1, inplace = True)\n\n\tdataset = df.astype(float).values.tolist()\n\t#Shuffle the dataset\n\n\trandom.shuffle(dataset)\n\n\t#20% of the available data will be used for testing\n\n\ttest_size = 0.20\n\n\t#The keys of the dict are the classes that the data is classfied into\n\n\ttraining_set = {-1: [], 1:[]}\n\ttest_set = {-1: [], 1:[]}\n\ttraining_data = dataset[:-int(test_size * len(dataset))]\n\ttest_data = dataset[-int(test_size * len(dataset)):]\n\n\tfor record in training_data:\n\t\t#Append the list in the dict will all the elements of the record except the class\n\t\ttraining_set[record[-1]].append(record[:-1])\n\t\t#Insert data into the test set\n\n\tfor record in test_data:\n\t\t# Append the list in the dict will all the elements of the record except the class\n\t\ttest_set[record[-1]].append(record[:-1])\n\n\tdataset = { -1 : np.array([[2,3],[4,5],[2,1]]), 1: np.array([[5,6], [8,8], [9,9]]) }\n\tsvm = CustomSVM()\n\n\tsvm.fit(dataset = training_set)\n\tsvm.test(test_set)\nif __name__ == \"__main__\":\n\tmain()\n"
  },
  {
    "path": "02_Python/data/chronic_kidney_disease.csv",
    "content": "age,bp,sg,al,su,rbc,pc,pcc,ba,bgr,bu,sc,sod,pot,hemo,pcv,wbcc,rbcc,htn,dm,cad,appet,pe,ane,class\n48,80,1.020,1,0,?,normal,notpresent,notpresent,121,36,1.2,?,?,15.4,44,7800,5.2,yes,yes,no,good,no,no,ckd\n7,50,1.020,4,0,?,normal,notpresent,notpresent,?,18,0.8,?,?,11.3,38,6000,?,no,no,no,good,no,no,ckd\n62,80,1.010,2,3,normal,normal,notpresent,notpresent,423,53,1.8,?,?,9.6,31,7500,?,no,yes,no,poor,no,yes,ckd\n48,70,1.005,4,0,normal,abnormal,present,notpresent,117,56,3.8,111,2.5,11.2,32,6700,3.9,yes,no,no,poor,yes,yes,ckd\n51,80,1.010,2,0,normal,normal,notpresent,notpresent,106,26,1.4,?,?,11.6,35,7300,4.6,no,no,no,good,no,no,ckd\n60,90,1.015,3,0,?,?,notpresent,notpresent,74,25,1.1,142,3.2,12.2,39,7800,4.4,yes,yes,no,good,yes,no,ckd\n68,70,1.010,0,0,?,normal,notpresent,notpresent,100,54,24.0,104,4.0,12.4,36,?,?,no,no,no,good,no,no,ckd\n24,?,1.015,2,4,normal,abnormal,notpresent,notpresent,410,31,1.1,?,?,12.4,44,6900,5,no,yes,no,good,yes,no,ckd\n52,100,1.015,3,0,normal,abnormal,present,notpresent,138,60,1.9,?,?,10.8,33,9600,4.0,yes,yes,no,good,no,yes,ckd\n53,90,1.020,2,0,abnormal,abnormal,present,notpresent,70,107,7.2,114,3.7,9.5,29,12100,3.7,yes,yes,no,poor,no,yes,ckd\n50,60,1.010,2,4,?,abnormal,present,notpresent,490,55,4.0,?,?,9.4,28,?,?,yes,yes,no,good,no,yes,ckd\n63,70,1.010,3,0,abnormal,abnormal,present,notpresent,380,60,2.7,131,4.2,10.8,32,4500,3.8,yes,yes,no,poor,yes,no,ckd\n68,70,1.015,3,1,?,normal,present,notpresent,208,72,2.1,138,5.8,9.7,28,12200,3.4,yes,yes,yes,poor,yes,no,ckd\n68,70,?,?,?,?,?,notpresent,notpresent,98,86,4.6,135,3.4,9.8,?,?,?,yes,yes,yes,poor,yes,no,ckd\n68,80,1.010,3,2,normal,abnormal,present,present,157,90,4.1,130,6.4,5.6,16,11000,2.6,yes,yes,yes,poor,yes,no,ckd\n40,80,1.015,3,0,?,normal,notpresent,notpresent,76,162,9.6,141,4.9,7.6,24,3800,2.8,yes,no,no,good,no,yes,ckd\n47,70,1.015,2,0,?,normal,notpresent,notpresent,99,46,2.2,138,4.1,12.6,?,?,?,no,no,no,good,no,no,ckd\n47,80,?,?,?,?,?,notpresent,notpresent,114,87,5.2,139,3.7,12.1,?,?,?,yes,no,no,poor,no,no,ckd\n60,100,1.025,0,3,?,normal,notpresent,notpresent,263,27,1.3,135,4.3,12.7,37,11400,4.3,yes,yes,yes,good,no,no,ckd\n62,60,1.015,1,0,?,abnormal,present,notpresent,100,31,1.6,?,?,10.3,30,5300,3.7,yes,no,yes,good,no,no,ckd\n61,80,1.015,2,0,abnormal,abnormal,notpresent,notpresent,173,148,3.9,135,5.2,7.7,24,9200,3.2,yes,yes,yes,poor,yes,yes,ckd\n60,90,?,?,?,?,?,notpresent,notpresent,?,180,76,4.5,?,10.9,32,6200,3.6,yes,yes,yes,good,no,no,ckd\n48,80,1.025,4,0,normal,abnormal,notpresent,notpresent,95,163,7.7,136,3.8,9.8,32,6900,3.4,yes,no,no,good,no,yes,ckd\n21,70,1.010,0,0,?,normal,notpresent,notpresent,?,?,?,?,?,?,?,?,?,no,no,no,poor,no,yes,ckd\n42,100,1.015,4,0,normal,abnormal,notpresent,present,?,50,1.4,129,4.0,11.1,39,8300,4.6,yes,no,no,poor,no,no,ckd\n61,60,1.025,0,0,?,normal,notpresent,notpresent,108,75,1.9,141,5.2,9.9,29,8400,3.7,yes,yes,no,good,no,yes,ckd\n75,80,1.015,0,0,?,normal,notpresent,notpresent,156,45,2.4,140,3.4,11.6,35,10300,4,yes,yes,no,poor,no,no,ckd\n69,70,1.010,3,4,normal,abnormal,notpresent,notpresent,264,87,2.7,130,4.0,12.5,37,9600,4.1,yes,yes,yes,good,yes,no,ckd\n75,70,?,1,3,?,?,notpresent,notpresent,123,31,1.4,?,?,?,?,?,?,no,yes,no,good,no,no,ckd\n68,70,1.005,1,0,abnormal,abnormal,present,notpresent,?,28,1.4,?,?,12.9,38,?,?,no,no,yes,good,no,no,ckd\n?,70,?,?,?,?,?,notpresent,notpresent,93,155,7.3,132,4.9,?,?,?,?,yes,yes,no,good,no,no,ckd\n73,90,1.015,3,0,?,abnormal,present,notpresent,107,33,1.5,141,4.6,10.1,30,7800,4,no,no,no,poor,no,no,ckd\n61,90,1.010,1,1,?,normal,notpresent,notpresent,159,39,1.5,133,4.9,11.3,34,9600,4.0,yes,yes,no,poor,no,no,ckd\n60,100,1.020,2,0,abnormal,abnormal,notpresent,notpresent,140,55,2.5,?,?,10.1,29,?,?,yes,no,no,poor,no,no,ckd\n70,70,1.010,1,0,normal,?,present,present,171,153,5.2,?,?,?,?,?,?,no,yes,no,poor,no,no,ckd\n65,90,1.020,2,1,abnormal,normal,notpresent,notpresent,270,39,2.0,?,?,12.0,36,9800,4.9,yes,yes,no,poor,no,yes,ckd\n76,70,1.015,1,0,normal,normal,notpresent,notpresent,92,29,1.8,133,3.9,10.3,32,?,?,yes,no,no,good,no,no,ckd\n72,80,?,?,?,?,?,notpresent,notpresent,137,65,3.4,141,4.7,9.7,28,6900,2.5,yes,yes,no,poor,no,yes,ckd\n69,80,1.020,3,0,abnormal,normal,notpresent,notpresent,?,103,4.1,132,5.9,12.5,?,?,?,yes,no,no,good,no,no,ckd\n82,80,1.010,2,2,normal,?,notpresent,notpresent,140,70,3.4,136,4.2,13.0,40,9800,4.2,yes,yes,no,good,no,no,ckd\n46,90,1.010,2,0,normal,abnormal,notpresent,notpresent,99,80,2.1,?,?,11.1,32,9100,4.1,yes,no,no,good,no,no,ckd\n45,70,1.010,0,0,?,normal,notpresent,notpresent,?,20,0.7,?,?,?,?,?,?,no,no,no,good,yes,no,ckd\n47,100,1.010,0,0,?,normal,notpresent,notpresent,204,29,1.0,139,4.2,9.7,33,9200,4.5,yes,no,no,good,no,yes,ckd\n35,80,1.010,1,0,abnormal,?,notpresent,notpresent,79,202,10.8,134,3.4,7.9,24,7900,3.1,no,yes,no,good,no,no,ckd\n54,80,1.010,3,0,abnormal,abnormal,notpresent,notpresent,207,77,6.3,134,4.8,9.7,28,?,?,yes,yes,no,poor,yes,no,ckd\n54,80,1.020,3,0,?,abnormal,notpresent,notpresent,208,89,5.9,130,4.9,9.3,?,?,?,yes,yes,no,poor,yes,no,ckd\n48,70,1.015,0,0,?,normal,notpresent,notpresent,124,24,1.2,142,4.2,12.4,37,6400,4.7,no,yes,no,good,no,no,ckd\n11,80,1.010,3,0,?,normal,notpresent,notpresent,?,17,0.8,?,?,15.0,45,8600,?,no,no,no,good,no,no,ckd\n73,70,1.005,0,0,normal,normal,notpresent,notpresent,70,32,0.9,125,4.0,10.0,29,18900,3.5,yes,yes,no,good,yes,no,ckd\n60,70,1.010,2,0,normal,abnormal,present,notpresent,144,72,3.0,?,?,9.7,29,21600,3.5,yes,yes,no,poor,no,yes,ckd\n53,60,?,?,?,?,?,notpresent,notpresent,91,114,3.25,142,4.3,8.6,28,11000,3.8,yes,yes,no,poor,yes,yes,ckd\n54,100,1.015,3,0,?,normal,present,notpresent,162,66,1.6,136,4.4,10.3,33,?,?,yes,yes,no,poor,yes,no,ckd\n53,90,1.015,0,0,?,normal,notpresent,notpresent,?,38,2.2,?,?,10.9,34,4300,3.7,no,no,no,poor,no,yes,ckd\n62,80,1.015,0,5,?,?,notpresent,notpresent,246,24,1.0,?,?,13.6,40,8500,4.7,yes,yes,no,good,no,no,ckd\n63,80,1.010,2,2,normal,?,notpresent,notpresent,?,?,3.4,136,4.2,13.0,40,9800,4.2,yes,no,yes,good,no,no,ckd\n35,80,1.005,3,0,abnormal,normal,notpresent,notpresent,?,?,?,?,?,9.5,28,?,?,no,no,no,good,yes,no,ckd\n76,70,1.015,3,4,normal,abnormal,present,notpresent,?,164,9.7,131,4.4,10.2,30,11300,3.4,yes,yes,yes,poor,yes,no,ckd\n76,90,?,?,?,?,normal,notpresent,notpresent,93,155,7.3,132,4.9,?,?,?,?,yes,yes,yes,poor,no,no,ckd\n73,80,1.020,2,0,abnormal,abnormal,notpresent,notpresent,253,142,4.6,138,5.8,10.5,33,7200,4.3,yes,yes,yes,good,no,no,ckd\n59,100,?,?,?,?,?,notpresent,notpresent,?,96,6.4,?,?,6.6,?,?,?,yes,yes,no,good,no,yes,ckd\n67,90,1.020,1,0,?,abnormal,present,notpresent,141,66,3.2,138,6.6,?,?,?,?,yes,no,no,good,no,no,ckd\n67,80,1.010,1,3,normal,abnormal,notpresent,notpresent,182,391,32.0,163,39.0,?,?,?,?,no,no,no,good,yes,no,ckd\n15,60,1.020,3,0,?,normal,notpresent,notpresent,86,15,0.6,138,4.0,11.0,33,7700,3.8,yes,yes,no,good,no,no,ckd\n46,70,1.015,1,0,abnormal,normal,notpresent,notpresent,150,111,6.1,131,3.7,7.5,27,?,?,no,no,no,good,no,yes,ckd\n55,80,1.010,0,0,?,normal,notpresent,notpresent,146,?,?,?,?,9.8,?,?,?,no,no,no,good,no,no,ckd\n44,90,1.010,1,0,?,normal,notpresent,notpresent,?,20,1.1,?,?,15.0,48,?,?,no,no,no,good,no,no,ckd\n67,70,1.020,2,0,abnormal,normal,notpresent,notpresent,150,55,1.6,131,4.8,?,?,?,?,yes,yes,no,good,yes,no,ckd\n45,80,1.020,3,0,normal,abnormal,notpresent,notpresent,425,?,?,?,?,?,?,?,?,no,no,no,poor,no,no,ckd\n65,70,1.010,2,0,?,normal,present,notpresent,112,73,3.3,?,?,10.9,37,?,?,no,no,no,good,no,no,ckd\n26,70,1.015,0,4,?,normal,notpresent,notpresent,250,20,1.1,?,?,15.6,52,6900,6.0,no,yes,no,good,no,no,ckd\n61,80,1.015,0,4,?,normal,notpresent,notpresent,360,19,0.7,137,4.4,15.2,44,8300,5.2,yes,yes,no,good,no,no,ckd\n46,60,1.010,1,0,normal,normal,notpresent,notpresent,163,92,3.3,141,4.0,9.8,28,14600,3.2,yes,yes,no,good,no,no,ckd\n64,90,1.010,3,3,?,abnormal,present,notpresent,?,35,1.3,?,?,10.3,?,?,?,yes,yes,no,good,yes,no,ckd\n?,100,1.015,2,0,abnormal,abnormal,notpresent,notpresent,129,107,6.7,132,4.4,4.8,14,6300,?,yes,no,no,good,yes,yes,ckd\n56,90,1.015,2,0,abnormal,abnormal,notpresent,notpresent,129,107,6.7,131,4.8,9.1,29,6400,3.4,yes,no,no,good,no,no,ckd\n5,?,1.015,1,0,?,normal,notpresent,notpresent,?,16,0.7,138,3.2,8.1,?,?,?,no,no,no,good,no,yes,ckd\n48,80,1.005,4,0,abnormal,abnormal,notpresent,present,133,139,8.5,132,5.5,10.3,36,6200,4,no,yes,no,good,yes,no,ckd\n67,70,1.010,1,0,?,normal,notpresent,notpresent,102,48,3.2,137,5.0,11.9,34,7100,3.7,yes,yes,no,good,yes,no,ckd\n70,80,?,?,?,?,?,notpresent,notpresent,158,85,3.2,141,3.5,10.1,30,?,?,yes,no,no,good,yes,no,ckd\n56,80,1.010,1,0,?,normal,notpresent,notpresent,165,55,1.8,?,?,13.5,40,11800,5.0,yes,yes,no,poor,yes,no,ckd\n74,80,1.010,0,0,?,normal,notpresent,notpresent,132,98,2.8,133,5.0,10.8,31,9400,3.8,yes,yes,no,good,no,no,ckd\n45,90,?,?,?,?,?,notpresent,notpresent,360,45,2.4,128,4.4,8.3,29,5500,3.7,yes,yes,no,good,no,no,ckd\n38,70,?,?,?,?,?,notpresent,notpresent,104,77,1.9,140,3.9,?,?,?,?,yes,no,no,poor,yes,no,ckd\n48,70,1.015,1,0,normal,normal,notpresent,notpresent,127,19,1.0,134,3.6,?,?,?,?,yes,yes,no,good,no,no,ckd\n59,70,1.010,3,0,normal,abnormal,notpresent,notpresent,76,186,15,135,7.6,7.1,22,3800,2.1,yes,no,no,poor,yes,yes,ckd\n70,70,1.015,2,?,?,?,notpresent,notpresent,?,46,1.5,?,?,9.9,?,?,?,no,yes,no,poor,yes,no,ckd\n56,80,?,?,?,?,?,notpresent,notpresent,415,37,1.9,?,?,?,?,?,?,no,yes,no,good,no,no,ckd\n70,100,1.005,1,0,normal,abnormal,present,notpresent,169,47,2.9,?,?,11.1,32,5800,5,yes,yes,no,poor,no,no,ckd\n58,110,1.010,4,0,?,normal,notpresent,notpresent,251,52,2.2,?,?,?,?,13200,4.7,yes,yes,no,good,no,no,ckd\n50,70,1.020,0,0,?,normal,notpresent,notpresent,109,32,1.4,139,4.7,?,?,?,?,no,no,no,poor,no,no,ckd\n63,100,1.010,2,2,normal,normal,notpresent,present,280,35,3.2,143,3.5,13.0,40,9800,4.2,yes,no,yes,good,no,no,ckd\n56,70,1.015,4,1,abnormal,normal,notpresent,notpresent,210,26,1.7,136,3.8,16.1,52,12500,5.6,no,no,no,good,no,no,ckd\n71,70,1.010,3,0,normal,abnormal,present,present,219,82,3.6,133,4.4,10.4,33,5600,3.6,yes,yes,yes,good,no,no,ckd\n73,100,1.010,3,2,abnormal,abnormal,present,notpresent,295,90,5.6,140,2.9,9.2,30,7000,3.2,yes,yes,yes,poor,no,no,ckd\n65,70,1.010,0,0,?,normal,notpresent,notpresent,93,66,1.6,137,4.5,11.6,36,11900,3.9,no,yes,no,good,no,no,ckd\n62,90,1.015,1,0,?,normal,notpresent,notpresent,94,25,1.1,131,3.7,?,?,?,?,yes,no,no,good,yes,yes,ckd\n60,80,1.010,1,1,?,normal,notpresent,notpresent,172,32,2.7,?,?,11.2,36,?,?,no,yes,yes,poor,no,no,ckd\n65,60,1.015,1,0,?,normal,notpresent,notpresent,91,51,2.2,132,3.8,10.0,32,9100,4.0,yes,yes,no,poor,yes,no,ckd\n50,140,?,?,?,?,?,notpresent,notpresent,101,106,6.5,135,4.3,6.2,18,5800,2.3,yes,yes,no,poor,no,yes,ckd\n56,180,?,0,4,?,abnormal,notpresent,notpresent,298,24,1.2,139,3.9,11.2,32,10400,4.2,yes,yes,no,poor,yes,no,ckd\n34,70,1.015,4,0,abnormal,abnormal,notpresent,notpresent,153,22,0.9,133,3.8,?,?,?,?,no,no,no,good,yes,no,ckd\n71,90,1.015,2,0,?,abnormal,present,present,88,80,4.4,139,5.7,11.3,33,10700,3.9,no,no,no,good,no,no,ckd\n17,60,1.010,0,0,?,normal,notpresent,notpresent,92,32,2.1,141,4.2,13.9,52,7000,?,no,no,no,good,no,no,ckd\n76,70,1.015,2,0,normal,abnormal,present,notpresent,226,217,10.2,?,?,10.2,36,12700,4.2,yes,no,no,poor,yes,yes,ckd\n55,90,?,?,?,?,?,notpresent,notpresent,143,88,2.0,?,?,?,?,?,?,yes,yes,no,poor,yes,no,ckd\n65,80,1.015,0,0,?,normal,notpresent,notpresent,115,32,11.5,139,4.0,14.1,42,6800,5.2,no,no,no,good,no,no,ckd\n50,90,?,?,?,?,?,notpresent,notpresent,89,118,6.1,127,4.4,6.0,17,6500,?,yes,yes,no,good,yes,yes,ckd\n55,100,1.015,1,4,normal,?,notpresent,notpresent,297,53,2.8,139,4.5,11.2,34,13600,4.4,yes,yes,no,good,no,no,ckd\n45,80,1.015,0,0,?,abnormal,notpresent,notpresent,107,15,1.0,141,4.2,11.8,37,10200,4.2,no,no,no,good,no,no,ckd\n54,70,?,?,?,?,?,notpresent,notpresent,233,50.1,1.9,?,?,11.7,?,?,?,no,yes,no,good,no,no,ckd\n63,90,1.015,0,0,?,normal,notpresent,notpresent,123,19,2.0,142,3.8,11.7,34,11400,4.7,no,no,no,good,no,no,ckd\n65,80,1.010,3,3,?,normal,notpresent,notpresent,294,71,4.4,128,5.4,10.0,32,9000,3.9,yes,yes,yes,good,no,no,ckd\n?,60,1.015,3,0,abnormal,abnormal,notpresent,notpresent,?,34,1.2,?,?,10.8,33,?,?,no,no,no,good,no,no,ckd\n61,90,1.015,0,2,?,normal,notpresent,notpresent,?,?,?,?,?,?,?,9800,?,no,yes,no,poor,no,yes,ckd\n12,60,1.015,3,0,abnormal,abnormal,present,notpresent,?,51,1.8,?,?,12.1,?,10300,?,no,no,no,good,no,no,ckd\n47,80,1.010,0,0,?,abnormal,notpresent,notpresent,?,28,0.9,?,?,12.4,44,5600,4.3,no,no,no,good,no,yes,ckd\n?,70,1.015,4,0,abnormal,normal,notpresent,notpresent,104,16,0.5,?,?,?,?,?,?,no,no,no,good,yes,no,ckd\n?,70,1.020,0,0,?,?,notpresent,notpresent,219,36,1.3,139,3.7,12.5,37,9800,4.4,no,no,no,good,no,no,ckd\n55,70,1.010,3,0,?,normal,notpresent,notpresent,99,25,1.2,?,?,11.4,?,?,?,no,no,no,poor,yes,no,ckd\n60,70,1.010,0,0,?,normal,notpresent,notpresent,140,27,1.2,?,?,?,?,?,?,no,no,no,good,no,no,ckd\n72,90,1.025,1,3,?,normal,notpresent,notpresent,323,40,2.2,137,5.3,12.6,?,?,?,no,yes,yes,poor,no,no,ckd\n54,60,?,3,?,?,?,notpresent,notpresent,125,21,1.3,137,3.4,15.0,46,?,?,yes,yes,no,good,yes,no,ckd\n34,70,?,?,?,?,?,notpresent,notpresent,?,219,12.2,130,3.8,6.0,?,?,?,yes,no,no,good,no,yes,ckd\n43,80,1.015,2,3,?,abnormal,present,present,?,30,1.1,?,?,14.0,42,14900,?,no,no,no,good,no,no,ckd\n65,100,1.015,0,0,?,normal,notpresent,notpresent,90,98,2.5,?,?,9.1,28,5500,3.6,yes,no,no,good,no,no,ckd\n72,90,?,?,?,?,?,notpresent,notpresent,308,36,2.5,131,4.3,?,?,?,?,yes,yes,no,poor,no,no,ckd\n70,90,1.015,0,0,?,normal,notpresent,notpresent,144,125,4.0,136,4.6,12.0,37,8200,4.5,yes,yes,no,poor,yes,no,ckd\n71,60,1.015,4,0,normal,normal,notpresent,notpresent,118,125,5.3,136,4.9,11.4,35,15200,4.3,yes,yes,no,poor,yes,no,ckd\n52,90,1.015,4,3,normal,abnormal,notpresent,notpresent,224,166,5.6,133,47,8.1,23,5000,2.9,yes,yes,no,good,no,yes,ckd\n75,70,1.025,1,0,?,normal,notpresent,notpresent,158,49,1.4,135,4.7,11.1,?,?,?,yes,no,no,poor,yes,no,ckd\n50,90,1.010,2,0,normal,abnormal,present,present,128,208,9.2,134,4.8,8.2,22,16300,2.7,no,no,no,poor,yes,yes,ckd\n5,50,1.010,0,0,?,normal,notpresent,notpresent,?,25,0.6,?,?,11.8,36,12400,?,no,no,no,good,no,no,ckd\n50,?,?,?,?,normal,?,notpresent,notpresent,219,176,13.8,136,4.5,8.6,24,13200,2.7,yes,no,no,good,yes,yes,ckd\n70,100,1.015,4,0,normal,normal,notpresent,notpresent,118,125,5.3,136,4.9,12.0,37,8400,8.0,yes,no,no,good,no,no,ckd\n47,100,1.010,?,?,normal,?,notpresent,notpresent,122,?,16.9,138,5.2,10.8,33,10200,3.8,no,yes,no,good,no,no,ckd\n48,80,1.015,0,2,?,normal,notpresent,notpresent,214,24,1.3,140,4.0,13.2,39,?,?,no,yes,no,poor,no,no,ckd\n46,90,1.020,?,?,?,normal,notpresent,notpresent,213,68,2.8,146,6.3,9.3,?,?,?,yes,yes,no,good,no,no,ckd\n45,60,1.010,2,0,normal,abnormal,present,notpresent,268,86,4.0,134,5.1,10.0,29,9200,?,yes,yes,no,good,no,no,ckd\n73,?,1.010,1,0,?,?,notpresent,notpresent,95,51,1.6,142,3.5,?,?,?,?,no,no,no,good,no,no,ckd\n41,70,1.015,2,0,?,abnormal,notpresent,present,?,68,2.8,132,4.1,11.1,33,?,?,yes,no,no,good,yes,yes,ckd\n69,70,1.010,0,4,?,normal,notpresent,notpresent,256,40,1.2,142,5.6,?,?,?,?,no,no,no,good,no,no,ckd\n67,70,1.010,1,0,normal,normal,notpresent,notpresent,?,106,6.0,137,4.9,6.1,19,6500,?,yes,no,no,good,no,yes,ckd\n72,90,?,?,?,?,?,notpresent,notpresent,84,145,7.1,135,5.3,?,?,?,?,no,yes,no,good,no,no,ckd\n41,80,1.015,1,4,abnormal,normal,notpresent,notpresent,210,165,18.0,135,4.7,?,?,?,?,no,yes,no,good,no,no,ckd\n60,90,1.010,2,0,abnormal,normal,notpresent,notpresent,105,53,2.3,136,5.2,11.1,33,10500,4.1,no,no,no,good,no,no,ckd\n57,90,1.015,5,0,abnormal,abnormal,notpresent,present,?,322,13.0,126,4.8,8.0,24,4200,3.3,yes,yes,yes,poor,yes,yes,ckd\n53,100,1.010,1,3,abnormal,normal,notpresent,notpresent,213,23,1.0,139,4,?,?,?,?,no,yes,no,good,no,no,ckd\n60,60,1.010,3,1,normal,abnormal,present,notpresent,288,36,1.7,130,3.0,7.9,25,15200,3.0,yes,no,no,poor,no,yes,ckd\n69,60,?,?,?,?,?,notpresent,notpresent,171,26,48.1,?,?,?,?,?,?,yes,no,no,poor,no,no,ckd\n65,70,1.020,1,0,abnormal,abnormal,notpresent,notpresent,139,29,1.0,?,?,10.5,32,?,?,yes,no,no,good,yes,no,ckd\n8,60,1.025,3,0,normal,normal,notpresent,notpresent,78,27,0.9,?,?,12.3,41,6700,?,no,no,no,poor,yes,no,ckd\n76,90,?,?,?,?,?,notpresent,notpresent,172,46,1.7,141,5.5,9.6,30,?,?,yes,yes,no,good,no,yes,ckd\n39,70,1.010,0,0,?,normal,notpresent,notpresent,121,20,0.8,133,3.5,10.9,32,?,?,no,yes,no,good,no,no,ckd\n55,90,1.010,2,1,abnormal,abnormal,notpresent,notpresent,273,235,14.2,132,3.4,8.3,22,14600,2.9,yes,yes,no,poor,yes,yes,ckd\n56,90,1.005,4,3,abnormal,abnormal,notpresent,notpresent,242,132,16.4,140,4.2,8.4,26,?,3,yes,yes,no,poor,yes,yes,ckd\n50,70,1.020,3,0,abnormal,normal,present,present,123,40,1.8,?,?,11.1,36,4700,?,no,no,no,good,no,no,ckd\n66,90,1.015,2,0,?,normal,notpresent,present,153,76,3.3,?,?,?,?,?,?,no,no,no,poor,no,no,ckd\n62,70,1.025,3,0,normal,abnormal,notpresent,notpresent,122,42,1.7,136,4.7,12.6,39,7900,3.9,yes,yes,no,good,no,no,ckd\n71,60,1.020,3,2,normal,normal,present,notpresent,424,48,1.5,132,4.0,10.9,31,?,?,yes,yes,yes,good,no,no,ckd\n59,80,1.010,1,0,abnormal,normal,notpresent,notpresent,303,35,1.3,122,3.5,10.4,35,10900,4.3,no,yes,no,poor,no,no,ckd\n81,60,?,?,?,?,?,notpresent,notpresent,148,39,2.1,147,4.2,10.9,35,9400,2.4,yes,yes,yes,poor,yes,no,ckd\n62,?,1.015,3,0,abnormal,?,notpresent,notpresent,?,?,?,?,?,14.3,42,10200,4.8,yes,yes,no,good,no,no,ckd\n59,70,?,?,?,?,?,notpresent,notpresent,204,34,1.5,124,4.1,9.8,37,6000,?,no,yes,no,good,no,no,ckd\n46,80,1.010,0,0,?,normal,notpresent,notpresent,160,40,2,140,4.1,9.0,27,8100,3.2,yes,no,no,poor,no,yes,ckd\n14,?,1.015,0,0,?,?,notpresent,notpresent,192,15,0.8,137,4.2,14.3,40,9500,5.4,no,yes,no,poor,yes,no,ckd\n60,80,1.020,0,2,?,?,notpresent,notpresent,?,?,?,?,?,?,?,?,?,no,yes,no,good,no,no,ckd\n27,60,?,?,?,?,?,notpresent,notpresent,76,44,3.9,127,4.3,?,?,?,?,no,no,no,poor,yes,yes,ckd\n34,70,1.020,0,0,abnormal,normal,notpresent,notpresent,139,19,0.9,?,?,12.7,42,2200,?,no,no,no,poor,no,no,ckd\n65,70,1.015,4,4,?,normal,present,notpresent,307,28,1.5,?,?,11.0,39,6700,?,yes,yes,no,good,no,no,ckd\n?,70,1.010,0,2,?,normal,notpresent,notpresent,220,68,2.8,?,?,8.7,27,?,?,yes,yes,no,good,no,yes,ckd\n66,70,1.015,2,5,?,normal,notpresent,notpresent,447,41,1.7,131,3.9,12.5,33,9600,4.4,yes,yes,no,good,no,no,ckd\n83,70,1.020,3,0,normal,normal,notpresent,notpresent,102,60,2.6,115,5.7,8.7,26,12800,3.1,yes,no,no,poor,no,yes,ckd\n62,80,1.010,1,2,?,?,notpresent,notpresent,309,113,2.9,130,2.5,10.6,34,12800,4.9,no,no,no,good,no,no,ckd\n17,70,1.015,1,0,abnormal,normal,notpresent,notpresent,22,1.5,7.3,145,2.8,13.1,41,11200,?,no,no,no,good,no,no,ckd\n54,70,?,?,?,?,?,notpresent,notpresent,111,146,7.5,141,4.7,11.0,35,8600,4.6,no,no,no,good,no,no,ckd\n60,50,1.010,0,0,?,normal,notpresent,notpresent,261,58,2.2,113,3.0,?,?,4200,3.4,yes,no,no,good,no,no,ckd\n21,90,1.010,4,0,normal,abnormal,present,present,107,40,1.7,125,3.5,8.3,23,12400,3.9,no,no,no,good,no,yes,ckd\n65,80,1.015,2,1,normal,normal,present,notpresent,215,133,2.5,?,?,13.2,41,?,?,no,yes,no,good,no,no,ckd\n42,90,1.020,2,0,abnormal,abnormal,present,notpresent,93,153,2.7,139,4.3,9.8,34,9800,?,no,no,no,poor,yes,yes,ckd\n72,90,1.010,2,0,?,abnormal,present,notpresent,124,53,2.3,?,?,11.9,39,?,?,no,no,no,good,no,no,ckd\n73,90,1.010,1,4,abnormal,abnormal,present,notpresent,234,56,1.9,?,?,10.3,28,?,?,no,yes,no,good,no,no,ckd\n45,70,1.025,2,0,normal,abnormal,present,notpresent,117,52,2.2,136,3.8,10.0,30,19100,3.7,no,no,no,good,no,no,ckd\n61,80,1.020,0,0,?,normal,notpresent,notpresent,131,23,0.8,140,4.1,11.3,35,?,?,no,no,no,good,no,no,ckd\n30,70,1.015,0,0,?,normal,notpresent,notpresent,101,106,6.5,135,4.3,?,?,?,?,no,no,no,poor,no,no,ckd\n54,60,1.015,3,2,?,abnormal,notpresent,notpresent,352,137,3.3,133,4.5,11.3,31,5800,3.6,yes,yes,yes,poor,yes,no,ckd\n4,?,1.020,1,0,?,normal,notpresent,notpresent,99,23,0.6,138,4.4,12,34,?,?,no,no,no,good,no,no,ckd\n8,50,1.020,4,0,normal,normal,notpresent,notpresent,?,46,1.0,135,3.8,?,?,?,?,no,no,no,good,yes,no,ckd\n3,?,1.010,2,0,normal,normal,notpresent,notpresent,?,22,0.7,?,?,10.7,34,12300,?,no,no,no,good,no,no,ckd\n8,?,?,?,?,?,?,notpresent,notpresent,80,66,2.5,142,3.6,12.2,38,?,?,no,no,no,good,no,no,ckd\n64,60,1.010,4,1,abnormal,abnormal,notpresent,present,239,58,4.3,137,5.4,9.5,29,7500,3.4,yes,yes,no,poor,yes,no,ckd\n6,60,1.010,4,0,abnormal,abnormal,notpresent,present,94,67,1.0,135,4.9,9.9,30,16700,4.8,no,no,no,poor,no,no,ckd\n?,70,1.010,3,0,normal,normal,notpresent,notpresent,110,115,6.0,134,2.7,9.1,26,9200,3.4,yes,yes,no,poor,no,no,ckd\n46,110,1.015,0,0,?,normal,notpresent,notpresent,130,16,0.9,?,?,?,?,?,?,no,no,no,good,no,no,ckd\n32,90,1.025,1,0,abnormal,abnormal,notpresent,notpresent,?,223,18.1,113,6.5,5.5,15,2600,2.8,yes,yes,no,poor,yes,yes,ckd\n80,70,1.010,2,?,?,abnormal,notpresent,notpresent,?,49,1.2,?,?,?,?,?,?,yes,yes,no,good,no,no,ckd\n70,90,1.020,2,1,abnormal,abnormal,notpresent,present,184,98.6,3.3,138,3.9,5.8,?,?,?,yes,yes,yes,poor,no,no,ckd\n49,100,1.010,3,0,abnormal,abnormal,notpresent,notpresent,129,158,11.8,122,3.2,8.1,24,9600,3.5,yes,yes,no,poor,yes,yes,ckd\n57,80,?,?,?,?,?,notpresent,notpresent,?,111,9.3,124,5.3,6.8,?,4300,3.0,yes,yes,no,good,no,yes,ckd\n59,100,1.020,4,2,normal,normal,notpresent,notpresent,252,40,3.2,137,4.7,11.2,30,26400,3.9,yes,yes,no,poor,yes,no,ckd\n65,80,1.015,0,0,?,normal,notpresent,notpresent,92,37,1.5,140,5.2,8.8,25,10700,3.2,yes,no,yes,good,yes,no,ckd\n90,90,1.025,1,0,?,normal,notpresent,notpresent,139,89,3.0,140,4.1,12.0,37,7900,3.9,yes,yes,no,good,no,no,ckd\n64,70,?,?,?,?,?,notpresent,notpresent,113,94,7.3,137,4.3,7.9,21,?,?,yes,yes,yes,good,yes,yes,ckd\n78,60,?,?,?,?,?,notpresent,notpresent,114,74,2.9,135,5.9,8.0,24,?,?,no,yes,no,good,no,yes,ckd\n?,90,?,?,?,?,?,notpresent,notpresent,207,80,6.8,142,5.5,8.5,?,?,?,yes,yes,no,good,no,yes,ckd\n65,90,1.010,4,2,normal,normal,notpresent,notpresent,172,82,13.5,145,6.3,8.8,31,?,?,yes,yes,no,good,yes,yes,ckd\n61,70,?,?,?,?,?,notpresent,notpresent,100,28,2.1,?,?,12.6,43,?,?,yes,yes,no,good,no,no,ckd\n60,70,1.010,1,0,?,normal,notpresent,notpresent,109,96,3.9,135,4.0,13.8,41,?,?,yes,no,no,good,no,no,ckd\n50,70,1.010,0,0,?,normal,notpresent,notpresent,230,50,2.2,?,?,12,41,10400,4.6,yes,yes,no,good,no,no,ckd\n67,80,?,?,?,?,?,notpresent,notpresent,341,37,1.5,?,?,12.3,41,6900,4.9,yes,yes,no,good,no,yes,ckd\n19,70,1.020,0,0,?,normal,notpresent,notpresent,?,?,?,?,?,11.5,?,6900,?,no,no,no,good,no,no,ckd\n59,100,1.015,4,2,normal,normal,notpresent,notpresent,255,132,12.8,135,5.7,7.3,20,9800,3.9,yes,yes,yes,good,no,yes,ckd\n54,120,1.015,0,0,?,normal,notpresent,notpresent,103,18,1.2,?,?,?,?,?,?,no,no,no,good,no,no,ckd\n40,70,1.015,3,4,normal,normal,notpresent,notpresent,253,150,11.9,132,5.6,10.9,31,8800,3.4,yes,yes,no,poor,yes,no,ckd\n55,80,1.010,3,1,normal,abnormal,present,present,214,73,3.9,137,4.9,10.9,34,7400,3.7,yes,yes,no,good,yes,no,ckd\n68,80,1.015,0,0,?,abnormal,notpresent,notpresent,171,30,1.0,?,?,13.7,43,4900,5.2,no,yes,no,good,no,no,ckd\n2,?,1.010,3,0,normal,abnormal,notpresent,notpresent,?,?,?,?,?,?,?,?,?,no,no,no,good,yes,no,ckd\n64,70,1.010,0,0,?,normal,notpresent,notpresent,107,15,?,?,?,12.8,38,?,?,no,no,no,good,no,no,ckd\n63,100,1.010,1,0,?,normal,notpresent,notpresent,78,61,1.8,141,4.4,12.2,36,10500,4.3,no,yes,no,good,no,no,ckd\n33,90,1.015,0,0,?,normal,notpresent,notpresent,92,19,0.8,?,?,11.8,34,7000,?,no,no,no,good,no,no,ckd\n68,90,1.010,0,0,?,normal,notpresent,notpresent,238,57,2.5,?,?,9.8,28,8000,3.3,yes,yes,no,poor,no,no,ckd\n36,80,1.010,0,0,?,normal,notpresent,notpresent,103,?,?,?,?,11.9,36,8800,?,no,no,no,good,no,no,ckd\n66,70,1.020,1,0,normal,?,notpresent,notpresent,248,30,1.7,138,5.3,?,?,?,?,yes,yes,no,good,no,no,ckd\n74,60,?,?,?,?,?,notpresent,notpresent,108,68,1.8,?,?,?,?,?,?,yes,yes,no,good,no,no,ckd\n71,90,1.010,0,3,?,normal,notpresent,notpresent,303,30,1.3,136,4.1,13.0,38,9200,4.6,yes,yes,no,good,no,no,ckd\n34,60,1.020,0,0,?,normal,notpresent,notpresent,117,28,2.2,138,3.8,?,?,?,?,no,no,no,good,yes,no,ckd\n60,90,1.010,3,5,abnormal,normal,notpresent,present,490,95,2.7,131,3.8,11.5,35,12000,4.5,yes,yes,no,good,no,no,ckd\n64,100,1.015,4,2,abnormal,abnormal,notpresent,present,163,54,7.2,140,4.6,7.9,26,7500,3.4,yes,yes,no,good,yes,no,ckd\n57,80,1.015,0,0,?,normal,notpresent,notpresent,120,48,1.6,?,?,11.3,36,7200,3.8,yes,yes,no,good,no,no,ckd\n60,70,?,?,?,?,?,notpresent,notpresent,124,52,2.5,?,?,?,?,?,?,yes,no,no,good,no,no,ckd\n59,50,1.010,3,0,normal,abnormal,notpresent,notpresent,241,191,12.0,114,2.9,9.6,31,15700,3.8,no,yes,no,good,yes,no,ckd\n65,60,1.010,2,0,normal,abnormal,present,notpresent,192,17,1.7,130,4.3,?,?,9500,?,yes,yes,no,poor,no,no,ckd\n60,90,?,?,?,?,?,notpresent,notpresent,269,51,2.8,138,3.7,11.5,35,?,?,yes,yes,yes,good,yes,no,ckd\n50,90,1.015,1,0,abnormal,abnormal,notpresent,notpresent,?,?,?,?,?,?,?,?,?,no,no,no,good,yes,no,ckd\n51,100,1.015,2,0,normal,normal,notpresent,present,93,20,1.6,146,4.5,?,?,?,?,no,no,no,poor,no,no,ckd\n37,100,1.010,0,0,abnormal,normal,notpresent,notpresent,?,19,1.3,?,?,15.0,44,4100,5.2,yes,no,no,good,no,no,ckd\n45,70,1.010,2,0,?,normal,notpresent,notpresent,113,93,2.3,?,?,7.9,26,5700,?,no,no,yes,good,no,yes,ckd\n65,80,?,?,?,?,?,notpresent,notpresent,74,66,2.0,136,5.4,9.1,25,?,?,yes,yes,yes,good,yes,no,ckd\n80,70,1.015,2,2,?,normal,notpresent,notpresent,141,53,2.2,?,?,12.7,40,9600,?,yes,yes,no,poor,yes,no,ckd\n72,100,?,?,?,?,?,notpresent,notpresent,201,241,13.4,127,4.8,9.4,28,?,?,yes,yes,no,good,no,yes,ckd\n34,90,1.015,2,0,normal,normal,notpresent,notpresent,104,50,1.6,137,4.1,11.9,39,?,?,no,no,no,good,no,no,ckd\n65,70,1.015,1,0,?,normal,notpresent,notpresent,203,46,1.4,?,?,11.4,36,5000,4.1,yes,yes,no,poor,yes,no,ckd\n57,70,1.015,1,0,?,abnormal,notpresent,notpresent,165,45,1.5,140,3.3,10.4,31,4200,3.9,no,no,no,good,no,no,ckd\n69,70,1.010,4,3,normal,abnormal,present,present,214,96,6.3,120,3.9,9.4,28,11500,3.3,yes,yes,yes,good,yes,yes,ckd\n62,90,1.020,2,1,?,normal,notpresent,notpresent,169,48,2.4,138,2.9,13.4,47,11000,6.1,yes,no,no,good,no,no,ckd\n64,90,1.015,3,2,?,abnormal,present,notpresent,463,64,2.8,135,4.1,12.2,40,9800,4.6,yes,yes,no,good,no,yes,ckd\n48,100,?,?,?,?,?,notpresent,notpresent,103,79,5.3,135,6.3,6.3,19,7200,2.6,yes,no,yes,poor,no,no,ckd\n48,110,1.015,3,0,abnormal,normal,present,notpresent,106,215,15.2,120,5.7,8.6,26,5000,2.5,yes,no,yes,good,no,yes,ckd\n54,90,1.025,1,0,normal,abnormal,notpresent,notpresent,150,18,1.2,140,4.2,?,?,?,?,no,no,no,poor,yes,yes,ckd\n59,70,1.010,1,3,abnormal,abnormal,notpresent,notpresent,424,55,1.7,138,4.5,12.6,37,10200,4.1,yes,yes,yes,good,no,no,ckd\n56,90,1.010,4,1,normal,abnormal,present,notpresent,176,309,13.3,124,6.5,3.1,9,5400,2.1,yes,yes,no,poor,yes,yes,ckd\n40,80,1.025,0,0,normal,normal,notpresent,notpresent,140,10,1.2,135,5.0,15.0,48,10400,4.5,no,no,no,good,no,no,notckd\n23,80,1.025,0,0,normal,normal,notpresent,notpresent,70,36,1.0,150,4.6,17.0,52,9800,5.0,no,no,no,good,no,no,notckd\n45,80,1.025,0,0,normal,normal,notpresent,notpresent,82,49,0.6,147,4.4,15.9,46,9100,4.7,no,no,no,good,no,no,notckd\n57,80,1.025,0,0,normal,normal,notpresent,notpresent,119,17,1.2,135,4.7,15.4,42,6200,6.2,no,no,no,good,no,no,notckd\n51,60,1.025,0,0,normal,normal,notpresent,notpresent,99,38,0.8,135,3.7,13.0,49,8300,5.2,no,no,no,good,no,no,notckd\n34,80,1.025,0,0,normal,normal,notpresent,notpresent,121,27,1.2,144,3.9,13.6,52,9200,6.3,no,no,no,good,no,no,notckd\n60,80,1.025,0,0,normal,normal,notpresent,notpresent,131,10,0.5,146,5.0,14.5,41,10700,5.1,no,no,no,good,no,no,notckd\n38,60,1.020,0,0,normal,normal,notpresent,notpresent,91,36,0.7,135,3.7,14.0,46,9100,5.8,no,no,no,good,no,no,notckd\n42,80,1.020,0,0,normal,normal,notpresent,notpresent,98,20,0.5,140,3.5,13.9,44,8400,5.5,no,no,no,good,no,no,notckd\n35,80,1.020,0,0,normal,normal,notpresent,notpresent,104,31,1.2,135,5.0,16.1,45,4300,5.2,no,no,no,good,no,no,notckd\n30,80,1.020,0,0,normal,normal,notpresent,notpresent,131,38,1.0,147,3.8,14.1,45,9400,5.3,no,no,no,good,no,no,notckd\n49,80,1.020,0,0,normal,normal,notpresent,notpresent,122,32,1.2,139,3.9,17.0,41,5600,4.9,no,no,no,good,no,no,notckd\n55,80,1.020,0,0,normal,normal,notpresent,notpresent,118,18,0.9,135,3.6,15.5,43,7200,5.4,no,no,no,good,no,no,notckd\n45,80,1.020,0,0,normal,normal,notpresent,notpresent,117,46,1.2,137,5.0,16.2,45,8600,5.2,no,no,no,good,no,no,notckd\n42,80,1.020,0,0,normal,normal,notpresent,notpresent,132,24,0.7,140,4.1,14.4,50,5000,4.5,no,no,no,good,no,no,notckd\n50,80,1.020,0,0,normal,normal,notpresent,notpresent,97,40,0.6,150,4.5,14.2,48,10500,5.0,no,no,no,good,no,no,notckd\n55,80,1.020,0,0,normal,normal,notpresent,notpresent,133,17,1.2,135,4.8,13.2,41,6800,5.3,no,no,no,good,no,no,notckd\n48,80,1.025,0,0,normal,normal,notpresent,notpresent,122,33,0.9,146,3.9,13.9,48,9500,4.8,no,no,no,good,no,no,notckd\n?,80,?,?,?,?,?,notpresent,notpresent,100,49,1.0,140,5.0,16.3,53,8500,4.9,no,no,no,good,no,no,notckd\n25,80,1.025,0,0,normal,normal,notpresent,notpresent,121,19,1.2,142,4.9,15.0,48,6900,5.3,no,no,no,good,no,no,notckd\n23,80,1.025,0,0,normal,normal,notpresent,notpresent,111,34,1.1,145,4.0,14.3,41,7200,5.0,no,no,no,good,no,no,notckd\n30,80,1.025,0,0,normal,normal,notpresent,notpresent,96,25,0.5,144,4.8,13.8,42,9000,4.5,no,no,no,good,no,no,notckd\n56,80,1.025,0,0,normal,normal,notpresent,notpresent,139,15,1.2,135,5.0,14.8,42,5600,5.5,no,no,no,good,no,no,notckd\n47,80,1.020,0,0,normal,normal,notpresent,notpresent,95,35,0.9,140,4.1,?,?,?,?,no,no,no,good,no,no,notckd\n19,80,1.020,0,0,normal,normal,notpresent,notpresent,107,23,0.7,141,4.2,14.4,44,?,?,no,no,no,good,no,no,notckd\n52,80,1.020,0,0,normal,normal,notpresent,notpresent,125,22,1.2,139,4.6,16.5,43,4700,4.6,no,no,no,good,no,no,notckd\n20,60,1.025,0,0,normal,normal,notpresent,notpresent,?,?,?,137,4.7,14.0,41,4500,5.5,no,no,no,good,no,no,notckd\n46,60,1.025,0,0,normal,normal,notpresent,notpresent,123,46,1.0,135,5.0,15.7,50,6300,4.8,no,no,no,good,no,no,notckd\n48,60,1.020,0,0,normal,normal,notpresent,notpresent,112,44,1.2,142,4.9,14.5,44,9400,6.4,no,no,no,good,no,no,notckd\n24,70,1.025,0,0,normal,normal,notpresent,notpresent,140,23,0.6,140,4.7,16.3,48,5800,5.6,no,no,no,good,no,no,notckd\n47,80,?,?,?,?,?,notpresent,notpresent,93,33,0.9,144,4.5,13.3,52,8100,5.2,no,no,no,good,no,no,notckd\n55,80,1.025,0,0,normal,normal,notpresent,notpresent,130,50,1.2,147,5,15.5,41,9100,6.0,no,no,no,good,no,no,notckd\n20,70,1.020,0,0,normal,normal,notpresent,notpresent,123,44,1.0,135,3.8,14.6,44,5500,4.8,no,no,no,good,no,no,notckd\n60,70,1.020,0,0,normal,normal,notpresent,notpresent,?,?,?,?,?,16.4,43,10800,5.7,no,no,no,good,no,no,notckd\n33,80,1.025,0,0,normal,normal,notpresent,notpresent,100,37,1.2,142,4.0,16.9,52,6700,6.0,no,no,no,good,no,no,notckd\n66,70,1.020,0,0,normal,normal,notpresent,notpresent,94,19,0.7,135,3.9,16.0,41,5300,5.9,no,no,no,good,no,no,notckd\n71,70,1.020,0,0,normal,normal,notpresent,notpresent,81,18,0.8,145,5.0,14.7,44,9800,6.0,no,no,no,good,no,no,notckd\n39,70,1.025,0,0,normal,normal,notpresent,notpresent,124,22,0.6,137,3.8,13.4,43,?,?,no,no,no,good,no,no,notckd\n56,70,1.025,0,0,normal,normal,notpresent,notpresent,70,46,1.2,135,4.9,15.9,50,11000,5.1,?,?,?,good,no,no,notckd\n42,70,1.020,0,0,normal,normal,notpresent,notpresent,93,32,0.9,143,4.7,16.6,43,7100,5.3,no,no,no,good,no,no,notckd\n54,70,1.020,0,0,?,?,?,?,76,28,0.6,146,3.5,14.8,52,8400,5.9,no,no,no,good,no,no,notckd\n47,80,1.025,0,0,normal,normal,notpresent,notpresent,124,44,1.0,140,4.9,14.9,41,7000,5.7,no,no,no,good,no,no,notckd\n30,80,1.020,0,0,normal,normal,notpresent,notpresent,89,42,0.5,139,5.0,16.7,52,10200,5.0,no,no,no,good,no,no,notckd\n50,?,1.020,0,0,normal,normal,notpresent,notpresent,92,19,1.2,150,4.8,14.9,48,4700,5.4,no,no,no,good,no,no,notckd\n75,60,1.020,0,0,normal,normal,notpresent,notpresent,110,50,0.7,135,5.0,14.3,40,8300,5.8,no,no,no,?,?,?,notckd\n44,70,?,?,?,?,?,notpresent,notpresent,106,25,0.9,150,3.6,15.0,50,9600,6.5,no,no,no,good,no,no,notckd\n41,70,1.020,0,0,normal,normal,notpresent,notpresent,125,38,0.6,140,5.0,16.8,41,6300,5.9,no,no,no,good,no,no,notckd\n53,60,1.025,0,0,normal,normal,notpresent,notpresent,116,26,1.0,146,4.9,15.8,45,7700,5.2,?,?,?,good,no,no,notckd\n34,60,1.020,0,0,normal,normal,notpresent,notpresent,91,49,1.2,135,4.5,13.5,48,8600,4.9,no,no,no,good,no,no,notckd\n73,60,1.020,0,0,normal,normal,notpresent,notpresent,127,48,0.5,150,3.5,15.1,52,11000,4.7,no,no,no,good,no,no,notckd\n45,60,1.020,0,0,normal,normal,?,?,114,26,0.7,141,4.2,15.0,43,9200,5.8,no,no,no,good,no,no,notckd\n44,60,1.025,0,0,normal,normal,notpresent,notpresent,96,33,0.9,147,4.5,16.9,41,7200,5.0,no,no,no,good,no,no,notckd\n29,70,1.020,0,0,normal,normal,notpresent,notpresent,127,44,1.2,145,5.0,14.8,48,?,?,no,no,no,good,no,no,notckd\n55,70,1.020,0,0,normal,normal,notpresent,notpresent,107,26,1.1,?,?,17.0,50,6700,6.1,no,no,no,good,no,no,notckd\n33,80,1.025,0,0,normal,normal,notpresent,notpresent,128,38,0.6,135,3.9,13.1,45,6200,4.5,no,no,no,good,no,no,notckd\n41,80,1.020,0,0,normal,normal,notpresent,notpresent,122,25,0.8,138,5.0,17.1,41,9100,5.2,no,no,no,good,no,no,notckd\n52,80,1.020,0,0,normal,normal,notpresent,notpresent,128,30,1.2,140,4.5,15.2,52,4300,5.7,no,no,no,good,no,no,notckd\n47,60,1.020,0,0,normal,normal,notpresent,notpresent,137,17,0.5,150,3.5,13.6,44,7900,4.5,no,no,no,good,no,no,notckd\n43,80,1.025,0,0,normal,normal,notpresent,notpresent,81,46,0.6,135,4.9,13.9,48,6900,4.9,no,no,no,good,no,no,notckd\n51,60,1.020,0,0,?,?,notpresent,notpresent,129,25,1.2,139,5.0,17.2,40,8100,5.9,no,no,no,good,no,no,notckd\n46,60,1.020,0,0,normal,normal,notpresent,notpresent,102,27,0.7,142,4.9,13.2,44,11000,5.4,no,no,no,good,no,no,notckd\n56,60,1.025,0,0,normal,normal,notpresent,notpresent,132,18,1.1,147,4.7,13.7,45,7500,5.6,no,no,no,good,no,no,notckd\n80,70,1.020,0,0,normal,normal,notpresent,notpresent,?,?,?,135,4.1,15.3,48,6300,6.1,no,no,no,good,no,no,notckd\n55,80,1.020,0,0,normal,normal,notpresent,notpresent,104,28,0.9,142,4.8,17.3,52,8200,4.8,no,no,no,good,no,no,notckd\n39,70,1.025,0,0,normal,normal,notpresent,notpresent,131,46,0.6,145,5.0,15.6,41,9400,4.7,no,no,no,good,no,no,notckd\n44,70,1.025,0,0,normal,normal,notpresent,notpresent,?,?,?,?,?,13.8,48,7800,4.4,no,no,no,good,no,no,notckd\n35,?,1.020,0,0,normal,normal,?,?,99,30,0.5,135,4.9,15.4,48,5000,5.2,no,no,no,good,no,no,notckd\n58,70,1.020,0,0,normal,normal,notpresent,notpresent,102,48,1.2,139,4.3,15.0,40,8100,4.9,no,no,no,good,no,no,notckd\n61,70,1.025,0,0,normal,normal,notpresent,notpresent,120,29,0.7,137,3.5,17.4,52,7000,5.3,no,no,no,good,no,no,notckd\n30,60,1.020,0,0,normal,normal,notpresent,notpresent,138,15,1.1,135,4.4,?,?,?,?,no,no,no,good,no,no,notckd\n57,60,1.020,0,0,normal,normal,notpresent,notpresent,105,49,1.2,150,4.7,15.7,44,10400,6.2,no,no,no,good,no,no,notckd\n65,60,1.020,0,0,normal,normal,notpresent,notpresent,109,39,1.0,144,3.5,13.9,48,9600,4.8,no,no,no,good,no,no,notckd\n70,60,?,?,?,?,?,notpresent,notpresent,120,40,0.5,140,4.6,16.0,43,4500,4.9,no,no,no,good,no,no,notckd\n43,80,1.025,0,0,normal,normal,notpresent,notpresent,130,30,1.1,143,5.0,15.9,45,7800,4.5,no,no,no,good,no,no,notckd\n40,80,1.020,0,0,normal,normal,notpresent,notpresent,119,15,0.7,150,4.9,?,?,?,?,no,no,no,good,no,no,notckd\n58,80,1.020,0,0,normal,normal,notpresent,notpresent,100,50,1.2,140,3.5,14.0,50,6700,6.5,no,no,no,good,no,no,notckd\n47,60,1.020,0,0,normal,normal,notpresent,notpresent,109,25,1.1,141,4.7,15.8,41,8300,5.2,no,no,no,good,no,no,notckd\n30,60,1.025,0,0,normal,normal,notpresent,notpresent,120,31,0.8,150,4.6,13.4,44,10700,5.8,no,no,no,good,no,no,notckd\n28,70,1.020,0,0,normal,normal,?,?,131,29,0.6,145,4.9,?,45,8600,6.5,no,no,no,good,no,no,notckd\n33,60,1.025,0,0,normal,normal,notpresent,notpresent,80,25,0.9,146,3.5,14.1,48,7800,5.1,no,no,no,good,no,no,notckd\n43,80,1.020,0,0,normal,normal,notpresent,notpresent,114,32,1.1,135,3.9,?,42,?,?,no,no,no,good,no,no,notckd\n59,70,1.025,0,0,normal,normal,notpresent,notpresent,130,39,0.7,147,4.7,13.5,46,6700,4.5,no,no,no,good,no,no,notckd\n34,70,1.025,0,0,normal,normal,notpresent,notpresent,?,33,1,150,5.0,15.3,44,10500,6.1,no,no,no,good,no,no,notckd\n23,80,1.020,0,0,normal,normal,notpresent,notpresent,99,46,1.2,142,4.0,17.7,46,4300,5.5,no,no,no,good,no,no,notckd\n24,80,1.025,0,0,normal,normal,notpresent,notpresent,125,?,?,136,3.5,15.4,43,5600,4.5,no,no,no,good,no,no,notckd\n60,60,1.020,0,0,normal,normal,notpresent,notpresent,134,45,0.5,139,4.8,14.2,48,10700,5.6,no,no,no,good,no,no,notckd\n25,60,1.020,0,0,normal,normal,notpresent,notpresent,119,27,0.5,?,?,15.2,40,9200,5.2,no,no,no,good,no,no,notckd\n44,70,1.025,0,0,normal,normal,notpresent,notpresent,92,40,0.9,141,4.9,14.0,52,7500,6.2,no,no,no,good,no,no,notckd\n62,80,1.020,0,0,normal,normal,notpresent,notpresent,132,34,0.8,147,3.5,17.8,44,4700,4.5,no,no,no,good,no,no,notckd\n25,70,1.020,0,0,normal,normal,notpresent,notpresent,88,42,0.5,136,3.5,13.3,48,7000,4.9,no,no,no,good,no,no,notckd\n32,70,1.025,0,0,normal,normal,notpresent,notpresent,100,29,1.1,142,4.5,14.3,43,6700,5.9,no,no,no,good,no,no,notckd\n63,70,1.025,0,0,normal,normal,notpresent,notpresent,130,37,0.9,150,5.0,13.4,41,7300,4.7,no,no,no,good,no,no,notckd\n44,60,1.020,0,0,normal,normal,notpresent,notpresent,95,46,0.5,138,4.2,15.0,50,7700,6.3,no,no,no,good,no,no,notckd\n37,60,1.025,0,0,normal,normal,notpresent,notpresent,111,35,0.8,135,4.1,16.2,50,5500,5.7,no,no,no,good,no,no,notckd\n64,60,1.020,0,0,normal,normal,notpresent,notpresent,106,27,0.7,150,3.3,14.4,42,8100,4.7,no,no,no,good,no,no,notckd\n22,60,1.025,0,0,normal,normal,notpresent,notpresent,97,18,1.2,138,4.3,13.5,42,7900,6.4,no,no,no,good,no,no,notckd\n33,60,?,?,?,normal,normal,notpresent,notpresent,130,41,0.9,141,4.4,15.5,52,4300,5.8,no,no,no,good,no,no,notckd\n43,60,1.025,0,0,normal,normal,notpresent,notpresent,108,25,1.0,144,5.0,17.8,43,7200,5.5,no,no,no,good,no,no,notckd\n38,80,1.020,0,0,normal,normal,notpresent,notpresent,99,19,0.5,147,3.5,13.6,44,7300,6.4,no,no,no,good,no,no,notckd\n35,70,1.025,0,0,?,?,notpresent,notpresent,82,36,1.1,150,3.5,14.5,52,9400,6.1,no,no,no,good,no,no,notckd\n65,70,1.025,0,0,?,?,notpresent,notpresent,85,20,1.0,142,4.8,16.1,43,9600,4.5,no,no,no,good,no,no,notckd\n29,80,1.020,0,0,normal,normal,notpresent,notpresent,83,49,0.9,139,3.3,17.5,40,9900,4.7,no,no,no,good,no,no,notckd\n37,60,1.020,0,0,normal,normal,notpresent,notpresent,109,47,1.1,141,4.9,15.0,48,7000,5.2,no,no,no,good,no,no,notckd\n39,60,1.020,0,0,normal,normal,notpresent,notpresent,86,37,0.6,150,5.0,13.6,51,5800,4.5,no,no,no,good,no,no,notckd\n32,60,1.025,0,0,normal,normal,notpresent,notpresent,102,17,0.4,147,4.7,14.6,41,6800,5.1,no,no,no,good,no,no,notckd\n23,60,1.020,0,0,normal,normal,notpresent,notpresent,95,24,0.8,145,5.0,15,52,6300,4.6,no,no,no,good,no,no,notckd\n34,70,1.025,0,0,normal,normal,notpresent,notpresent,87,38,0.5,144,4.8,17.1,47,7400,6.1,no,no,no,good,no,no,notckd\n66,70,1.025,0,0,normal,normal,notpresent,notpresent,107,16,1.1,140,3.6,13.6,42,11000,4.9,no,no,no,good,no,no,notckd\n47,60,1.020,0,0,normal,normal,notpresent,notpresent,117,22,1.2,138,3.5,13,45,5200,5.6,no,no,no,good,no,no,notckd\n74,60,1.020,0,0,normal,normal,notpresent,notpresent,88,50,0.6,147,3.7,17.2,53,6000,4.5,no,no,no,good,no,no,notckd\n35,60,1.025,0,0,normal,normal,notpresent,notpresent,105,39,0.5,135,3.9,14.7,43,5800,6.2,no,no,no,good,no,no,notckd\n29,80,1.020,0,0,normal,normal,notpresent,notpresent,70,16,0.7,138,3.5,13.7,54,5400,5.8,no,no,no,good,no,no,notckd\n33,80,1.025,0,0,normal,normal,notpresent,notpresent,89,19,1.1,144,5.0,15,40,10300,4.8,no,no,no,good,no,no,notckd\n67,80,1.025,0,0,normal,normal,notpresent,notpresent,99,40,0.5,?,?,17.8,44,5900,5.2,no,no,no,good,no,no,notckd\n73,80,1.025,0,0,normal,normal,notpresent,notpresent,118,44,0.7,137,3.5,14.8,45,9300,4.7,no,no,no,good,no,no,notckd\n24,80,1.020,0,0,normal,normal,notpresent,notpresent,93,46,1.0,145,3.5,?,?,10700,6.3,no,no,no,good,no,no,notckd\n60,80,1.025,0,0,normal,normal,notpresent,notpresent,81,15,0.5,141,3.6,15,46,10500,5.3,no,no,no,good,no,no,notckd\n68,60,1.025,0,0,normal,normal,notpresent,notpresent,125,41,1.1,139,3.8,17.4,50,6700,6.1,no,no,no,good,no,no,notckd\n30,80,1.025,0,0,normal,normal,notpresent,notpresent,82,42,0.7,146,5.0,14.9,45,9400,5.9,no,no,no,good,no,no,notckd\n75,70,1.020,0,0,normal,normal,notpresent,notpresent,107,48,0.8,144,3.5,13.6,46,10300,4.8,no,no,no,good,no,no,notckd\n69,70,1.020,0,0,normal,normal,notpresent,notpresent,83,42,1.2,139,3.7,16.2,50,9300,5.4,no,no,no,good,no,no,notckd\n28,60,1.025,0,0,normal,normal,notpresent,notpresent,79,50,0.5,145,5.0,17.6,51,6500,5.0,no,no,no,good,no,no,notckd\n72,60,1.020,0,0,normal,normal,notpresent,notpresent,109,26,0.9,150,4.9,15,52,10500,5.5,no,no,no,good,no,no,notckd\n61,70,1.025,0,0,normal,normal,notpresent,notpresent,133,38,1.0,142,3.6,13.7,47,9200,4.9,no,no,no,good,no,no,notckd\n79,80,1.025,0,0,normal,normal,notpresent,notpresent,111,44,1.2,146,3.6,16.3,40,8000,6.4,no,no,no,good,no,no,notckd\n70,80,1.020,0,0,normal,normal,notpresent,notpresent,74,41,0.5,143,4.5,15.1,48,9700,5.6,no,no,no,good,no,no,notckd\n58,70,1.025,0,0,normal,normal,notpresent,notpresent,88,16,1.1,147,3.5,16.4,53,9100,5.2,no,no,no,good,no,no,notckd\n64,70,1.020,0,0,normal,normal,notpresent,notpresent,97,27,0.7,145,4.8,13.8,49,6400,4.8,no,no,no,good,no,no,notckd\n71,60,1.025,0,0,normal,normal,notpresent,notpresent,?,?,0.9,140,4.8,15.2,42,7700,5.5,no,no,no,good,no,no,notckd\n62,80,1.025,0,0,normal,normal,notpresent,notpresent,78,45,0.6,138,3.5,16.1,50,5400,5.7,no,no,no,good,no,no,notckd\n59,60,1.020,0,0,normal,normal,notpresent,notpresent,113,23,1.1,139,3.5,15.3,54,6500,4.9,no,no,no,good,no,no,notckd\n71,70,1.025,0,0,?,?,notpresent,notpresent,79,47,0.5,142,4.8,16.6,40,5800,5.9,no,no,no,good,no,no,notckd\n48,80,1.025,0,0,normal,normal,notpresent,notpresent,75,22,0.8,137,5.0,16.8,51,6000,6.5,no,no,no,good,no,no,notckd\n80,80,1.025,0,0,normal,normal,notpresent,notpresent,119,46,0.7,141,4.9,13.9,49,5100,5.0,no,no,no,good,no,no,notckd\n57,60,1.020,0,0,normal,normal,notpresent,notpresent,132,18,1.1,150,4.7,15.4,42,11000,4.5,no,no,no,good,no,no,notckd\n63,70,1.020,0,0,normal,normal,notpresent,notpresent,113,25,0.6,146,4.9,16.5,52,8000,5.1,no,no,no,good,no,no,notckd\n46,70,1.025,0,0,normal,normal,notpresent,notpresent,100,47,0.5,142,3.5,16.4,43,5700,6.5,no,no,no,good,no,no,notckd\n15,80,1.025,0,0,normal,normal,notpresent,notpresent,93,17,0.9,136,3.9,16.7,50,6200,5.2,no,no,no,good,no,no,notckd\n51,80,1.020,0,0,normal,normal,notpresent,notpresent,94,15,1.2,144,3.7,15.5,46,9500,6.4,no,no,no,good,no,no,notckd\n41,80,1.025,0,0,normal,normal,notpresent,notpresent,112,48,0.7,140,5.0,17.0,52,7200,5.8,no,no,no,good,no,no,notckd\n52,80,1.025,0,0,normal,normal,notpresent,notpresent,99,25,0.8,135,3.7,15.0,52,6300,5.3,no,no,no,good,no,no,notckd\n36,80,1.025,0,0,normal,normal,notpresent,notpresent,85,16,1.1,142,4.1,15.6,44,5800,6.3,no,no,no,good,no,no,notckd\n57,80,1.020,0,0,normal,normal,notpresent,notpresent,133,48,1.2,147,4.3,14.8,46,6600,5.5,no,no,no,good,no,no,notckd\n43,60,1.025,0,0,normal,normal,notpresent,notpresent,117,45,0.7,141,4.4,13.0,54,7400,5.4,no,no,no,good,no,no,notckd\n50,80,1.020,0,0,normal,normal,notpresent,notpresent,137,46,0.8,139,5.0,14.1,45,9500,4.6,no,no,no,good,no,no,notckd\n55,80,1.020,0,0,normal,normal,notpresent,notpresent,140,49,0.5,150,4.9,15.7,47,6700,4.9,no,no,no,good,no,no,notckd\n42,70,1.025,0,0,normal,normal,notpresent,notpresent,75,31,1.2,141,3.5,16.5,54,7800,6.2,no,no,no,good,no,no,notckd\n12,80,1.020,0,0,normal,normal,notpresent,notpresent,100,26,0.6,137,4.4,15.8,49,6600,5.4,no,no,no,good,no,no,notckd\n17,60,1.025,0,0,normal,normal,notpresent,notpresent,114,50,1.0,135,4.9,14.2,51,7200,5.9,no,no,no,good,no,no,notckd\n58,80,1.025,0,0,normal,normal,notpresent,notpresent,131,18,1.1,141,3.5,15.8,53,6800,6.1,no,no,no,good,no,no,notckd"
  },
  {
    "path": "02_Python/data/concentric_circles.csv",
    "content": "-0.5964976874818628,-0.7767253221036915\n-0.08971783096451161,-0.4135830691211844\n-1.0007531618691181,-0.326171630582138\n-0.9537852659730824,0.247659193850729\n-0.29478237596151846,-0.10597967151189042\n1.0089481560222697,0.418957720062357\n0.4913625964913842,0.3053228383973465\n1.1302285078923262,0.2475452229338419\n-0.13401621257124116,-0.3393357143716329\n-0.08480068219467549,-1.0052906444497578\n0.3159956622497828,0.1779199816860224\n0.44592745119819,0.07941311252194524\n0.55141084722587,-0.092912256107955\n-0.7351642114185724,-0.8108332955247171\n-0.030738176707417533,0.48161576521627303\n0.5410349238313751,0.033695124259219965\n-1.1060408287508423,-0.27255600210143627\n-0.8956263215864325,0.37709460887577856\n-0.45964928055200543,0.1616316400651608\n0.009262750915371364,-0.43773882675143894\n0.3910802426496407,-0.19726120820081744\n0.7815012221940484,-0.16136742925025216\n-1.0270971274262792,-0.028474220990273923\n-0.41899604487741965,-0.1638446195071755\n-0.24642269568234043,-0.9553017329407091\n-0.49988661909323057,0.8331754388910466\n-0.3558967488795625,0.10153523372529666\n-0.3691681582398468,-0.16356514163042923\n0.1202655132497247,0.5782415257208986\n0.06398003327431977,0.9295584048122627\n0.5804526859080539,-0.7536050120698863\n-0.47493816473688405,-0.025411492163156135\n-0.1790931802506636,-0.4435894097293005\n0.08582982726129436,-0.9610098301536245\n0.18538265499310036,0.4860855499086707\n0.5118289545481801,0.06422381288573517\n0.10414435731385942,-0.9989307945723512\n-0.36078211845604335,1.0072705431661375\n-0.545950970561058,-0.2567776552090378\n0.7238655468576771,0.7138741120027197\n-0.3946860848013648,0.07717049429188888\n0.6563761573889337,0.9102517063066479\n0.1366023473712878,0.8890204155640026\n-0.9979590415306634,-0.5402916832715131\n0.25299835724956954,-0.34599960851692046\n-0.7610667244529692,-0.6399527971339043\n-0.12619623813797248,-0.5781290022909709\n-0.8178069994943656,-0.6191256879340781\n0.29553006673230825,0.3427415677139836\n-0.5477795142140935,-0.8767927249049886\n0.7213629978729259,-0.536989728087863\n-0.4507593309518629,0.11145869153814122\n0.1952445588609756,-0.9884100407758708\n0.7063123250175316,0.5586914764207283\n0.9129170548865992,-0.5958367919928296\n0.4488749284055041,0.2616957024297636\n-0.9706688189694048,0.39987899797844717\n0.6578777725336112,1.004053128789949\n-0.4332280182796834,-1.042707541332595\n-0.6504891111468709,0.686107163505586\n-0.11170205648412146,-0.4408229006486496\n0.48141993829924795,0.18940926442605527\n0.5248858040382582,-0.15017454449939022\n-0.061465232798958915,1.1137576078651625\n0.8367392324597515,-0.5585814975760535\n0.7448287927226515,0.5435130921961728\n0.2000979783210328,-0.9798946244457659\n0.6063713975209812,0.7190588629106595\n-0.05678078961418228,-0.510253261357331\n0.9744774522644813,0.22364494600299922\n0.24927550195138698,-0.43608772096308385\n-0.28959770048621103,1.0781095209794138\n0.9862784532417114,-0.5337967254343098\n-0.4372726966823024,0.022009318083580656\n0.12411031154595079,-0.4978154314297547\n0.10317571583411264,0.6526045903437112\n0.2692560713085656,-0.4880307405101292\n0.9528683766519546,0.0907861552790156\n0.6923293380065622,-0.6736495735496721\n0.587140424481366,0.9167332251670203\n-1.1381731344395067,0.19733227490651742\n0.3164238116845555,0.8831142643204528\n-0.38470904988845933,-0.07565126258314112\n-0.4209551654342268,0.09633814896530785\n0.6058233062239393,0.7222742509666764\n-0.9822375553819702,0.479848686635196\n-1.0137588150503813,-0.24707816765033172\n-0.40015177089465576,-0.3437911139051542\n-0.5001769347384208,0.07484154541380679\n-0.1661523906512215,-0.36618029053645834\n1.0687842432407153,-0.12561742627636227\n0.32747852947338496,-0.9771772898954294\n0.4590030820691221,-0.3732661528045094\n0.25000096690611257,0.5853758489631067\n-0.10949171844021163,1.0375147582493571\n-0.4855029243734636,0.21657429425570318\n0.348979997083154,-0.23865263012829943\n0.30349476828420124,-0.31591019453302843\n-0.37861337110059634,-0.46066147801010127\n-1.0017545284137161,-0.31120371930340923\n0.21827203823271743,-0.3664515071911094\n0.9686711936119857,0.21513796462072718\n-0.4661117462842649,-0.09263645544872756\n-0.33984954392972044,0.34503713697077915\n0.19235135031961606,0.42674918901938746\n0.2570628372716435,0.550305444709873\n-0.7224662156881066,0.7440598516202538\n0.36057555006083486,0.283869684976919\n-0.020384573728330843,-0.7714204011020536\n0.43933579781650234,-0.4213949416890632\n-0.05935728229103,-0.898753381438475\n-0.6002136044119903,-0.3175325920524773\n-0.1876241779645519,0.5197498776188059\n0.18598025117776068,-0.863719338762845\n-0.423484133875512,0.8977713732555921\n-0.7898523085367052,-0.6545754466869886\n0.9091424840509388,0.3726236062800244\n-0.2637749723453783,-0.9703202818605153\n-0.3956197431022276,0.24721208977531264\n-0.5730793763648695,0.7281329971156115\n-0.33984825379893147,-0.16468149625463055\n-0.1677635559056578,-0.2990687968486708\n0.4576355041516013,0.2510025643722984\n0.4672173742962245,0.10349739090048553\n0.3919274270658863,-1.0084682913664749\n-0.41476960763962006,0.11121071077072969\n0.4282746548536248,-0.10697831387323135\n0.40310612360387515,0.13567108826648516\n-0.05858015135127177,-0.49258139013277197\n-0.9626167759313159,-0.19916400306257787\n0.0156655208680778,0.37801833292557097\n-0.24607910731204297,-0.3234661205847393\n-0.2680191072811375,0.4014734054093518\n0.27275266141389765,-0.2328861391331067\n0.4769244377618038,0.0009522859115531652\n0.9717458527377411,0.04019585528297948\n0.3509633753454921,-0.536170328893512\n-0.15730674394730323,0.47257195665320934\n-0.09760535815243604,0.4978741058640103\n0.6036263728937201,-0.8437959492855501\n0.316647281171155,0.41989978455634847\n0.4005043818488322,-0.40541748139807793\n-0.04620338212244712,-0.5755162411736535\n0.213167370692542,-0.5047779918165176\n-0.9081287791540691,0.7037905853139147\n0.26134594290931873,0.4701321253033402\n-0.3126119574252444,-0.3575243983351418\n-0.39781412797910154,-0.11803093804446368\n0.3897055500068163,-0.4557066160796452\n-0.48604807281046836,0.30269352393954313\n-0.749357695690378,-0.5681559328275477\n-0.43091355963766415,0.1430603978569948\n-0.019664062301775656,0.6434900809067136\n-0.2571387284601371,-0.3362912780679074\n-0.5678246506820418,-0.24604661733240835\n0.8899939951221372,0.18258110263769775\n0.05075157555567561,-1.0820815877434384\n-0.2805571670393938,-0.5057049913634942\n0.42486877167208104,-0.094905881732696\n0.3930646469292933,0.8944231579612191\n0.19249069684523606,0.47221175548741345\n0.5785824436905204,0.0813604331474045\n0.4025461794311977,0.39389986689499046\n-0.6317328905794198,-0.81417649525151\n1.102953614812882,-0.1761260303069548\n-0.5663289738252122,-0.8620931558537943\n-0.4416663008557587,0.25716360727572757\n-0.5155428282199412,-0.3625053664480704\n1.0253811125979453,-0.25521594681668247\n0.27769644295832824,0.9315126674235171\n0.7573827658180695,-0.31474887443301863\n-0.4587273511301044,-0.1470075377867423\n0.34471165652890495,-0.18265328435081077\n0.29775582814488394,-0.3472810679911276\n0.21096672354207704,0.4077306270142454\n-0.5876090300538764,0.13102029401723095\n-0.9960167510070388,0.6126492016759321\n-0.22904500148506568,0.4317187957718132\n0.36211298552602067,-0.09146105612235811\n-0.9759797736569765,-0.6165126801293732\n0.18142699007496443,-0.518454072884067\n0.7857601408503241,0.6590730394272838\n-0.5118524062072036,0.10231234837063125\n0.06599484755864332,-0.9125759026163084\n0.8905604212056506,-0.5469216044165577\n-1.0285660669633698,0.38607245890985104\n-0.5619980578074139,0.7403474763779649\n0.33727174069865873,1.034876900997665\n0.27407525143463646,0.43601825634185387\n-0.45153438664053497,0.8280552293609089\n0.8362826762619205,0.45387596341030667\n-0.09418894804075939,0.9535681648429286\n-0.2567700566463323,-0.8804012691517964\n-0.28583391730490926,0.9426055544264509\n-0.03362960069823995,-0.539572247822683\n-0.1037396267786264,0.5555998131741026\n-0.9643872823243382,0.09610789050122792\n0.36935644279403274,-0.8966699917883852\n0.7458729821179275,0.6813533807089754\n-0.14184876992059392,-0.521841743327658\n0.33124588576040126,-0.138824920968453\n0.08714760688175001,-0.4271728521417989\n-1.0513327390854184,0.46256749072516434\n0.5893479236921118,-0.1888678232691976\n0.5788759716250035,-0.8394426920734803\n-0.933013963683661,-0.29516537272808596\n0.5086535007198805,-0.2866537554607676\n-0.9692668534942654,0.5061975161175142\n-0.5328276291971281,0.7823323040239676\n-0.9217136388307866,0.1313735785117146\n-0.40406979191385334,0.43544178585219023\n-0.4067151868802853,0.7510362977905335\n-0.9864635306519217,0.3351121080246421\n-0.5703947860590478,0.013757261500273864\n-0.4914901197991216,-0.1777077120513563\n0.8398814680746901,0.5037361278542494\n0.6247357443776939,-0.9334887951112227\n-0.9679679505416116,0.33188952062028787\n0.6597678450335809,0.7060169788661986\n-0.41774059704133504,0.24000335168294215\n-0.2990377820128566,-0.21834637911706878\n0.9952566385074013,0.1622244753255163\n-0.31801170723338895,1.0851331583932677\n-0.404789709953823,-0.09766326580278245\n-0.65930601466402,-0.6521360918614213\n0.43930167891835864,-0.3312296991560522\n1.0192668930014706,0.04913791098874962\n-0.39016644469512596,-0.8087585201768581\n-0.054280868816785496,-1.0613630874053348\n-0.9067189155663109,-0.1495186893957394\n0.16770942232908803,0.421212515380306\n-1.0433434750672557,0.059239035159299666\n0.05943445131492384,0.44107676307083143\n0.21995573932921547,0.9847478839856044\n-0.7142018812095754,0.6063878003170229\n-0.10711663183668428,0.43512605585549874\n-0.46471275367378034,-0.12545421888003633\n0.5176545513497237,-0.1064930040659019\n0.9399135330027256,0.32454439984258054\n0.683160107329799,-0.5592643021963657\n-0.37982618308760857,0.02630168606580701\n-0.4403066016512578,-0.7453305296283443\n-0.8639562036024161,-0.370936217392039\n-0.3634000255796373,1.104352634471847\n-0.46607356497433305,-0.1722494722701516\n-0.4324598729439077,-0.8699876605440724\n-0.3774077725478204,0.30914189336576425\n0.7734372069892316,0.2126214006502542\n-0.13488509934689247,0.4750222281829011\n-0.34249805037156467,0.4290934314330419\n-0.332515953703242,0.3904095238684516\n-0.18711507147399783,0.37818245612669205\n-0.4019065222365251,-0.8607542537347073\n0.01967962163007076,0.42646328114491683\n0.9123223570962696,0.3749234799832767\n-0.4725381478653645,-0.04061092659388703\n-0.3571488674533796,0.9236370006691802\n0.2718048441307173,0.2681838841791901\n-0.09747869604231205,-1.0836761914072832\n-0.3057913976217668,0.9734109653290065\n0.525975939041422,-0.08321922050604946\n0.2873901067762959,0.9258478095787808\n0.4028154951214911,0.1619649367551107\n0.6471527617590014,0.6628246827636484\n-0.7725197585233375,0.7782705134127221\n-0.9045113147434148,-0.3963862598362432\n0.9422239650251897,-0.27402422465437165\n-0.38879376217565664,0.059404418448781734\n0.4135308925034162,0.4501152781307004\n0.5219130527521878,0.18290729812635734\n0.35931058358283424,-0.8471774455005006\n0.24999409274952142,-0.40947045397879017\n0.04454591655329928,-0.5829355092516588\n-0.2749947213249698,-0.927127176304089\n0.0677065524328374,0.9607337302048053\n0.4520474622174612,0.21077530105548747\n-0.9398328695851624,-0.12988746634568155\n-0.6752052494581422,-0.651108717126316\n-0.012752712672613242,-0.9888034777044296\n0.5127656905014132,0.2788167777635829\n-0.16699205027770447,-0.5250330614574951\n-0.24112330289771242,0.4696207184731173\n-0.9212717067922636,-0.35419100911564644\n0.3862515964351605,-0.34651072962454665\n-0.004559508002486494,-0.4862064394921664\n0.05540232679339348,-0.9439978458646662\n0.531235669394689,0.7945564092051391\n-0.7010409881475659,0.719973547975449\n0.4086785410051035,-0.003349117800603839\n-0.5182302424020724,0.25535541613341994\n0.877825258441639,0.435693144768315\n-0.8865533022790029,0.5131520719700442\n0.7986219954013896,0.6186270534897585\n-0.4159693822164605,0.31657348656229833\n-0.37672654218865165,-0.9141975842433028\n0.91825997932632,-0.5692031204525406\n0.010303545861572443,0.5405485427851331\n-0.6274983068834641,-0.775859559178861\n0.17912205697364092,-0.4237461791404885\n0.9070690752725555,-0.20810135894992557\n0.08047424124721375,0.5733388318623391\n-0.7292621719209866,-0.21959643577361823\n0.32454447530762026,0.8304783537522029\n-0.5621289684177577,-0.7235474587528163\n0.7082286072961878,-0.8456155885063508\n0.9097484056293046,-0.24813285645094338\n0.7899791730245955,0.530457252401472\n0.4581955037177326,0.7315444405239956\n0.11464385320627396,-0.5175396756868441\n-0.9353893973410421,0.27628354644257086\n0.3730261429230154,-0.1719549471647861\n0.32328003835713637,0.42790636232819146\n-0.6581860171733552,-0.8080437436134085\n0.5299407558465055,-0.6511610280889729\n-0.01767216944854167,0.49836725053362124\n-0.23723462403256948,0.2385651117522939\n-1.0306202034264922,-0.030358549900346834\n-0.07427602907772096,0.5057801294718551\n0.9658886186344339,-0.1839696011214987\n0.6524566748559094,-0.7463230761245332\n-0.8958305228582344,-0.4193900064310585\n-0.5351916698730456,0.0018277533908535593\n0.2886836982346829,0.9057451623940046\n-0.9711288858464331,0.27741656197299347\n-0.1265236778507134,0.48247458130257326\n0.868677952225601,-0.515283200869523\n0.9116914963370987,-0.17686561745308463\n-0.8249415977199243,-0.47619561182185166\n-0.8678043729736393,0.5245609563222245\n0.9152206727793272,-0.3294459297468073\n0.5209136973922057,0.7618202457129495\n0.9175370420434311,0.6846402480732732\n-0.3318933784802655,-0.5429127369198464\n-0.3228050279983245,0.1817119207035938\n0.5806661325943425,0.1535613686262304\n-0.6943891334062174,0.597514978864269\n-0.14836274653434273,0.5777969183018764\n-0.3120514163005832,0.3379697581578297\n-0.08324023048222384,0.5653358599299948\n-0.6236139459944454,0.07707285088061441\n-0.19474229933008502,-0.2723791117035379\n-1.0964018834918035,0.0967731555623242\n-0.951619025627734,0.48208628116311153\n-0.5626316341485967,1.0356783881386273\n0.675732690007578,0.6864249981232644\n-0.78445480859867,0.590694952753727\n0.9096737174266027,0.38707302357336526\n0.2493042082972942,0.4362248498898234\n0.5339441839754818,0.126350925359421\n-0.4336279856956844,-0.20492740568525525\n0.06241758635639284,0.9982531502526226\n-0.8505739829885182,-0.5017513963251689\n0.4896373743616472,0.350139843675366\n0.401510474123803,0.47861919472424885\n0.6453930091429755,-0.8101629753960268\n0.2518801313265028,0.5152407999403616\n0.5198978625764599,0.22445149043513254\n-0.13896993109704514,-0.893762541311697\n-0.6839988358343277,-0.8241429852318991\n0.6896844387094905,-0.9171322379582705\n-0.018058660850644837,1.0867317016844733\n0.9581115907421452,0.23778817034433947\n1.065657801944628,-0.18722839061195373\n0.7495087800261524,0.7995760727751848\n0.14372137077224806,-0.8071270326861059\n0.5892354504692613,0.2598664554414738\n-0.07648137942136227,0.4713983037922881\n-0.5691818485443167,-0.8165965052488681\n-0.27688349631108183,-0.4271076190843389\n0.4698491396101956,-0.37077746729934724\n-0.43790399443417716,-0.11429513818516232\n-0.3013400827440534,0.3719774658136155\n0.7189386973791765,-0.8036258954775898\n0.41943584834647274,0.16416772554216336\n-0.2845799164858944,0.48271914142248934\n0.30337356704512863,-0.4405959027701863\n-0.4774181049740365,-0.2673454698575085\n0.20668346056328746,0.4086024472369887\n0.24388509820161347,0.11046421900252626\n-0.1758616455348633,0.8792870342538996\n0.41988505470545995,-0.31725197260025073\n0.5991715166730222,-0.7565035606537661\n-0.12142656840001856,-0.3832162142878519\n-0.5053328354739859,0.12220563798005817\n-0.9282468297658448,0.34020463431837755\n0.4695417234865105,-0.08240363383411979\n-0.9906796771313714,0.162728970667304\n-0.41637581602841045,0.26962904740591637\n-0.32608250847081494,0.9388327313597491\n-0.27741441806790534,-0.4156100245429923\n0.5620502578944575,-0.3398182607095208\n-0.9677165384294093,-0.4097593595804705\n0.8760491982994245,0.30728819176785477\n0.33874400394256066,-0.11080312272967537\n-0.032591370236060145,-0.48960962419559045\n0.5794077310679605,0.11166579240349282\n0.5495025010357477,0.10967768230543753\n-0.3503683225271275,-0.44772871175210555\n-0.5126563264780427,0.4014364946560648\n-0.40354286770189296,-0.23659769418441168\n-0.0488900234410143,0.4633568811477356\n-0.2124726740194857,-0.6102569400116281\n-1.0752906953060168,-0.07312207172566837\n0.44519347123140507,-0.029585590821374366\n-0.060200066660610285,0.9491757015440506\n0.45646094809610366,0.21380764666888724\n0.4637140436592558,0.2830005033992875\n-0.3684272579472403,-0.38631238193555645\n-0.5150419868073974,-0.4286258424918744\n-0.43472384337514974,0.7504423308642552\n-0.027926225368791198,-0.5089185654417928\n-0.20513042151172778,0.9840881613578055\n0.8268141934656339,-0.11038501739416157\n-0.46401343324337047,-0.9360331411156992\n0.20765879585661853,-0.33090995097962844\n-0.7651959913656242,-0.7037637390432254\n0.1401349376450489,-0.5114466497102617\n-0.5353178168381143,0.7382200519882536\n-0.30523629117612544,0.4339327043127625\n0.41628092997373256,0.8685141498307223\n0.12321645158203892,-0.6063258433943441\n-0.10586854346569731,-0.9204866856447135\n-0.3745378552393598,-0.23181739721113465\n0.9637066660616821,-0.42631599699799066\n0.9818801171919108,-0.18415084527497516\n-0.020159176592507946,0.5602766622796881\n-0.37373516718842387,-0.08853553976848685\n-0.4595342416837214,-0.15044114371766792\n0.577150716527892,-0.6397292742310804\n-1.0008707962267067,-0.14102640298687985\n-0.7199330240264394,0.6707094264537493\n0.09752168857107471,1.0337724265318775\n0.9031862543748955,-0.2174087374572961\n0.9496104948805995,-0.5088741341628038\n0.6839024915739618,-0.830027794019837\n0.3070654338705196,0.4589870715747382\n0.338038132718353,-0.31671455404775434\n0.9320353071003498,0.1257405903483963\n0.23073184577919917,-0.40990188053269117\n-0.0003044099313824905,0.9845251910719187\n-1.013112119599334,0.15399018622981867\n-1.0254128024516875,-0.05499327719851769\n0.1420397850203173,-0.5252072546364881\n0.0911264181972598,0.4284227308623113\n-0.4368183745934743,0.3871929073031755\n-0.3605329257914988,1.0532310967332992\n-0.7623567559412663,0.7354803450367904\n0.39765601234676856,1.0114615999721448\n0.18157170282281765,-0.3839483951193683\n-1.1779001893768763,0.22327296489810827\n-0.18391953719060553,0.5167857590464651\n-0.9632344557440297,-0.37343380811848115\n0.2670959491447908,0.3790595922602033\n-0.9112900122985277,0.24629485415621138\n0.9241019792224805,0.6750741183861587\n-0.1956120492121439,-0.3499027312755772\n0.4763670007115128,-0.08396333549977225\n0.4206895212731797,-0.3231049077008083\n-0.3594419157539056,0.4550878671911299\n0.08610130516509465,-0.45808942166487476\n0.9648728817485887,0.13860067848607824\n-0.020437399285161216,-1.136283376691147\n-0.5396595581133179,0.24035569862360065\n0.5662426493589651,0.6564798189985738\n0.20836453864475565,-0.40737692438520123\n-0.28752937811597135,0.559923571402364\n0.31122343974358946,-0.355724807517385\n0.7684071371301983,-0.43193089634630927\n0.20070187814587984,0.37382805628115806\n0.00027185226382153704,0.8528153972653477\n0.9562680429733982,0.31346831031508715\n-0.34124021589525744,0.4072314477140854\n-0.25997755136074324,-0.8555280035698538\n-0.7330968809503283,0.6495754444986244\n0.43440270289056415,-0.7199606985122708\n0.13409839728638273,0.5674931249300522\n0.5691132069745215,-0.05845847383088684\n0.7564951986280338,-0.6306522452279231\n0.315420911805392,0.3738174074884045\n-0.2867713420568993,1.0129030395576466\n0.16666983671191557,0.44926914769117904\n-0.41265464327498813,-0.9106096634601865\n0.5030813809416231,-0.2875085762742861\n0.5569410527094143,0.19436995753984762\n-0.3084778073509184,-0.3645227992835511\n0.15962973259057123,0.9843509503234547\n-0.7482496427783087,-0.6309146006994942\n-0.19440524182522173,-0.44594696883704377\n0.44688684822993296,-0.8696062912082978\n0.30068848578127527,-0.505225205210269\n-0.4314698206294684,-0.43872354948581926\n0.35994679948944436,-0.9135646710489602\n0.5488171138655524,-0.8879203377898214\n-0.43768537054948076,-0.86167957463104\n-0.2564515462138911,0.42966463540871275\n0.4112435969277164,-0.8638497431076824\n0.9395797798902269,-0.3765851855738564\n-0.3821907430937799,0.12399385369073652\n-0.11635534184124138,-0.6091843066107713\n0.09525734089897758,0.933299460107712\n"
  },
  {
    "path": "02_Python/data/cron_jobs_schedule.csv",
    "content": "job_id,day,hour,capacity\n1,0,1,1\n2,0,1,1\n3,0,2,2\n4,0,3,2\n5,0,4,2\n6,0,4,2\n7,0,5,4\n8,0,7,4\n9,0,7,4\n10,0,8,2\n11,0,8,2\n12,0,8,2\n13,0,9,6\n14,0,10,1\n15,0,10,1\n16,0,11,2\n17,0,12,4\n18,0,13,1\n19,0,13,1\n20,0,13,4\n21,0,14,4\n22,0,14,4\n23,0,15,2\n24,0,15,2\n25,0,16,2\n26,0,16,2\n27,0,16,4\n28,0,16,2\n29,0,17,6\n30,0,18,2\n31,0,18,2\n32,0,18,2\n33,0,20,4\n34,0,20,4\n35,0,21,1\n36,0,21,1\n37,0,21,2\n38,0,22,4\n39,0,22,2\n40,0,22,2\n41,0,23,2\n42,0,23,2\n43,0,23,2\n44,1,1,6\n45,1,2,6\n46,1,2,2\n47,1,3,2\n48,1,4,6\n49,1,4,2\n50,1,5,4\n51,1,7,4\n52,1,7,4\n53,1,8,2\n54,1,8,2\n55,1,8,1\n56,1,8,1\n57,1,10,1\n58,1,10,1\n59,1,11,2\n60,1,12,4\n61,1,13,1\n62,1,13,1\n63,1,13,4\n64,1,14,4\n65,1,14,4\n66,1,15,2\n67,1,15,2\n68,1,16,1\n69,1,16,1\n70,1,16,4\n71,1,17,2\n72,1,17,6\n73,1,18,2\n74,1,18,2\n75,1,18,2\n76,1,20,1\n77,1,20,1\n78,1,21,1\n79,1,21,1\n80,1,21,2\n81,1,22,4\n82,1,22,2\n83,1,22,2\n84,1,23,2\n85,1,23,1\n86,1,23,1\n87,2,2,1\n88,2,2,1\n89,2,2,2\n90,2,3,2\n91,2,4,6\n92,2,4,2\n93,2,5,6\n94,2,7,2\n95,2,7,2\n96,2,8,1\n97,2,8,1\n98,2,8,4\n99,2,8,4\n100,2,10,2\n101,2,10,2\n102,2,11,2\n103,2,12,4\n104,2,13,1\n105,2,13,1\n106,2,13,4\n107,2,14,4\n108,2,14,4\n109,2,15,2\n110,2,15,2\n111,2,16,2\n112,2,16,2\n113,2,16,2\n114,2,17,2\n115,2,17,4\n116,2,18,2\n117,2,18,2\n118,2,18,2\n119,2,20,2\n120,2,20,2\n121,2,21,1\n122,2,21,1\n123,2,21,2\n124,2,22,2\n125,2,22,1\n126,2,22,1\n127,2,22,2\n128,2,23,2\n129,2,23,2\n130,3,0,6\n131,3,2,6\n132,3,2,2\n133,3,3,6\n134,3,4,2\n135,3,4,6\n136,3,5,4\n137,3,7,4\n138,3,7,4\n139,3,8,2\n140,3,8,2\n141,3,8,1\n142,3,8,1\n143,3,10,2\n144,3,10,2\n145,3,11,6\n146,3,12,6\n147,3,13,1\n148,3,13,1\n149,3,13,6\n150,3,14,4\n151,3,14,4\n152,3,15,2\n153,3,15,2\n154,3,16,2\n155,3,16,1\n156,3,16,2\n157,3,16,1\n158,3,17,6\n159,3,18,2\n160,3,18,2\n161,3,18,2\n162,3,20,4\n163,3,20,4\n164,3,21,1\n165,3,21,1\n166,3,21,2\n167,3,22,4\n168,3,22,2\n169,3,22,2\n170,3,23,1\n171,3,23,2\n172,3,23,1\n173,4,0,1\n174,4,0,1\n175,4,1,2\n176,4,3,2\n177,4,4,2\n178,4,4,2\n179,4,5,4\n180,4,7,4\n181,4,7,4\n182,4,8,2\n183,4,8,2\n184,4,8,1\n185,4,8,1\n186,4,10,1\n187,4,10,1\n188,4,11,2\n189,4,12,4\n190,4,13,1\n191,4,13,1\n192,4,13,6\n193,4,14,4\n194,4,14,4\n195,4,15,6\n196,4,15,2\n197,4,16,1\n198,4,16,1\n199,4,16,1\n200,4,16,1\n201,4,17,2\n202,4,18,2\n203,4,18,2\n204,4,18,2\n205,4,20,1\n206,4,20,2\n207,4,20,1\n208,4,21,2\n209,4,21,2\n210,4,22,4\n211,4,22,2\n212,4,22,2\n213,4,23,2\n214,4,23,4\n215,4,23,2"
  },
  {
    "path": "02_Python/data/graph.in",
    "content": "-----###E-\n-------#--\n--#-#--#--\n--#-##S#--\n--#--###--\n--#----#--\n--#---##--\n--#--##---\n--####----\n----------"
  },
  {
    "path": "02_Python/data/ipl.csv",
    "content": "one,two\n0.22767982399693698,0.8582041480574577\n0.9791882160551239,0.07715064988053028\n0.504576604695406,0.5531144137299899\n0.058132400743383585,0.52809798025712\n0.7753430178214513,0.2179216898195512\n0.5504238310550534,0.4708598154998745\n0.04578653961976978,0.9185789498889001\n0.5857699421693808,0.05803225463485838\n0.7090721735923948,0.5818736617699065\n0.018503930375096615,0.8865229185953829\n0.8860650735174704,0.2395640162180548\n0.6036387317795797,0.665583852216638\n0.06942298413661226,0.858127672145648\n0.6047387405995206,0.2781095847447219\n0.7589891224957259,0.5120267751911348\n0.08497507872469842,0.9911224601360906\n0.6442858551230015,0.10730211335716414\n0.6033125864818462,0.5364792610891768\n0.0356326816753208,0.5874738213240243\n0.6007179456626193,0.04656070021470395\n0.6434305051145501,0.46461982084514997\n0.005591057423835321,0.7325276954580224\n0.6575004481350551,0.05025199077912135\n0.6119056619160002,0.4952656410930785\n0.013445197916278915,0.5016854306552392\n0.7435273458440346,0.06386612295413036\n0.6464662016389027,0.7148365185160322\n0.2944081925357683,0.6986518421938682\n0.9202207766123844,0.22637577124261393\n0.6086795437566336,0.4786324767901295\n0.0017518581090074316,0.5717931915621521\n0.5077758503070033,0.2952284046764161\n0.7791374916271712,0.49180666903860926\n0.3078314950916783,0.8873374005146625\n0.7581289957252834,0.19708612067771564\n0.5486059364923573,0.5077936048016689\n0.07527233079788495,0.522245376009042\n0.5331128659173083,0.2143938721367786\n0.4675014929645063,0.5271035868712899\n0.18676781644394796,0.5070094980570479\n0.8420132419188935,0.21490523432247818\n0.642154431128747,0.6348127382396339\n0.052001937496261946,0.9359277170660035\n0.8148348297937917,0.16192163973622503\n0.6943799683926528,0.5570759898576467\n0.06508554149897222,0.9578825575349748\n0.526030561477054,0.11168162286789401\n0.5032780595784369,0.7508359873017096\n0.1434226030623043,0.6911550271957625\n0.8631445582912479,0.06988288031897169\n0.6640990534886784,0.7730624203184077\n0.09883778157876079,0.6261103580685701\n0.7099346165895388,0.17850561972937623\n0.6990012632919802,0.5981535368819337\n0.2836900068227715,0.800106866601715\n0.9350250628933433,0.16491007875502797\n0.5710043090859719,0.6327473536908004\n0.2188560796324386,0.9112905730514449\n0.6294583790577973,0.27098231721904953\n0.711909882692649,0.45341554453235267\n0.2132610762251217,0.673521946268582\n0.8092292788993549,0.29198518492616304\n0.6893207764833285,0.6687151469112381\n0.007126439690630053,0.9255992747515998\n0.5616420089530748,0.15084239574623537\n0.6222060261235629,0.5617219107848401\n0.25948656499836426,0.563451806372046\n0.5118871824449225,0.0005155650075597518\n0.4692706390762479,0.5100323609510921\n0.15755852023930098,0.7983291110557653\n0.704470781180232,0.26733186354144606\n0.5463181510428853,0.5171059613482747\n0.11119696467025533,0.8096091807601442\n0.5625437902157645,0.16666468289016856\n0.4915519993039712,0.6398784074491172\n0.16583790552093025,0.8614262570137948\n0.8337721936021407,0.027733937152207035\n0.5231896001098805,0.46037966005528497\n0.2650083577810597,0.5980176200194074\n0.5812853381010545,0.22865029666825695\n0.5221046626094096,0.7215891408793452\n0.060121371203491425,0.8400569038052936\n0.8711799609358672,0.11348520558105879\n0.5068205670603647,0.5525489511568009\n0.07123126486775308,0.610044742146314\n0.6862034914064209,0.23187687966148002\n0.775153374890182,0.5331614170965996\n"
  },
  {
    "path": "02_Python/data/iris.csv",
    "content": "5.1,3.5,1.4,0.2,Iris-setosa\n4.9,3.0,1.4,0.2,Iris-setosa\n4.7,3.2,1.3,0.2,Iris-setosa\n4.6,3.1,1.5,0.2,Iris-setosa\n5.0,3.6,1.4,0.2,Iris-setosa\n5.4,3.9,1.7,0.4,Iris-setosa\n4.6,3.4,1.4,0.3,Iris-setosa\n5.0,3.4,1.5,0.2,Iris-setosa\n4.4,2.9,1.4,0.2,Iris-setosa\n4.9,3.1,1.5,0.1,Iris-setosa\n5.4,3.7,1.5,0.2,Iris-setosa\n4.8,3.4,1.6,0.2,Iris-setosa\n4.8,3.0,1.4,0.1,Iris-setosa\n4.3,3.0,1.1,0.1,Iris-setosa\n5.8,4.0,1.2,0.2,Iris-setosa\n5.7,4.4,1.5,0.4,Iris-setosa\n5.4,3.9,1.3,0.4,Iris-setosa\n5.1,3.5,1.4,0.3,Iris-setosa\n5.7,3.8,1.7,0.3,Iris-setosa\n5.1,3.8,1.5,0.3,Iris-setosa\n5.4,3.4,1.7,0.2,Iris-setosa\n5.1,3.7,1.5,0.4,Iris-setosa\n4.6,3.6,1.0,0.2,Iris-setosa\n5.1,3.3,1.7,0.5,Iris-setosa\n4.8,3.4,1.9,0.2,Iris-setosa\n5.0,3.0,1.6,0.2,Iris-setosa\n5.0,3.4,1.6,0.4,Iris-setosa\n5.2,3.5,1.5,0.2,Iris-setosa\n5.2,3.4,1.4,0.2,Iris-setosa\n4.7,3.2,1.6,0.2,Iris-setosa\n4.8,3.1,1.6,0.2,Iris-setosa\n5.4,3.4,1.5,0.4,Iris-setosa\n5.2,4.1,1.5,0.1,Iris-setosa\n5.5,4.2,1.4,0.2,Iris-setosa\n4.9,3.1,1.5,0.1,Iris-setosa\n5.0,3.2,1.2,0.2,Iris-setosa\n5.5,3.5,1.3,0.2,Iris-setosa\n4.9,3.1,1.5,0.1,Iris-setosa\n4.4,3.0,1.3,0.2,Iris-setosa\n5.1,3.4,1.5,0.2,Iris-setosa\n5.0,3.5,1.3,0.3,Iris-setosa\n4.5,2.3,1.3,0.3,Iris-setosa\n4.4,3.2,1.3,0.2,Iris-setosa\n5.0,3.5,1.6,0.6,Iris-setosa\n5.1,3.8,1.9,0.4,Iris-setosa\n4.8,3.0,1.4,0.3,Iris-setosa\n5.1,3.8,1.6,0.2,Iris-setosa\n4.6,3.2,1.4,0.2,Iris-setosa\n5.3,3.7,1.5,0.2,Iris-setosa\n5.0,3.3,1.4,0.2,Iris-setosa\n7.0,3.2,4.7,1.4,Iris-versicolor\n6.4,3.2,4.5,1.5,Iris-versicolor\n6.9,3.1,4.9,1.5,Iris-versicolor\n5.5,2.3,4.0,1.3,Iris-versicolor\n6.5,2.8,4.6,1.5,Iris-versicolor\n5.7,2.8,4.5,1.3,Iris-versicolor\n6.3,3.3,4.7,1.6,Iris-versicolor\n4.9,2.4,3.3,1.0,Iris-versicolor\n6.6,2.9,4.6,1.3,Iris-versicolor\n5.2,2.7,3.9,1.4,Iris-versicolor\n5.0,2.0,3.5,1.0,Iris-versicolor\n5.9,3.0,4.2,1.5,Iris-versicolor\n6.0,2.2,4.0,1.0,Iris-versicolor\n6.1,2.9,4.7,1.4,Iris-versicolor\n5.6,2.9,3.6,1.3,Iris-versicolor\n6.7,3.1,4.4,1.4,Iris-versicolor\n5.6,3.0,4.5,1.5,Iris-versicolor\n5.8,2.7,4.1,1.0,Iris-versicolor\n6.2,2.2,4.5,1.5,Iris-versicolor\n5.6,2.5,3.9,1.1,Iris-versicolor\n5.9,3.2,4.8,1.8,Iris-versicolor\n6.1,2.8,4.0,1.3,Iris-versicolor\n6.3,2.5,4.9,1.5,Iris-versicolor\n6.1,2.8,4.7,1.2,Iris-versicolor\n6.4,2.9,4.3,1.3,Iris-versicolor\n6.6,3.0,4.4,1.4,Iris-versicolor\n6.8,2.8,4.8,1.4,Iris-versicolor\n6.7,3.0,5.0,1.7,Iris-versicolor\n6.0,2.9,4.5,1.5,Iris-versicolor\n5.7,2.6,3.5,1.0,Iris-versicolor\n5.5,2.4,3.8,1.1,Iris-versicolor\n5.5,2.4,3.7,1.0,Iris-versicolor\n5.8,2.7,3.9,1.2,Iris-versicolor\n6.0,2.7,5.1,1.6,Iris-versicolor\n5.4,3.0,4.5,1.5,Iris-versicolor\n6.0,3.4,4.5,1.6,Iris-versicolor\n6.7,3.1,4.7,1.5,Iris-versicolor\n6.3,2.3,4.4,1.3,Iris-versicolor\n5.6,3.0,4.1,1.3,Iris-versicolor\n5.5,2.5,4.0,1.3,Iris-versicolor\n5.5,2.6,4.4,1.2,Iris-versicolor\n6.1,3.0,4.6,1.4,Iris-versicolor\n5.8,2.6,4.0,1.2,Iris-versicolor\n5.0,2.3,3.3,1.0,Iris-versicolor\n5.6,2.7,4.2,1.3,Iris-versicolor\n5.7,3.0,4.2,1.2,Iris-versicolor\n5.7,2.9,4.2,1.3,Iris-versicolor\n6.2,2.9,4.3,1.3,Iris-versicolor\n5.1,2.5,3.0,1.1,Iris-versicolor\n5.7,2.8,4.1,1.3,Iris-versicolor\n\n"
  },
  {
    "path": "02_Python/data/logistic_regression_data.txt",
    "content": "0.051267,0.69956,1\n-0.092742,0.68494,1\n-0.21371,0.69225,1\n-0.375,0.50219,1\n-0.51325,0.46564,1\n-0.52477,0.2098,1\n-0.39804,0.034357,1\n-0.30588,-0.19225,1\n0.016705,-0.40424,1\n0.13191,-0.51389,1\n0.38537,-0.56506,1\n0.52938,-0.5212,1\n0.63882,-0.24342,1\n0.73675,-0.18494,1\n0.54666,0.48757,1\n0.322,0.5826,1\n0.16647,0.53874,1\n-0.046659,0.81652,1\n-0.17339,0.69956,1\n-0.47869,0.63377,1\n-0.60541,0.59722,1\n-0.62846,0.33406,1\n-0.59389,0.005117,1\n-0.42108,-0.27266,1\n-0.11578,-0.39693,1\n0.20104,-0.60161,1\n0.46601,-0.53582,1\n0.67339,-0.53582,1\n-0.13882,0.54605,1\n-0.29435,0.77997,1\n-0.26555,0.96272,1\n-0.16187,0.8019,1\n-0.17339,0.64839,1\n-0.28283,0.47295,1\n-0.36348,0.31213,1\n-0.30012,0.027047,1\n-0.23675,-0.21418,1\n-0.06394,-0.18494,1\n0.062788,-0.16301,1\n0.22984,-0.41155,1\n0.2932,-0.2288,1\n0.48329,-0.18494,1\n0.64459,-0.14108,1\n0.46025,0.012427,1\n0.6273,0.15863,1\n0.57546,0.26827,1\n0.72523,0.44371,1\n0.22408,0.52412,1\n0.44297,0.67032,1\n0.322,0.69225,1\n0.13767,0.57529,1\n-0.0063364,0.39985,1\n-0.092742,0.55336,1\n-0.20795,0.35599,1\n-0.20795,0.17325,1\n-0.43836,0.21711,1\n-0.21947,-0.016813,1\n-0.13882,-0.27266,1\n0.18376,0.93348,0\n0.22408,0.77997,0\n0.29896,0.61915,0\n0.50634,0.75804,0\n0.61578,0.7288,0\n0.60426,0.59722,0\n0.76555,0.50219,0\n0.92684,0.3633,0\n0.82316,0.27558,0\n0.96141,0.085526,0\n0.93836,0.012427,0\n0.86348,-0.082602,0\n0.89804,-0.20687,0\n0.85196,-0.36769,0\n0.82892,-0.5212,0\n0.79435,-0.55775,0\n0.59274,-0.7405,0\n0.51786,-0.5943,0\n0.46601,-0.41886,0\n0.35081,-0.57968,0\n0.28744,-0.76974,0\n0.085829,-0.75512,0\n0.14919,-0.57968,0\n-0.13306,-0.4481,0\n-0.40956,-0.41155,0\n-0.39228,-0.25804,0\n-0.74366,-0.25804,0\n-0.69758,0.041667,0\n-0.75518,0.2902,0\n-0.69758,0.68494,0\n-0.4038,0.70687,0\n-0.38076,0.91886,0\n-0.50749,0.90424,0\n-0.54781,0.70687,0\n0.10311,0.77997,0\n0.057028,0.91886,0\n-0.10426,0.99196,0\n-0.081221,1.1089,0\n0.28744,1.087,0\n0.39689,0.82383,0\n0.63882,0.88962,0\n0.82316,0.66301,0\n0.67339,0.64108,0\n1.0709,0.10015,0\n-0.046659,-0.57968,0\n-0.23675,-0.63816,0\n-0.15035,-0.36769,0\n-0.49021,-0.3019,0\n-0.46717,-0.13377,0\n-0.28859,-0.060673,0\n-0.61118,-0.067982,0\n-0.66302,-0.21418,0\n-0.59965,-0.41886,0\n-0.72638,-0.082602,0\n-0.83007,0.31213,0\n-0.72062,0.53874,0\n-0.59389,0.49488,0\n-0.48445,0.99927,0\n-0.0063364,0.99927,0\n0.63265,-0.030612,0"
  },
  {
    "path": "02_Python/data/titanic-subset.csv",
    "content": "pclass,sex,embarked,survived\n1,female,S,1\n1,male,S,1\n2,female,S,0\n1,male,S,0\n2,female,S,0\n1,male,S,1\n1,female,S,1\n1,male,S,0\n1,female,S,1\n1,male,C,0\n1,male,C,0\n1,female,C,1\n1,female,C,1\n1,female,S,1\n1,male,S,0\n1,male,S,0\n1,male,C,0\n1,female,C,1\n1,female,C,1\n1,male,C,0\n1,male,S,0\n1,female,S,1\n1,male,C,1\n1,female,C,1\n1,female,S,1\n1,male,C,0\n1,male,C,1\n1,female,C,1\n1,female,S,1\n1,male,S,1\n2,male,S,0\n1,male,C,1\n1,female,S,1\n1,female,S,1\n2,male,S,0\n1,female,C,1\n2,female,S,0\n1,male,S,1\n1,male,S,0\n1,male,C,0\n1,male,C,0\n1,female,C,1\n1,female,S,1\n1,female,C,1\n1,female,C,1\n1,male,S,0\n2,male,S,0\n1,male,S,1\n2,female,C,0\n1,male,C,1\n1,female,C,1\n2,male,S,0\n1,male,S,0\n1,male,S,0\n1,male,S,1\n1,female,S,1\n1,male,S,1\n2,female,S,0\n2,male,S,0\n1,female,C,1\n2,male,S,0\n1,female,S,1\n1,male,S,0\n1,female,S,1\n1,male,S,1\n2,female,S,1\n1,female,C,1\n1,female,S,1\n1,male,C,0\n1,female,S,1\n2,male,S,0\n1,male,C,0\n1,female,C,1\n1,female,S,1\n1,male,S,0\n1,male,S,0\n1,female,C,1\n1,male,C,0\n1,female,C,1\n1,female,S,1\n1,male,S,0\n1,male,S,0\n1,female,S,1\n1,female,S,1\n1,male,C,0\n1,female,C,1\n1,male,S,1\n1,male,S,1\n1,female,S,1\n1,male,S,0\n1,female,S,1\n1,male,S,1\n1,female,S,1\n1,male,S,1\n1,male,S,1\n1,female,S,1\n1,male,C,0\n1,female,C,1\n1,female,C,1\n"
  },
  {
    "path": "02_Python/data/titanic.csv",
    "content": "pclass,sex,age,embarked,sibsp,parch,survived\n1,female,29,0,0,S,1\n1,male,0.9167,1,2,S,1\n1,female,2,1,2,S,0\n1,male,30,1,2,S,0\n1,female,25,1,2,S,0\n1,male,48,0,0,S,1\n1,female,63,1,0,S,1\n1,male,39,0,0,S,0\n1,female,53,2,0,S,1\n1,male,71,0,0,C,0\n1,male,47,1,0,C,0\n1,female,18,1,0,C,1\n1,female,24,0,0,C,1\n1,female,26,0,0,S,1\n1,male,80,0,0,S,1\n1,male,,0,0,S,0\n1,male,24,0,1,C,0\n1,female,50,0,1,C,1\n1,female,32,0,0,C,1\n1,male,36,0,0,C,0\n1,male,37,1,1,S,1\n1,female,47,1,1,S,1\n1,male,26,0,0,C,1\n1,female,42,0,0,C,1\n1,female,29,0,0,S,1\n1,male,25,0,0,C,0\n1,male,25,1,0,C,1\n1,female,19,1,0,C,1\n1,female,35,0,0,S,1\n1,male,28,0,0,S,1\n1,male,45,0,0,S,0\n1,male,40,0,0,C,1\n1,female,30,0,0,S,1\n1,female,58,0,0,S,1\n1,male,42,0,0,S,0\n1,female,45,0,0,C,1\n1,female,22,0,1,S,1\n1,male,,0,0,S,1\n1,male,41,0,0,S,0\n1,male,48,0,0,C,0\n1,male,,0,0,C,0\n1,female,44,0,0,C,1\n1,female,59,2,0,S,1\n1,female,60,0,0,C,1\n1,female,41,0,0,C,1\n1,male,45,0,0,S,0\n1,male,,0,0,S,0\n1,male,42,0,0,S,1\n1,female,53,0,0,C,1\n1,male,36,0,1,C,1\n1,female,58,0,1,C,1\n1,male,33,0,0,S,0\n1,male,28,0,0,S,0\n1,male,17,0,0,S,0\n1,male,11,1,2,S,1\n1,female,14,1,2,S,1\n1,male,36,1,2,S,1\n1,female,36,1,2,S,1\n1,male,49,0,0,S,0\n1,female,,0,0,C,1\n1,male,36,1,0,S,0\n1,female,76,1,0,S,1\n1,male,46,1,0,S,0\n1,female,47,1,0,S,1\n1,male,27,1,0,S,1\n1,female,33,1,0,S,1\n1,female,36,0,0,C,1\n1,female,30,0,0,S,1\n1,male,45,0,0,C,1\n1,female,,0,1,S,1\n1,male,,0,0,S,0\n1,male,27,1,0,C,0\n1,female,26,1,0,C,1\n1,female,22,0,0,S,1\n1,male,,0,0,S,0\n1,male,47,0,0,S,0\n1,female,39,1,1,C,1\n1,male,37,1,1,C,0\n1,female,64,0,2,C,1\n1,female,55,2,0,S,1\n1,male,,0,0,S,0\n1,male,70,1,1,S,0\n1,female,36,0,2,S,1\n1,female,64,1,1,S,1\n1,male,39,1,0,C,0\n1,female,38,1,0,C,1\n1,male,51,0,0,S,1\n1,male,27,0,0,S,1\n1,female,33,0,0,S,1\n1,male,31,1,0,S,0\n1,female,27,1,2,S,1\n1,male,31,1,0,S,1\n1,female,17,1,0,S,1\n1,male,53,1,1,S,1\n1,male,4,0,2,S,1\n1,female,54,1,1,S,1\n1,male,50,1,0,C,0\n1,female,27,1,1,C,1\n1,female,48,1,0,C,1\n1,female,48,1,0,C,1\n1,male,49,1,0,C,1\n1,male,39,0,0,C,0\n1,female,23,0,1,C,1\n1,female,38,0,0,C,1\n1,female,54,1,0,C,1\n1,female,36,0,0,C,0\n1,male,,0,0,S,0\n1,female,,0,0,S,1\n1,female,,0,0,C,1\n1,male,36,0,0,S,1\n1,male,30,0,0,C,0\n1,female,24,3,2,S,1\n1,female,28,3,2,S,1\n1,female,23,3,2,S,1\n1,male,19,3,2,S,0\n1,male,64,1,4,S,0\n1,female,60,1,4,S,1\n1,female,30,0,0,C,1\n1,male,,0,0,S,0\n1,male,50,2,0,S,1\n1,male,43,1,0,C,1\n1,female,,1,0,S,1\n1,female,22,0,2,C,1\n1,male,60,1,1,C,1\n1,female,48,1,1,C,1\n1,male,,0,0,S,0\n1,male,37,1,0,S,0\n1,female,35,1,0,S,1\n1,male,47,0,0,S,0\n1,female,35,0,0,C,1\n1,female,22,0,1,C,1\n1,female,45,0,1,C,1\n1,male,24,0,0,C,0\n1,male,49,1,0,C,1\n1,female,,1,0,C,1\n1,male,71,0,0,C,0\n1,male,53,0,0,C,1\n1,female,19,0,0,S,1\n1,male,38,0,1,S,0\n1,female,58,0,1,S,1\n1,male,23,0,1,C,1\n1,female,45,0,1,C,1\n1,male,46,0,0,C,0\n1,male,25,1,0,C,1\n1,female,25,1,0,C,1\n1,male,48,1,0,C,1\n1,female,49,1,0,C,1\n1,male,,0,0,S,0\n1,male,45,1,0,S,0\n1,female,35,1,0,S,1\n1,male,40,0,0,S,0\n1,male,27,0,0,C,1\n1,male,,0,0,S,1\n1,female,24,0,0,C,1\n1,male,55,1,1,S,0\n1,female,52,1,1,S,1\n1,male,42,0,0,S,0\n1,male,,0,0,S,0\n1,male,55,0,0,S,0\n1,female,16,0,1,C,1\n1,female,44,0,1,C,1\n1,female,51,1,0,S,1\n1,male,42,1,0,S,0\n1,female,35,1,0,S,1\n1,male,35,0,0,C,1\n1,male,38,1,0,S,1\n1,male,,0,0,C,0\n1,female,35,1,0,S,1\n1,female,38,0,0,,1\n1,female,50,0,0,C,0\n1,male,49,0,0,S,1\n1,male,46,0,0,S,0\n1,male,50,0,0,S,0\n1,male,32.5,0,0,C,0\n1,male,58,0,0,C,0\n1,male,41,1,0,S,0\n1,female,,1,0,S,1\n1,male,42,1,0,S,1\n1,female,45,1,0,S,1\n1,male,,0,0,S,0\n1,female,39,0,0,S,1\n1,female,49,0,0,S,1\n1,female,30,0,0,C,1\n1,male,35,0,0,C,1\n1,male,,0,0,C,0\n1,male,42,0,0,S,0\n1,female,55,0,0,C,1\n1,female,16,0,1,S,1\n1,female,51,0,1,S,1\n1,male,29,0,0,S,0\n1,female,21,0,0,S,1\n1,male,30,0,0,S,0\n1,female,58,0,0,C,1\n1,female,15,0,1,S,1\n1,male,30,0,0,S,0\n1,female,16,0,0,S,1\n1,male,,0,0,C,1\n1,male,19,1,0,S,0\n1,female,18,1,0,S,1\n1,female,24,0,0,C,1\n1,male,46,0,0,C,0\n1,male,54,0,0,S,0\n1,male,36,0,0,S,1\n1,male,28,1,0,C,0\n1,female,,1,0,C,1\n1,male,65,0,0,S,0\n1,male,44,2,0,Q,0\n1,female,33,1,0,Q,1\n1,female,37,1,0,Q,1\n1,male,30,1,0,C,1\n1,male,55,0,0,S,0\n1,male,47,0,0,S,0\n1,male,37,0,1,C,0\n1,female,31,1,0,C,1\n1,female,23,1,0,C,1\n1,male,58,0,2,C,0\n1,female,19,0,2,S,1\n1,male,64,0,0,S,0\n1,female,39,0,0,C,1\n1,male,,0,0,C,1\n1,female,22,0,1,C,1\n1,male,65,0,1,C,0\n1,male,28.5,0,0,C,0\n1,male,,0,0,S,0\n1,male,45.5,0,0,S,0\n1,male,23,0,0,S,0\n1,male,29,1,0,S,0\n1,female,22,1,0,S,1\n1,male,18,1,0,C,0\n1,female,17,1,0,C,1\n1,female,30,0,0,S,1\n1,male,52,0,0,S,1\n1,male,47,0,0,S,0\n1,female,56,0,1,C,1\n1,male,38,0,0,S,0\n1,male,,0,0,S,1\n1,male,22,0,0,C,0\n1,male,,0,0,C,0\n1,female,43,0,1,S,1\n1,male,31,0,0,S,0\n1,male,45,0,0,S,1\n1,male,,0,0,S,0\n1,female,33,0,0,C,1\n1,male,46,0,0,C,0\n1,male,36,0,0,C,0\n1,female,33,0,0,S,1\n1,male,55,1,0,C,0\n1,female,54,1,0,C,1\n1,male,33,0,0,S,0\n1,male,13,2,2,C,1\n1,female,18,2,2,C,1\n1,female,21,2,2,C,1\n1,male,61,1,3,C,0\n1,female,48,1,3,C,1\n1,male,,0,0,S,1\n1,female,24,0,0,C,1\n1,male,,0,0,S,1\n1,female,35,1,0,C,1\n1,female,30,0,0,C,1\n1,male,34,0,0,S,1\n1,female,40,0,0,S,1\n1,male,35,0,0,S,1\n1,male,50,1,0,S,0\n1,female,39,1,0,S,1\n1,male,56,0,0,C,1\n1,male,28,0,0,S,1\n1,male,56,0,0,S,0\n1,male,56,0,0,C,0\n1,male,24,1,0,S,0\n1,male,,0,0,S,0\n1,female,18,1,0,S,1\n1,male,24,1,0,S,1\n1,female,23,1,0,S,1\n1,male,6,0,2,C,1\n1,male,45,1,1,C,1\n1,female,40,1,1,C,1\n1,male,57,1,0,C,0\n1,female,,1,0,C,1\n1,male,32,0,0,C,1\n1,male,62,0,0,S,0\n1,male,54,1,0,C,1\n1,female,43,1,0,C,1\n1,female,52,1,0,C,1\n1,male,,0,0,C,0\n1,female,62,0,0,,1\n1,male,67,1,0,S,0\n1,female,63,1,0,S,0\n1,male,61,0,0,S,0\n1,female,48,0,0,S,1\n1,female,18,0,2,S,1\n1,male,52,1,1,S,0\n1,female,39,1,1,S,1\n1,male,48,1,0,S,1\n1,female,,1,0,S,1\n1,male,49,1,1,C,0\n1,male,17,0,2,C,1\n1,female,39,1,1,C,1\n1,female,,0,0,C,1\n1,male,31,0,0,C,1\n1,male,40,0,0,C,0\n1,male,61,0,0,S,0\n1,male,47,0,0,S,0\n1,female,35,0,0,C,1\n1,male,64,1,0,C,0\n1,female,60,1,0,C,1\n1,male,60,0,0,S,0\n1,male,54,0,1,S,0\n1,male,21,0,1,S,0\n1,female,55,0,0,C,1\n1,female,31,0,2,S,1\n1,male,57,1,1,S,0\n1,female,45,1,1,S,1\n1,male,50,1,1,C,0\n1,male,27,0,2,C,0\n1,female,50,1,1,C,1\n1,female,21,0,0,S,1\n1,male,51,0,1,C,0\n1,male,21,0,1,C,1\n1,male,,0,0,S,0\n1,female,31,0,0,C,1\n1,male,,0,0,S,1\n1,male,62,0,0,S,0\n1,female,36,0,0,C,1\n2,male,30,1,0,C,0\n2,female,28,1,0,C,1\n2,male,30,0,0,S,0\n2,male,18,0,0,S,0\n2,male,25,0,0,S,0\n2,male,34,1,0,S,0\n2,female,36,1,0,S,1\n2,male,57,0,0,S,0\n2,male,18,0,0,S,0\n2,male,23,0,0,S,0\n2,female,36,0,0,S,1\n2,male,28,0,0,S,0\n2,male,51,0,0,S,0\n2,male,32,1,0,S,1\n2,female,19,1,0,S,1\n2,male,28,0,0,S,0\n2,male,1,2,1,S,1\n2,female,4,2,1,S,1\n2,female,12,2,1,S,1\n2,female,36,0,3,S,1\n2,male,34,0,0,S,1\n2,female,19,0,0,S,1\n2,male,23,0,0,S,0\n2,male,26,0,0,S,0\n2,male,42,0,0,S,0\n2,male,27,0,0,S,0\n2,female,24,0,0,S,1\n2,female,15,0,2,S,1\n2,male,60,1,1,S,0\n2,female,40,1,1,S,1\n2,female,20,1,0,S,1\n2,male,25,1,0,S,0\n2,female,36,0,0,S,1\n2,male,25,0,0,S,0\n2,male,42,0,0,S,0\n2,female,42,0,0,S,1\n2,male,0.8333,0,2,S,1\n2,male,26,1,1,S,1\n2,female,22,1,1,S,1\n2,female,35,0,0,S,1\n2,male,,0,0,S,0\n2,male,19,0,0,S,0\n2,female,44,1,0,S,0\n2,male,54,1,0,S,0\n2,male,52,0,0,S,0\n2,male,37,1,0,S,0\n2,female,29,1,0,S,0\n2,female,25,1,1,S,1\n2,female,45,0,2,S,1\n2,male,29,1,0,S,0\n2,female,28,1,0,S,1\n2,male,29,0,0,S,0\n2,male,28,0,0,S,0\n2,male,24,0,0,S,1\n2,female,8,0,2,S,1\n2,male,31,1,1,S,0\n2,female,31,1,1,S,1\n2,female,22,0,0,S,1\n2,female,30,0,0,S,0\n2,female,,0,0,S,0\n2,male,21,0,0,S,0\n2,male,,0,0,S,0\n2,male,8,1,1,S,1\n2,male,18,0,0,S,0\n2,female,48,0,2,S,1\n2,female,28,0,0,S,1\n2,male,32,0,0,S,0\n2,male,17,0,0,S,0\n2,male,29,1,0,C,0\n2,female,24,1,0,C,1\n2,male,25,0,0,S,0\n2,male,18,0,0,S,0\n2,female,18,0,1,S,1\n2,female,34,0,1,S,1\n2,male,54,0,0,S,0\n2,male,8,0,2,S,1\n2,male,42,1,1,S,0\n2,female,34,1,1,S,1\n2,female,27,1,0,C,1\n2,female,30,1,0,C,1\n2,male,23,0,0,S,0\n2,male,21,0,0,S,0\n2,male,18,0,0,S,0\n2,male,40,1,0,S,0\n2,female,29,1,0,S,1\n2,male,18,0,0,S,0\n2,male,36,0,0,S,0\n2,male,,0,0,S,0\n2,female,38,0,0,S,0\n2,male,35,0,0,S,0\n2,male,38,1,0,S,0\n2,male,34,1,0,S,0\n2,female,34,0,0,S,1\n2,male,16,0,0,S,0\n2,male,26,0,0,S,0\n2,male,47,0,0,S,0\n2,male,21,1,0,S,0\n2,male,21,1,0,S,0\n2,male,24,0,0,S,0\n2,male,24,0,0,S,0\n2,male,34,0,0,S,0\n2,male,30,0,0,S,0\n2,male,52,0,0,S,0\n2,male,30,0,0,S,0\n2,male,0.6667,1,1,S,1\n2,female,24,0,2,S,1\n2,male,44,0,0,S,0\n2,female,6,0,1,S,1\n2,male,28,0,1,S,0\n2,male,62,0,0,S,1\n2,male,30,0,0,S,0\n2,female,7,0,2,S,1\n2,male,43,1,1,S,0\n2,female,45,1,1,S,1\n2,female,24,1,2,S,1\n2,female,24,1,2,S,1\n2,male,49,1,2,S,0\n2,female,48,1,2,S,1\n2,female,55,0,0,S,1\n2,male,24,2,0,S,0\n2,male,32,2,0,S,0\n2,male,21,2,0,S,0\n2,female,18,1,1,S,0\n2,female,20,2,1,S,1\n2,male,23,2,1,S,0\n2,male,36,0,0,S,0\n2,female,54,1,3,S,1\n2,male,50,0,0,S,0\n2,male,44,1,0,S,0\n2,female,29,1,0,S,1\n2,male,21,0,0,S,0\n2,male,42,0,0,S,1\n2,male,63,1,0,S,0\n2,female,60,1,0,S,0\n2,male,33,0,0,S,0\n2,female,17,0,0,S,1\n2,male,42,1,0,S,0\n2,female,24,2,1,S,1\n2,male,47,0,0,S,0\n2,male,24,2,0,S,0\n2,male,22,2,0,S,0\n2,male,32,0,0,S,0\n2,female,23,0,0,C,1\n2,male,34,1,0,S,0\n2,female,24,1,0,S,1\n2,female,22,0,0,S,0\n2,female,,0,0,Q,1\n2,male,35,0,0,Q,0\n2,female,45,0,0,S,1\n2,male,57,0,0,Q,0\n2,male,,0,0,S,0\n2,male,31,0,0,S,0\n2,female,26,1,1,S,0\n2,male,30,1,1,S,0\n2,male,,0,0,Q,0\n2,female,1,1,2,C,1\n2,female,3,1,2,C,1\n2,male,25,1,2,C,0\n2,female,22,1,2,C,1\n2,female,17,0,0,C,1\n2,female,,0,0,S,1\n2,female,34,0,0,S,1\n2,male,36,0,0,C,0\n2,male,24,0,0,S,0\n2,male,61,0,0,Q,0\n2,male,50,1,0,S,0\n2,female,42,1,0,S,1\n2,female,57,0,0,S,0\n2,male,,0,0,C,0\n2,male,1,0,2,C,1\n2,male,31,1,1,C,0\n2,female,24,1,1,C,1\n2,male,,0,0,C,0\n2,male,30,0,0,S,0\n2,male,40,0,0,S,0\n2,male,32,0,0,S,0\n2,male,30,0,0,S,0\n2,male,46,0,0,S,0\n2,female,13,0,1,S,1\n2,female,41,0,1,S,1\n2,male,19,0,0,S,1\n2,male,39,0,0,S,0\n2,male,48,0,0,S,0\n2,male,70,0,0,S,0\n2,male,27,0,0,S,0\n2,male,54,0,0,S,0\n2,male,39,0,0,S,0\n2,male,16,0,0,S,0\n2,male,62,0,0,Q,0\n2,male,32.5,1,0,C,0\n2,female,14,1,0,C,1\n2,male,2,1,1,S,1\n2,male,3,1,1,S,1\n2,male,36.5,0,2,S,0\n2,male,26,0,0,S,0\n2,male,19,1,1,S,0\n2,male,28,0,0,S,0\n2,male,20,0,0,C,1\n2,female,29,0,0,S,1\n2,male,39,0,0,S,0\n2,male,22,0,0,S,1\n2,male,,0,0,C,1\n2,male,23,0,0,S,0\n2,male,29,0,0,C,1\n2,male,28,0,0,S,0\n2,male,,0,0,S,0\n2,female,50,0,1,S,1\n2,male,19,0,0,S,0\n2,male,,0,0,C,0\n2,male,41,0,0,S,0\n2,female,21,0,1,S,1\n2,female,19,0,0,S,1\n2,male,43,0,1,S,0\n2,female,32,0,0,S,1\n2,male,34,0,0,S,0\n2,male,30,0,0,C,1\n2,male,27,0,0,C,0\n2,female,2,1,1,S,1\n2,female,8,1,1,S,1\n2,female,33,0,2,S,1\n2,male,36,0,0,S,0\n2,male,34,1,0,S,0\n2,female,30,3,0,S,1\n2,female,28,0,0,S,1\n2,male,23,0,0,C,0\n2,male,0.8333,1,1,S,1\n2,male,3,1,1,S,1\n2,female,24,2,3,S,1\n2,female,50,0,0,S,1\n2,male,19,0,0,S,0\n2,female,21,0,0,S,1\n2,male,26,0,0,S,0\n2,male,25,0,0,S,0\n2,male,27,0,0,S,0\n2,female,25,0,1,S,1\n2,female,18,0,2,S,1\n2,female,20,0,0,S,1\n2,female,30,0,0,S,1\n2,male,59,0,0,S,0\n2,female,30,0,0,Q,1\n2,male,35,0,0,S,0\n2,female,40,0,0,S,1\n2,male,25,0,0,S,0\n2,male,41,0,0,C,0\n2,male,25,0,0,S,0\n2,male,18.5,0,0,S,0\n2,male,14,0,0,S,0\n2,female,50,0,0,S,1\n2,male,23,0,0,S,0\n2,female,28,0,0,S,1\n2,female,27,0,0,S,1\n2,male,29,1,0,S,0\n2,female,27,1,0,S,0\n2,male,40,0,0,S,0\n2,female,31,0,0,S,1\n2,male,30,1,0,S,0\n2,male,23,1,0,S,0\n2,female,31,0,0,S,1\n2,male,,0,0,S,0\n2,female,12,0,0,S,1\n2,female,40,0,0,S,1\n2,female,32.5,0,0,S,1\n2,male,27,1,0,S,0\n2,female,29,1,0,S,1\n2,male,2,1,1,S,1\n2,female,4,1,1,S,1\n2,female,29,0,2,S,1\n2,female,0.9167,1,2,S,1\n2,female,5,1,2,S,1\n2,male,36,1,2,S,0\n2,female,33,1,2,S,1\n2,male,66,0,0,S,0\n2,male,,0,0,S,0\n2,male,31,0,0,S,1\n2,male,,0,0,S,1\n2,female,26,0,0,S,1\n2,female,24,0,0,S,0\n3,male,42,0,0,S,0\n3,male,13,0,2,S,0\n3,male,16,1,1,S,0\n3,female,35,1,1,S,1\n3,female,16,0,0,S,1\n3,male,25,0,0,S,1\n3,male,20,0,0,S,1\n3,female,18,0,0,C,1\n3,male,30,0,0,S,0\n3,male,26,0,0,S,0\n3,female,40,1,0,S,0\n3,male,0.8333,0,1,S,1\n3,female,18,0,1,S,1\n3,male,26,0,0,C,1\n3,male,26,0,0,S,0\n3,male,20,0,0,S,0\n3,male,24,0,0,S,0\n3,male,25,0,0,S,0\n3,male,35,0,0,S,0\n3,male,18,0,0,S,0\n3,male,32,0,0,S,0\n3,female,19,1,0,S,1\n3,male,4,4,2,S,0\n3,female,6,4,2,S,0\n3,female,2,4,2,S,0\n3,female,17,4,2,S,1\n3,female,38,4,2,S,0\n3,female,9,4,2,S,0\n3,female,11,4,2,S,0\n3,male,39,1,5,S,0\n3,male,27,0,0,S,1\n3,male,26,0,0,S,0\n3,female,39,1,5,S,0\n3,male,20,0,0,S,0\n3,male,26,0,0,S,0\n3,male,25,1,0,S,0\n3,female,18,1,0,S,0\n3,male,24,0,0,S,0\n3,male,35,0,0,S,0\n3,male,5,4,2,S,0\n3,male,9,4,2,S,0\n3,male,3,4,2,S,1\n3,male,13,4,2,S,0\n3,female,5,4,2,S,1\n3,male,40,1,5,S,0\n3,male,23,0,0,S,1\n3,female,38,1,5,S,1\n3,female,45,0,0,C,1\n3,male,21,0,0,C,0\n3,male,23,0,0,S,0\n3,female,17,0,0,C,0\n3,male,30,0,0,C,0\n3,male,23,0,0,S,0\n3,female,13,0,0,C,1\n3,male,20,0,0,C,0\n3,male,32,1,0,S,0\n3,female,33,3,0,S,1\n3,female,0.75,2,1,C,1\n3,female,0.75,2,1,C,1\n3,female,5,2,1,C,1\n3,female,24,0,3,C,1\n3,female,18,0,0,S,1\n3,male,40,0,0,C,0\n3,male,26,0,0,S,0\n3,male,20,0,0,C,1\n3,female,18,0,1,C,0\n3,female,45,0,1,C,0\n3,female,27,0,0,Q,0\n3,male,22,0,0,S,0\n3,male,19,0,0,S,0\n3,male,26,0,0,S,0\n3,male,22,0,0,S,0\n3,male,,0,0,C,0\n3,male,20,0,0,C,0\n3,male,32,0,0,S,1\n3,male,21,0,0,S,0\n3,male,18,0,0,S,0\n3,male,26,0,0,S,0\n3,male,6,1,1,C,0\n3,female,9,1,1,C,0\n3,male,,0,0,C,0\n3,female,,0,2,C,0\n3,female,,0,2,Q,0\n3,male,40,1,1,Q,0\n3,female,32,1,1,Q,0\n3,male,21,0,0,S,0\n3,female,22,0,0,Q,1\n3,female,20,0,0,S,0\n3,male,29,1,0,S,0\n3,male,22,1,0,S,0\n3,male,22,0,0,S,0\n3,male,35,0,0,S,0\n3,female,18.5,0,0,Q,0\n3,male,21,0,0,Q,1\n3,male,19,0,0,Q,0\n3,female,18,0,0,Q,0\n3,female,21,0,0,S,0\n3,female,30,0,0,S,0\n3,male,18,0,0,S,0\n3,male,38,0,0,S,0\n3,male,17,0,0,S,0\n3,male,17,0,0,S,0\n3,female,21,0,0,Q,0\n3,male,21,0,0,Q,0\n3,male,21,0,0,S,0\n3,male,,1,0,C,0\n3,female,,1,0,C,0\n3,male,28,0,0,S,0\n3,male,24,0,0,S,0\n3,female,16,0,0,Q,1\n3,female,37,0,0,Q,0\n3,male,28,0,0,S,0\n3,male,24,0,0,S,0\n3,male,21,0,0,Q,0\n3,male,32,0,0,S,1\n3,male,29,0,0,S,0\n3,male,26,1,0,C,0\n3,male,18,1,0,C,0\n3,male,20,0,0,S,0\n3,male,18,0,0,S,1\n3,male,24,0,0,Q,0\n3,male,36,0,0,S,0\n3,male,24,0,0,S,0\n3,male,31,0,0,Q,0\n3,male,31,0,0,Q,0\n3,female,22,0,0,Q,1\n3,female,30,0,0,Q,0\n3,male,70.5,0,0,Q,0\n3,male,43,0,0,S,0\n3,male,35,0,0,S,0\n3,male,27,0,0,S,0\n3,male,19,0,0,S,0\n3,male,30,0,0,S,0\n3,male,9,1,1,S,1\n3,male,3,1,1,S,1\n3,female,36,0,2,S,1\n3,male,59,0,0,S,0\n3,male,19,0,0,S,0\n3,female,17,0,1,S,1\n3,male,44,0,1,S,0\n3,male,17,0,0,S,0\n3,male,22.5,0,0,C,0\n3,male,45,0,0,S,1\n3,female,22,0,0,S,0\n3,male,19,0,0,S,0\n3,female,30,0,0,Q,1\n3,male,29,0,0,Q,1\n3,male,0.3333,0,2,S,0\n3,male,34,1,1,S,0\n3,female,28,1,1,S,0\n3,male,27,0,0,S,0\n3,male,25,0,0,S,0\n3,male,24,2,0,S,0\n3,male,22,0,0,S,0\n3,male,21,2,0,S,0\n3,male,17,2,0,S,0\n3,male,,1,0,S,0\n3,female,,1,0,S,1\n3,male,36.5,1,0,S,1\n3,female,36,1,0,S,1\n3,male,30,0,0,S,1\n3,male,16,0,0,S,0\n3,male,1,1,2,S,1\n3,female,0.1667,1,2,S,1\n3,male,26,1,2,S,0\n3,female,33,1,2,S,1\n3,male,25,0,0,S,0\n3,male,,0,0,S,0\n3,male,,0,0,S,0\n3,male,22,0,0,S,0\n3,male,36,0,0,S,0\n3,female,19,0,0,Q,1\n3,male,17,0,0,S,0\n3,male,42,0,0,S,0\n3,male,43,0,0,S,0\n3,male,,0,0,C,0\n3,male,32,0,0,Q,0\n3,male,19,0,0,S,1\n3,female,30,0,0,S,1\n3,female,24,0,0,Q,0\n3,female,23,0,0,S,1\n3,male,33,0,0,C,0\n3,male,65,0,0,Q,0\n3,male,24,0,0,S,1\n3,male,23,1,0,S,0\n3,female,22,1,0,S,1\n3,male,18,0,0,S,0\n3,male,16,0,0,S,0\n3,male,45,0,0,S,0\n3,male,,0,0,C,0\n3,male,39,0,2,C,0\n3,male,17,1,1,C,0\n3,male,15,1,1,C,0\n3,male,47,0,0,S,0\n3,female,5,0,0,S,1\n3,male,,0,0,C,0\n3,male,40.5,0,0,S,0\n3,male,40.5,0,0,Q,0\n3,male,,0,0,S,1\n3,male,18,0,0,S,0\n3,female,,0,0,Q,0\n3,male,,0,0,Q,0\n3,male,,0,0,Q,0\n3,male,26,0,0,Q,0\n3,male,,0,0,Q,0\n3,male,,0,0,S,1\n3,female,21,2,2,S,0\n3,female,9,2,2,S,0\n3,male,,0,0,S,0\n3,male,18,2,2,S,0\n3,male,16,1,3,S,0\n3,female,48,1,3,S,0\n3,male,,0,0,Q,0\n3,male,,0,0,S,0\n3,male,25,0,0,Q,0\n3,male,,0,0,S,0\n3,male,,0,0,C,0\n3,male,22,0,0,S,0\n3,female,16,0,0,Q,1\n3,female,,0,0,Q,1\n3,male,9,0,2,S,1\n3,male,33,1,1,S,0\n3,male,41,0,0,S,0\n3,female,31,1,1,S,1\n3,male,38,0,0,S,0\n3,male,9,5,2,S,0\n3,male,1,5,2,S,0\n3,male,11,5,2,S,0\n3,female,10,5,2,S,0\n3,female,16,5,2,S,0\n3,male,14,5,2,S,0\n3,male,40,1,6,S,0\n3,female,43,1,6,S,0\n3,male,51,0,0,S,0\n3,male,32,0,0,S,0\n3,male,,0,0,S,0\n3,male,20,0,0,S,0\n3,male,37,2,0,S,0\n3,male,28,2,0,S,0\n3,male,19,0,0,S,0\n3,female,24,0,0,S,0\n3,female,17,0,0,Q,0\n3,male,,1,0,S,0\n3,male,,1,0,S,0\n3,male,28,1,0,S,0\n3,female,24,1,0,S,1\n3,male,20,0,0,S,0\n3,male,23.5,0,0,C,0\n3,male,41,2,0,S,0\n3,male,26,1,0,S,0\n3,male,21,0,0,S,0\n3,female,45,1,0,S,1\n3,female,,0,0,S,0\n3,male,25,0,0,S,0\n3,male,,0,0,Q,0\n3,male,11,0,0,C,0\n3,female,,0,0,Q,1\n3,male,27,0,0,S,1\n3,male,,0,0,S,1\n3,female,18,0,0,Q,0\n3,female,26,0,0,S,1\n3,female,23,0,0,S,0\n3,female,22,0,0,S,1\n3,male,28,0,0,S,0\n3,female,28,0,0,S,0\n3,female,,0,0,Q,0\n3,female,2,0,1,S,1\n3,female,22,1,1,S,1\n3,male,43,0,0,S,0\n3,male,28,0,0,S,0\n3,female,27,0,0,S,1\n3,male,,0,0,Q,0\n3,female,,0,0,S,1\n3,male,42,0,0,S,0\n3,male,,0,0,S,1\n3,male,30,0,0,C,0\n3,male,,0,0,S,0\n3,female,27,1,0,S,0\n3,female,25,1,0,S,0\n3,male,,0,0,S,0\n3,male,29,0,0,C,1\n3,male,21,0,0,S,1\n3,male,,0,0,S,0\n3,male,20,0,0,S,0\n3,male,48,0,0,S,0\n3,male,17,1,0,S,0\n3,female,,0,0,Q,1\n3,male,,0,0,S,1\n3,male,34,0,0,S,0\n3,male,26,0,0,S,1\n3,male,22,0,0,S,0\n3,male,33,0,0,S,0\n3,male,31,0,0,S,0\n3,male,29,0,0,S,0\n3,male,4,1,1,S,1\n3,female,1,1,1,S,1\n3,male,49,0,0,S,0\n3,male,33,0,0,S,0\n3,male,19,0,0,S,0\n3,female,27,0,2,S,1\n3,male,,1,2,S,0\n3,female,,1,2,S,0\n3,male,,1,2,S,0\n3,female,,1,2,S,0\n3,male,23,0,0,S,0\n3,male,32,0,0,S,1\n3,male,27,0,0,S,0\n3,female,20,1,0,S,0\n3,female,21,1,0,S,0\n3,male,32,0,0,S,1\n3,male,17,0,0,S,0\n3,male,21,0,0,S,0\n3,male,30,0,0,S,0\n3,male,21,0,0,S,1\n3,male,33,0,0,S,0\n3,male,22,0,0,S,0\n3,female,4,0,1,C,1\n3,male,39,0,1,C,1\n3,male,,0,0,C,0\n3,male,18.5,0,0,C,0\n3,male,,0,0,Q,0\n3,male,,0,0,S,0\n3,female,,0,0,Q,1\n3,female,,0,0,Q,1\n3,male,34.5,0,0,Q,0\n3,male,44,0,0,S,0\n3,male,,0,0,Q,1\n3,male,,1,0,C,0\n3,female,,1,0,C,0\n3,male,,1,0,Q,0\n3,male,,1,0,Q,0\n3,male,,0,0,Q,0\n3,female,22,2,0,S,0\n3,male,26,2,0,S,0\n3,female,4,0,2,S,1\n3,male,29,3,1,S,1\n3,female,26,1,1,S,1\n3,female,1,1,1,S,0\n3,male,18,1,1,S,0\n3,female,36,0,2,S,0\n3,male,,0,0,C,0\n3,male,25,0,0,C,1\n3,male,,0,0,C,0\n3,female,37,0,0,S,0\n3,male,,0,0,S,0\n3,male,,0,0,S,1\n3,male,,0,0,S,0\n3,female,22,0,0,S,1\n3,male,,0,0,Q,0\n3,male,26,0,0,S,1\n3,male,29,0,0,S,0\n3,male,29,0,0,S,0\n3,male,22,0,0,S,0\n3,male,22,0,0,C,1\n3,male,,3,1,S,0\n3,female,,3,1,S,0\n3,female,,3,1,S,0\n3,female,,3,1,S,0\n3,female,,0,4,S,0\n3,male,32,0,0,S,0\n3,male,34.5,0,0,C,0\n3,female,,1,0,Q,0\n3,male,,1,0,Q,0\n3,male,36,0,0,S,0\n3,male,39,0,0,S,0\n3,male,24,0,0,S,0\n3,female,25,0,0,S,0\n3,female,45,0,0,S,0\n3,male,36,1,0,S,0\n3,female,30,1,0,S,0\n3,male,20,1,0,S,1\n3,male,,0,0,Q,0\n3,male,28,0,0,S,0\n3,male,,0,0,S,0\n3,male,30,1,0,S,0\n3,female,26,1,0,S,0\n3,male,,0,0,S,0\n3,male,20.5,0,0,S,0\n3,male,27,0,0,S,1\n3,male,51,0,0,S,0\n3,female,23,0,0,S,1\n3,male,32,0,0,S,1\n3,male,,0,0,S,0\n3,male,,0,0,S,0\n3,female,,0,0,Q,1\n3,male,24,0,0,S,1\n3,male,22,0,0,S,0\n3,female,,0,0,Q,0\n3,male,,0,0,Q,0\n3,male,,0,0,S,0\n3,male,29,0,0,S,0\n3,male,,0,0,C,1\n3,female,30.5,0,0,Q,0\n3,female,,0,0,Q,1\n3,male,,0,0,C,0\n3,male,35,0,0,C,0\n3,male,33,0,0,S,0\n3,female,,0,0,C,1\n3,male,,0,0,C,0\n3,female,,0,0,Q,1\n3,male,,0,0,Q,1\n3,female,,2,0,Q,1\n3,female,,2,0,Q,1\n3,male,,2,0,Q,1\n3,female,,0,0,Q,1\n3,male,,0,0,Q,0\n3,female,,0,0,Q,1\n3,female,15,0,0,Q,1\n3,female,35,0,0,Q,0\n3,male,,0,0,Q,0\n3,male,24,1,0,S,0\n3,female,19,1,0,S,0\n3,female,,0,0,Q,0\n3,female,,0,0,S,0\n3,female,,0,0,S,0\n3,male,55.5,0,0,S,0\n3,male,,0,0,Q,0\n3,male,21,0,0,S,1\n3,male,,0,0,S,0\n3,male,24,0,0,S,0\n3,male,21,0,0,S,0\n3,male,28,0,0,S,0\n3,male,,0,0,S,0\n3,female,,0,0,Q,1\n3,male,25,0,0,S,0\n3,male,6,0,1,S,1\n3,female,27,0,1,S,1\n3,male,,0,0,S,0\n3,female,,1,0,Q,1\n3,male,,1,0,Q,0\n3,male,,0,0,Q,0\n3,male,34,0,0,S,0\n3,male,,0,0,Q,0\n3,male,,0,0,S,1\n3,male,,1,1,C,1\n3,male,,1,1,C,1\n3,female,,0,2,C,1\n3,female,,0,0,C,1\n3,male,,0,0,S,0\n3,female,,0,0,Q,1\n3,female,24,0,0,Q,1\n3,male,,0,0,S,0\n3,female,,1,0,Q,1\n3,female,,1,0,Q,1\n3,female,,0,0,Q,1\n3,male,18,0,0,S,0\n3,male,22,0,0,S,0\n3,female,15,0,0,C,1\n3,female,1,0,2,C,1\n3,male,20,1,1,C,1\n3,female,19,1,1,C,1\n3,male,33,0,0,S,0\n3,male,,0,0,S,0\n3,male,,0,0,C,0\n3,female,,0,0,Q,0\n3,male,,0,0,S,0\n3,male,12,1,0,C,1\n3,female,14,1,0,C,1\n3,female,29,0,0,S,0\n3,male,28,0,0,S,0\n3,female,18,0,0,S,1\n3,female,26,0,0,S,1\n3,male,21,0,0,S,0\n3,male,41,0,0,S,0\n3,male,39,0,0,S,1\n3,male,21,0,0,S,0\n3,male,28.5,0,0,C,0\n3,female,22,0,0,S,1\n3,male,61,0,0,S,0\n3,male,,1,0,Q,0\n3,male,,0,0,Q,0\n3,female,,1,0,Q,1\n3,male,,0,0,Q,0\n3,male,,0,0,Q,0\n3,male,,0,0,Q,0\n3,male,23,0,0,S,0\n3,female,,0,0,Q,0\n3,female,,0,0,Q,1\n3,female,,0,0,Q,1\n3,female,22,0,0,S,1\n3,male,,0,0,Q,1\n3,female,,0,0,Q,1\n3,male,9,0,1,S,1\n3,male,28,0,0,S,0\n3,male,42,0,1,S,0\n3,male,,0,0,S,0\n3,female,31,0,0,S,0\n3,male,28,0,0,S,0\n3,male,32,0,0,S,1\n3,male,20,0,0,S,0\n3,female,23,0,0,S,0\n3,female,20,0,0,S,0\n3,male,20,0,0,S,0\n3,male,16,0,0,S,0\n3,female,31,0,0,S,1\n3,female,,0,0,Q,0\n3,male,2,3,1,S,0\n3,male,6,3,1,S,0\n3,female,3,3,1,S,0\n3,female,8,3,1,S,0\n3,female,29,0,4,S,0\n3,male,1,4,1,S,0\n3,male,7,4,1,S,0\n3,male,2,4,1,S,0\n3,male,16,4,1,S,0\n3,male,14,4,1,S,0\n3,female,41,0,5,S,0\n3,male,21,0,0,S,0\n3,male,19,0,0,S,0\n3,male,,0,0,C,0\n3,male,32,0,0,S,0\n3,male,0.75,1,1,S,0\n3,female,3,1,1,S,0\n3,female,26,0,2,S,0\n3,male,,0,0,S,0\n3,male,,0,0,S,0\n3,male,,0,0,S,0\n3,male,21,0,0,S,0\n3,male,25,0,0,S,0\n3,male,22,0,0,S,0\n3,male,25,1,0,S,1\n3,male,,1,1,C,1\n3,female,,1,1,C,1\n3,female,,0,2,C,1\n3,female,,0,0,Q,0\n3,male,24,0,0,S,0\n3,female,28,0,0,S,0\n3,male,19,0,0,S,0\n3,male,,0,0,S,0\n3,male,25,1,0,S,0\n3,female,18,0,0,S,0\n3,male,32,0,0,S,1\n3,male,,0,0,S,0\n3,male,17,0,0,S,0\n3,male,24,0,0,S,0\n3,male,,0,0,S,0\n3,female,,0,0,S,0\n3,male,,0,0,C,0\n3,male,,0,0,S,0\n3,male,38,0,0,S,0\n3,male,21,0,0,S,0\n3,male,10,4,1,Q,0\n3,male,4,4,1,Q,0\n3,male,7,4,1,Q,0\n3,male,2,4,1,Q,0\n3,male,8,4,1,Q,0\n3,female,39,0,5,Q,0\n3,female,22,0,0,S,0\n3,male,35,0,0,S,0\n3,female,,0,0,Q,1\n3,male,,0,0,S,0\n3,female,,0,0,S,0\n3,male,50,1,0,S,0\n3,female,47,1,0,S,0\n3,male,,0,0,S,0\n3,male,,0,0,S,0\n3,female,2,1,1,S,0\n3,male,18,1,1,S,0\n3,female,41,0,2,S,0\n3,female,,0,0,S,1\n3,male,50,0,0,S,0\n3,male,16,0,0,S,0\n3,male,,0,0,Q,1\n3,male,,0,0,Q,0\n3,male,,0,0,C,0\n3,male,25,0,0,C,0\n3,male,,0,0,C,0\n3,male,,0,0,Q,0\n3,male,,0,0,S,0\n3,male,38.5,0,0,S,0\n3,male,,8,2,S,0\n3,male,14.5,8,2,S,0\n3,female,,8,2,S,0\n3,female,,8,2,S,0\n3,female,,8,2,S,0\n3,female,,8,2,S,0\n3,male,,8,2,S,0\n3,male,,8,2,S,0\n3,male,,8,2,S,0\n3,male,,1,9,S,0\n3,female,,1,9,S,0\n3,male,24,0,0,S,0\n3,female,21,0,0,S,1\n3,male,39,0,0,S,0\n3,male,,2,0,C,0\n3,male,,2,0,C,0\n3,male,,2,0,C,0\n3,female,1,1,1,S,1\n3,female,24,0,2,S,1\n3,female,4,1,1,S,1\n3,male,25,0,0,S,1\n3,male,20,0,0,S,0\n3,male,24.5,0,0,S,0\n3,male,,0,0,Q,0\n3,male,,0,0,S,0\n3,male,,0,0,Q,0\n3,male,29,0,0,S,1\n3,male,,0,0,S,0\n3,female,,0,0,Q,1\n3,male,,0,0,S,0\n3,male,,0,0,S,0\n3,male,22,0,0,C,0\n3,male,,0,0,S,0\n3,male,40,0,0,S,0\n3,male,21,0,0,S,0\n3,female,18,0,0,S,1\n3,male,4,3,2,S,0\n3,male,10,3,2,S,0\n3,female,9,3,2,S,0\n3,female,2,3,2,S,0\n3,male,40,1,4,S,0\n3,female,45,1,4,S,0\n3,male,,0,0,S,0\n3,male,,0,0,S,0\n3,male,,0,0,S,0\n3,male,,0,0,Q,0\n3,female,,0,0,Q,1\n3,male,19,0,0,S,0\n3,male,30,0,0,S,0\n3,male,,0,0,S,0\n3,male,32,0,0,S,0\n3,male,,0,0,S,0\n3,male,33,0,0,C,0\n3,female,23,0,0,S,1\n3,male,21,0,0,S,0\n3,male,60.5,0,0,S,0\n3,male,19,0,0,S,0\n3,female,22,0,0,S,0\n3,male,31,0,0,S,1\n3,male,27,0,0,S,0\n3,female,2,0,1,S,0\n3,female,29,1,1,S,0\n3,male,16,0,0,S,1\n3,male,44,0,0,S,1\n3,male,25,0,0,S,0\n3,male,74,0,0,S,0\n3,male,14,0,0,S,1\n3,male,24,0,0,S,0\n3,male,25,0,0,S,1\n3,male,34,0,0,S,0\n3,male,0.4167,0,1,C,1\n3,male,,1,0,C,0\n3,male,,0,0,C,0\n3,male,,0,0,C,0\n3,female,16,1,1,C,1\n3,male,,0,0,S,0\n3,male,,1,0,S,0\n3,female,,1,0,S,1\n3,male,32,0,0,S,0\n3,male,,0,0,Q,0\n3,male,,0,0,S,0\n3,male,30.5,0,0,S,0\n3,male,44,0,0,S,0\n3,male,,0,0,C,0\n3,male,25,0,0,S,1\n3,male,,0,0,C,0\n3,male,7,1,1,C,1\n3,female,9,1,1,C,1\n3,female,29,0,2,C,1\n3,male,36,0,0,S,0\n3,female,18,0,0,S,1\n3,female,63,0,0,S,1\n3,male,,1,1,S,0\n3,male,11.5,1,1,S,0\n3,male,40.5,0,2,S,0\n3,female,10,0,2,S,0\n3,male,36,1,1,S,0\n3,female,30,1,1,S,0\n3,male,,0,0,S,0\n3,male,33,0,0,S,0\n3,male,28,0,0,S,0\n3,male,28,0,0,S,0\n3,male,47,0,0,S,0\n3,female,18,2,0,S,0\n3,male,31,3,0,S,0\n3,male,16,2,0,S,0\n3,female,31,1,0,S,0\n3,male,22,0,0,C,1\n3,male,20,0,0,S,0\n3,female,14,0,0,S,0\n3,male,22,0,0,S,0\n3,male,22,0,0,S,0\n3,male,,0,0,S,0\n3,male,,0,0,S,0\n3,male,,0,0,S,0\n3,male,32.5,0,0,S,0\n3,female,38,0,0,C,1\n3,male,51,0,0,S,0\n3,male,18,1,0,S,0\n3,male,21,1,0,S,0\n3,female,47,1,0,S,1\n3,male,,0,0,S,0\n3,male,,0,0,S,0\n3,male,,0,0,S,0\n3,male,28.5,0,0,S,0\n3,male,21,0,0,S,0\n3,male,27,0,0,S,0\n3,male,,0,0,S,0\n3,male,36,0,0,S,0\n3,male,27,1,0,C,0\n3,female,15,1,0,C,1\n3,male,45.5,0,0,C,0\n3,male,,0,0,C,0\n3,male,,0,0,C,0\n3,female,14.5,1,0,C,0\n3,female,,1,0,C,0\n3,male,26.5,0,0,C,0\n3,male,27,0,0,C,0\n3,male,29,0,0,S,0\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 milaan9\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\"> \n<a href=\"https://github.com/milaan9\"><img src=\"https://img.shields.io/static/v1?logo=github&label=maintainer&message=milaan9&color=ff3300\" alt=\"Last Commit\"/></a> \n<!--<img src=\"https://badges.pufler.dev/created/milaan9/Clustering_Algorithms_from_Scratch\" alt=\"Created\"/>-->\n<!--<a href=\"https://github.com/milaan9/Clustering_Algorithms_from_Scratch/graphs/commit-activity\"><img src=\"https://img.shields.io/github/last-commit/milaan9/Clustering_Algorithms_from_Scratch.svg?colorB=ff8000&style=flat\" alt=\"Last Commit\"/> </a>-->\n<a href=\"https://github.com/milaan9/Clustering_Algorithms_from_Scratch/pulse\" alt=\"Activity\"><img src=\"https://img.shields.io/github/commit-activity/m/milaan9/Clustering_Algorithms_from_Scratch.svg?colorB=teal&style=flat\" /></a> \n<a href=\"https://hits.seeyoufarm.com\"><img src=\"https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2Fmilaan9%2FClustering_Algorithms_from_Scratch&count_bg=%231DC92C&title_bg=%23555555&icon=&icon_color=%23E7E7E7&title=views&edge_flat=false\"/></a>\n<a href=\"https://github.com/milaan9/Clustering_Algorithms_from_Scratch/stargazers\"><img src=\"https://img.shields.io/github/stars/milaan9/Clustering_Algorithms_from_Scratch.svg?colorB=1a53ff\" alt=\"Stars Badge\"/></a>\n<a href=\"https://github.com/milaan9/Clustering_Algorithms_from_Scratch/network/members\"><img src=\"https://img.shields.io/github/forks/milaan9/Clustering_Algorithms_from_Scratch\" alt=\"Forks Badge\"/> </a>\n<img src=\"https://img.shields.io/github/repo-size/milaan9/Clustering_Algorithms_from_Scratch.svg?colorB=CC66FF&style=flat\" alt=\"Size\"/>\n<a href=\"https://github.com/milaan9/Clustering_Algorithms_from_Scratch/pulls\"><img src=\"https://img.shields.io/github/issues-pr/milaan9/Clustering_Algorithms_from_Scratch.svg?colorB=yellow&style=flat\" alt=\"Pull Requests Badge\"/></a>\n<a href=\"https://github.com/milaan9/Clustering_Algorithms_from_Scratch/issues\"><img src=\"https://img.shields.io/github/issues/milaan9/Clustering_Algorithms_from_Scratch.svg?colorB=yellow&style=flat\" alt=\"Issues Badge\"/></a>\n<img src=\"https://img.shields.io/github/languages/top/milaan9/Clustering_Algorithms_from_Scratch.svg?colorB=996600&style=flat\" alt=\"Language\"/></a> \n<a href=\"https://github.com/milaan9/Clustering_Algorithms_from_Scratch/blob/main/LICENSE\"><img src=\"https://img.shields.io/badge/License-MIT-blueviolet.svg\" alt=\"MIT License\"/></a>\n</p> \n<!--<img src=\"https://badges.pufler.dev/contributors/milaan9/01_Python_Introduction?size=50&padding=5&bots=true\" alt=\"milaan9\"/>-->\n\n<p align=\"center\"> \n<a href=\"https://mybinder.org/v2/gh/milaan9/Clustering_Algorithms_from_Scratch/HEAD\"><img src=\"https://mybinder.org/badge_logo.svg\" alt=\"binder\"/></a> \n</p>  \n\n\n# Unsupervised Learning\nThe 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.\n\n# Clustering\nClustering 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.\n\nUsage examples: market segmentation, social networks analysis, organize computing clusters, astronomical data analysis, image compression, etc.\n\n\n"
  }
]