From 95174ded1cf44fb07eb2455698c763f5ec4748c4 Mon Sep 17 00:00:00 2001 From: Nguyen Huu Son Date: Wed, 4 Jul 2018 23:26:43 +0900 Subject: [PATCH] Week3 --- machine-learning-ex2/ex2.pdf | Bin 0 -> 234128 bytes machine-learning-ex2/ex2/costFunction.m | 29 + machine-learning-ex2/ex2/costFunctionReg.m | 27 + machine-learning-ex2/ex2/ex2.m | 151 +++++ machine-learning-ex2/ex2/ex2_reg.m | 136 +++++ machine-learning-ex2/ex2/ex2data1.txt | 100 ++++ machine-learning-ex2/ex2/ex2data2.txt | 118 ++++ .../ex2/lib/jsonlab/AUTHORS.txt | 41 ++ .../ex2/lib/jsonlab/ChangeLog.txt | 74 +++ .../ex2/lib/jsonlab/LICENSE_BSD.txt | 25 + .../ex2/lib/jsonlab/README.txt | 394 ++++++++++++ .../ex2/lib/jsonlab/jsonopt.m | 32 + .../ex2/lib/jsonlab/loadjson.m | 566 ++++++++++++++++++ .../ex2/lib/jsonlab/loadubjson.m | 528 ++++++++++++++++ .../ex2/lib/jsonlab/mergestruct.m | 33 + .../ex2/lib/jsonlab/savejson.m | 475 +++++++++++++++ .../ex2/lib/jsonlab/saveubjson.m | 504 ++++++++++++++++ .../ex2/lib/jsonlab/varargin2struct.m | 40 ++ .../ex2/lib/makeValidFieldName.m | 30 + .../ex2/lib/submitWithConfiguration.m | 179 ++++++ machine-learning-ex2/ex2/mapFeature.m | 21 + machine-learning-ex2/ex2/plotData.m | 33 + .../ex2/plotDecisionBoundary.m | 48 ++ machine-learning-ex2/ex2/predict.m | 28 + machine-learning-ex2/ex2/sigmoid.m | 17 + machine-learning-ex2/ex2/submit.m | 62 ++ machine-learning-ex2/ex2/token.mat | 15 + 27 files changed, 3706 insertions(+) create mode 100644 machine-learning-ex2/ex2.pdf create mode 100644 machine-learning-ex2/ex2/costFunction.m create mode 100644 machine-learning-ex2/ex2/costFunctionReg.m create mode 100644 machine-learning-ex2/ex2/ex2.m create mode 100644 machine-learning-ex2/ex2/ex2_reg.m create mode 100644 machine-learning-ex2/ex2/ex2data1.txt create mode 100644 machine-learning-ex2/ex2/ex2data2.txt create mode 100644 machine-learning-ex2/ex2/lib/jsonlab/AUTHORS.txt create mode 100644 machine-learning-ex2/ex2/lib/jsonlab/ChangeLog.txt create mode 100644 machine-learning-ex2/ex2/lib/jsonlab/LICENSE_BSD.txt create mode 100644 machine-learning-ex2/ex2/lib/jsonlab/README.txt create mode 100644 machine-learning-ex2/ex2/lib/jsonlab/jsonopt.m create mode 100644 machine-learning-ex2/ex2/lib/jsonlab/loadjson.m create mode 100644 machine-learning-ex2/ex2/lib/jsonlab/loadubjson.m create mode 100644 machine-learning-ex2/ex2/lib/jsonlab/mergestruct.m create mode 100644 machine-learning-ex2/ex2/lib/jsonlab/savejson.m create mode 100644 machine-learning-ex2/ex2/lib/jsonlab/saveubjson.m create mode 100644 machine-learning-ex2/ex2/lib/jsonlab/varargin2struct.m create mode 100644 machine-learning-ex2/ex2/lib/makeValidFieldName.m create mode 100644 machine-learning-ex2/ex2/lib/submitWithConfiguration.m create mode 100644 machine-learning-ex2/ex2/mapFeature.m create mode 100644 machine-learning-ex2/ex2/plotData.m create mode 100644 machine-learning-ex2/ex2/plotDecisionBoundary.m create mode 100644 machine-learning-ex2/ex2/predict.m create mode 100644 machine-learning-ex2/ex2/sigmoid.m create mode 100644 machine-learning-ex2/ex2/submit.m create mode 100644 machine-learning-ex2/ex2/token.mat diff --git a/machine-learning-ex2/ex2.pdf b/machine-learning-ex2/ex2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1453af8176200604381af52e948c07e8e43c04a2 GIT binary patch literal 234128 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 GF8x2&mZzrx literal 0 HcmV?d00001 diff --git a/machine-learning-ex2/ex2/costFunction.m b/machine-learning-ex2/ex2/costFunction.m new file mode 100644 index 0000000..18fb5b0 --- /dev/null +++ b/machine-learning-ex2/ex2/costFunction.m @@ -0,0 +1,29 @@ +function [J, grad] = costFunction(theta, X, y) +%COSTFUNCTION Compute cost and gradient for logistic regression +% J = COSTFUNCTION(theta, X, y) computes the cost of using theta as the +% parameter for logistic regression and the gradient of the cost +% w.r.t. to the parameters. + +% Initialize some useful values +m = length(y); % number of training examples + +% You need to return the following variables correctly +J = 0; +grad = zeros(size(theta)); + +% ====================== YOUR CODE HERE ====================== +% Instructions: Compute the cost of a particular choice of theta. +% You should set J to the cost. +% Compute the partial derivatives and set grad to the partial +% derivatives of the cost w.r.t. each parameter in theta +% +% Note: grad should have the same dimensions as theta +% + +h = sigmoid(X * theta); + +J = (1 / m) * sum(-y .* log(h) - (1 - y) .* log(1 - h)); +grad = (1/m) .* (X' * (h-y)); +% ============================================================= + +end diff --git a/machine-learning-ex2/ex2/costFunctionReg.m b/machine-learning-ex2/ex2/costFunctionReg.m new file mode 100644 index 0000000..15daf2a --- /dev/null +++ b/machine-learning-ex2/ex2/costFunctionReg.m @@ -0,0 +1,27 @@ +function [J, grad] = costFunctionReg(theta, X, y, lambda) +%COSTFUNCTIONREG Compute cost and gradient for logistic regression with regularization +% J = COSTFUNCTIONREG(theta, X, y, lambda) computes the cost of using +% theta as the parameter for regularized logistic regression and the +% gradient of the cost w.r.t. to the parameters. + +% Initialize some useful values +m = length(y); % number of training examples + +% You need to return the following variables correctly +J = 0; +grad = zeros(size(theta)); + +% ====================== YOUR CODE HERE ====================== +% Instructions: Compute the cost of a particular choice of theta. +% You should set J to the cost. +% Compute the partial derivatives and set grad to the partial +% derivatives of the cost w.r.t. each parameter in theta + +h = sigmoid(X * theta); + +J = (1 / m) * sum(-y .* log(h) - (1 - y) .* log(1 - h)) + (lambda/(2*m)) * sum(theta(2:end, 1).^2); +grad = (1/m) .* (X' * (h-y)) + [0; (lambda/m)*theta(2:end, 1)]; + +% ============================================================= + +end diff --git a/machine-learning-ex2/ex2/ex2.m b/machine-learning-ex2/ex2/ex2.m new file mode 100644 index 0000000..6be4016 --- /dev/null +++ b/machine-learning-ex2/ex2/ex2.m @@ -0,0 +1,151 @@ +%% Machine Learning Online Class - Exercise 2: Logistic Regression +% +% Instructions +% ------------ +% +% This file contains code that helps you get started on the logistic +% regression exercise. You will need to complete the following functions +% in this exericse: +% +% sigmoid.m +% costFunction.m +% predict.m +% costFunctionReg.m +% +% For this exercise, you will not need to change any code in this file, +% or any other files other than those mentioned above. +% + +%% Initialization +clear ; close all; clc + +%% Load Data +% The first two columns contains the exam scores and the third column +% contains the label. + +data = load('ex2data1.txt'); +X = data(:, [1, 2]); y = data(:, 3); + +%% ==================== Part 1: Plotting ==================== +% We start the exercise by first plotting the data to understand the +% the problem we are working with. + +fprintf(['Plotting data with + indicating (y = 1) examples and o ' ... + 'indicating (y = 0) examples.\n']); + +plotData(X, y); + +% Put some labels +hold on; +% Labels and Legend +xlabel('Exam 1 score') +ylabel('Exam 2 score') + +% Specified in plot order +legend('Admitted', 'Not admitted') +hold off; + +fprintf('\nProgram paused. Press enter to continue.\n'); +pause; + + +%% ============ Part 2: Compute Cost and Gradient ============ +% In this part of the exercise, you will implement the cost and gradient +% for logistic regression. You neeed to complete the code in +% costFunction.m + +% Setup the data matrix appropriately, and add ones for the intercept term +[m, n] = size(X); + +% Add intercept term to x and X_test +X = [ones(m, 1) X]; + +% Initialize fitting parameters +initial_theta = zeros(n + 1, 1); + +% Compute and display initial cost and gradient +[cost, grad] = costFunction(initial_theta, X, y); + +fprintf('Cost at initial theta (zeros): %f\n', cost); +fprintf('Expected cost (approx): 0.693\n'); +fprintf('Gradient at initial theta (zeros): \n'); +fprintf(' %f \n', grad); +fprintf('Expected gradients (approx):\n -0.1000\n -12.0092\n -11.2628\n'); + +% Compute and display cost and gradient with non-zero theta +test_theta = [-24; 0.2; 0.2]; +[cost, grad] = costFunction(test_theta, X, y); + +fprintf('\nCost at test theta: %f\n', cost); +fprintf('Expected cost (approx): 0.218\n'); +fprintf('Gradient at test theta: \n'); +fprintf(' %f \n', grad); +fprintf('Expected gradients (approx):\n 0.043\n 2.566\n 2.647\n'); + +fprintf('\nProgram paused. Press enter to continue.\n'); +pause; + + +%% ============= Part 3: Optimizing using fminunc ============= +% In this exercise, you will use a built-in function (fminunc) to find the +% optimal parameters theta. + +% Set options for fminunc +options = optimset('GradObj', 'on', 'MaxIter', 400); + +% Run fminunc to obtain the optimal theta +% This function will return theta and the cost +[theta, cost] = ... + fminunc(@(t)(costFunction(t, X, y)), initial_theta, options); + +% Print theta to screen +fprintf('Cost at theta found by fminunc: %f\n', cost); +fprintf('Expected cost (approx): 0.203\n'); +fprintf('theta: \n'); +fprintf(' %f \n', theta); +fprintf('Expected theta (approx):\n'); +fprintf(' -25.161\n 0.206\n 0.201\n'); + +% Plot Boundary +plotDecisionBoundary(theta, X, y); + +% Put some labels +hold on; +% Labels and Legend +xlabel('Exam 1 score') +ylabel('Exam 2 score') + +% Specified in plot order +legend('Admitted', 'Not admitted') +hold off; + +fprintf('\nProgram paused. Press enter to continue.\n'); +pause; + +%% ============== Part 4: Predict and Accuracies ============== +% After learning the parameters, you'll like to use it to predict the outcomes +% on unseen data. In this part, you will use the logistic regression model +% to predict the probability that a student with score 45 on exam 1 and +% score 85 on exam 2 will be admitted. +% +% Furthermore, you will compute the training and test set accuracies of +% our model. +% +% Your task is to complete the code in predict.m + +% Predict probability for a student with score 45 on exam 1 +% and score 85 on exam 2 + +prob = sigmoid([1 45 85] * theta); +fprintf(['For a student with scores 45 and 85, we predict an admission ' ... + 'probability of %f\n'], prob); +fprintf('Expected value: 0.775 +/- 0.002\n\n'); + +% Compute accuracy on our training set +p = predict(theta, X); + +fprintf('Train Accuracy: %f\n', mean(double(p == y)) * 100); +fprintf('Expected accuracy (approx): 89.0\n'); +fprintf('\n'); + +pause; diff --git a/machine-learning-ex2/ex2/ex2_reg.m b/machine-learning-ex2/ex2/ex2_reg.m new file mode 100644 index 0000000..025b261 --- /dev/null +++ b/machine-learning-ex2/ex2/ex2_reg.m @@ -0,0 +1,136 @@ +%% Machine Learning Online Class - Exercise 2: Logistic Regression +% +% Instructions +% ------------ +% +% This file contains code that helps you get started on the second part +% of the exercise which covers regularization with logistic regression. +% +% You will need to complete the following functions in this exericse: +% +% sigmoid.m +% costFunction.m +% predict.m +% costFunctionReg.m +% +% For this exercise, you will not need to change any code in this file, +% or any other files other than those mentioned above. +% + +%% Initialization +clear ; close all; clc + +%% Load Data +% The first two columns contains the X values and the third column +% contains the label (y). + +data = load('ex2data2.txt'); +X = data(:, [1, 2]); y = data(:, 3); + +plotData(X, y); + +% Put some labels +hold on; + +% Labels and Legend +xlabel('Microchip Test 1') +ylabel('Microchip Test 2') + +% Specified in plot order +legend('y = 1', 'y = 0') +hold off; + + +%% =========== Part 1: Regularized Logistic Regression ============ +% In this part, you are given a dataset with data points that are not +% linearly separable. However, you would still like to use logistic +% regression to classify the data points. +% +% To do so, you introduce more features to use -- in particular, you add +% polynomial features to our data matrix (similar to polynomial +% regression). +% + +% Add Polynomial Features + +% Note that mapFeature also adds a column of ones for us, so the intercept +% term is handled +X = mapFeature(X(:,1), X(:,2)); + +% Initialize fitting parameters +initial_theta = zeros(size(X, 2), 1); + +% Set regularization parameter lambda to 1 +lambda = 1; + +% Compute and display initial cost and gradient for regularized logistic +% regression +[cost, grad] = costFunctionReg(initial_theta, X, y, lambda); + +fprintf('Cost at initial theta (zeros): %f\n', cost); +fprintf('Expected cost (approx): 0.693\n'); +fprintf('Gradient at initial theta (zeros) - first five values only:\n'); +fprintf(' %f \n', grad(1:5)); +fprintf('Expected gradients (approx) - first five values only:\n'); +fprintf(' 0.0085\n 0.0188\n 0.0001\n 0.0503\n 0.0115\n'); + +fprintf('\nProgram paused. Press enter to continue.\n'); +pause; + +% Compute and display cost and gradient +% with all-ones theta and lambda = 10 +test_theta = ones(size(X,2),1); +[cost, grad] = costFunctionReg(test_theta, X, y, 10); + +fprintf('\nCost at test theta (with lambda = 10): %f\n', cost); +fprintf('Expected cost (approx): 3.16\n'); +fprintf('Gradient at test theta - first five values only:\n'); +fprintf(' %f \n', grad(1:5)); +fprintf('Expected gradients (approx) - first five values only:\n'); +fprintf(' 0.3460\n 0.1614\n 0.1948\n 0.2269\n 0.0922\n'); + +fprintf('\nProgram paused. Press enter to continue.\n'); +pause; + +%% ============= Part 2: Regularization and Accuracies ============= +% Optional Exercise: +% In this part, you will get to try different values of lambda and +% see how regularization affects the decision coundart +% +% Try the following values of lambda (0, 1, 10, 100). +% +% How does the decision boundary change when you vary lambda? How does +% the training set accuracy vary? +% + +% Initialize fitting parameters +initial_theta = zeros(size(X, 2), 1); + +% Set regularization parameter lambda to 1 (you should vary this) +lambda = 1; + +% Set Options +options = optimset('GradObj', 'on', 'MaxIter', 400); + +% Optimize +[theta, J, exit_flag] = ... + fminunc(@(t)(costFunctionReg(t, X, y, lambda)), initial_theta, options); + +% Plot Boundary +plotDecisionBoundary(theta, X, y); +hold on; +title(sprintf('lambda = %g', lambda)) + +% Labels and Legend +xlabel('Microchip Test 1') +ylabel('Microchip Test 2') + +legend('y = 1', 'y = 0', 'Decision boundary') +hold off; + +% Compute accuracy on our training set +p = predict(theta, X); + +fprintf('Train Accuracy: %f\n', mean(double(p == y)) * 100); +fprintf('Expected accuracy (with lambda = 1): 83.1 (approx)\n'); +pause; diff --git a/machine-learning-ex2/ex2/ex2data1.txt b/machine-learning-ex2/ex2/ex2data1.txt new file mode 100644 index 0000000..3a5f952 --- /dev/null +++ b/machine-learning-ex2/ex2/ex2data1.txt @@ -0,0 +1,100 @@ +34.62365962451697,78.0246928153624,0 +30.28671076822607,43.89499752400101,0 +35.84740876993872,72.90219802708364,0 +60.18259938620976,86.30855209546826,1 +79.0327360507101,75.3443764369103,1 +45.08327747668339,56.3163717815305,0 +61.10666453684766,96.51142588489624,1 +75.02474556738889,46.55401354116538,1 +76.09878670226257,87.42056971926803,1 +84.43281996120035,43.53339331072109,1 +95.86155507093572,38.22527805795094,0 +75.01365838958247,30.60326323428011,0 +82.30705337399482,76.48196330235604,1 +69.36458875970939,97.71869196188608,1 +39.53833914367223,76.03681085115882,0 +53.9710521485623,89.20735013750205,1 +69.07014406283025,52.74046973016765,1 +67.94685547711617,46.67857410673128,0 +70.66150955499435,92.92713789364831,1 +76.97878372747498,47.57596364975532,1 +67.37202754570876,42.83843832029179,0 +89.67677575072079,65.79936592745237,1 +50.534788289883,48.85581152764205,0 +34.21206097786789,44.20952859866288,0 +77.9240914545704,68.9723599933059,1 +62.27101367004632,69.95445795447587,1 +80.1901807509566,44.82162893218353,1 +93.114388797442,38.80067033713209,0 +61.83020602312595,50.25610789244621,0 +38.78580379679423,64.99568095539578,0 +61.379289447425,72.80788731317097,1 +85.40451939411645,57.05198397627122,1 +52.10797973193984,63.12762376881715,0 +52.04540476831827,69.43286012045222,1 +40.23689373545111,71.16774802184875,0 +54.63510555424817,52.21388588061123,0 +33.91550010906887,98.86943574220611,0 +64.17698887494485,80.90806058670817,1 +74.78925295941542,41.57341522824434,0 +34.1836400264419,75.2377203360134,0 +83.90239366249155,56.30804621605327,1 +51.54772026906181,46.85629026349976,0 +94.44336776917852,65.56892160559052,1 +82.36875375713919,40.61825515970618,0 +51.04775177128865,45.82270145776001,0 +62.22267576120188,52.06099194836679,0 +77.19303492601364,70.45820000180959,1 +97.77159928000232,86.7278223300282,1 +62.07306379667647,96.76882412413983,1 +91.56497449807442,88.69629254546599,1 +79.94481794066932,74.16311935043758,1 +99.2725269292572,60.99903099844988,1 +90.54671411399852,43.39060180650027,1 +34.52451385320009,60.39634245837173,0 +50.2864961189907,49.80453881323059,0 +49.58667721632031,59.80895099453265,0 +97.64563396007767,68.86157272420604,1 +32.57720016809309,95.59854761387875,0 +74.24869136721598,69.82457122657193,1 +71.79646205863379,78.45356224515052,1 +75.3956114656803,85.75993667331619,1 +35.28611281526193,47.02051394723416,0 +56.25381749711624,39.26147251058019,0 +30.05882244669796,49.59297386723685,0 +44.66826172480893,66.45008614558913,0 +66.56089447242954,41.09209807936973,0 +40.45755098375164,97.53518548909936,1 +49.07256321908844,51.88321182073966,0 +80.27957401466998,92.11606081344084,1 +66.74671856944039,60.99139402740988,1 +32.72283304060323,43.30717306430063,0 +64.0393204150601,78.03168802018232,1 +72.34649422579923,96.22759296761404,1 +60.45788573918959,73.09499809758037,1 +58.84095621726802,75.85844831279042,1 +99.82785779692128,72.36925193383885,1 +47.26426910848174,88.47586499559782,1 +50.45815980285988,75.80985952982456,1 +60.45555629271532,42.50840943572217,0 +82.22666157785568,42.71987853716458,0 +88.9138964166533,69.80378889835472,1 +94.83450672430196,45.69430680250754,1 +67.31925746917527,66.58935317747915,1 +57.23870631569862,59.51428198012956,1 +80.36675600171273,90.96014789746954,1 +68.46852178591112,85.59430710452014,1 +42.0754545384731,78.84478600148043,0 +75.47770200533905,90.42453899753964,1 +78.63542434898018,96.64742716885644,1 +52.34800398794107,60.76950525602592,0 +94.09433112516793,77.15910509073893,1 +90.44855097096364,87.50879176484702,1 +55.48216114069585,35.57070347228866,0 +74.49269241843041,84.84513684930135,1 +89.84580670720979,45.35828361091658,1 +83.48916274498238,48.38028579728175,1 +42.2617008099817,87.10385094025457,1 +99.31500880510394,68.77540947206617,1 +55.34001756003703,64.9319380069486,1 +74.77589300092767,89.52981289513276,1 diff --git a/machine-learning-ex2/ex2/ex2data2.txt b/machine-learning-ex2/ex2/ex2data2.txt new file mode 100644 index 0000000..a888992 --- /dev/null +++ b/machine-learning-ex2/ex2/ex2data2.txt @@ -0,0 +1,118 @@ +0.051267,0.69956,1 +-0.092742,0.68494,1 +-0.21371,0.69225,1 +-0.375,0.50219,1 +-0.51325,0.46564,1 +-0.52477,0.2098,1 +-0.39804,0.034357,1 +-0.30588,-0.19225,1 +0.016705,-0.40424,1 +0.13191,-0.51389,1 +0.38537,-0.56506,1 +0.52938,-0.5212,1 +0.63882,-0.24342,1 +0.73675,-0.18494,1 +0.54666,0.48757,1 +0.322,0.5826,1 +0.16647,0.53874,1 +-0.046659,0.81652,1 +-0.17339,0.69956,1 +-0.47869,0.63377,1 +-0.60541,0.59722,1 +-0.62846,0.33406,1 +-0.59389,0.005117,1 +-0.42108,-0.27266,1 +-0.11578,-0.39693,1 +0.20104,-0.60161,1 +0.46601,-0.53582,1 +0.67339,-0.53582,1 +-0.13882,0.54605,1 +-0.29435,0.77997,1 +-0.26555,0.96272,1 +-0.16187,0.8019,1 +-0.17339,0.64839,1 +-0.28283,0.47295,1 +-0.36348,0.31213,1 +-0.30012,0.027047,1 +-0.23675,-0.21418,1 +-0.06394,-0.18494,1 +0.062788,-0.16301,1 +0.22984,-0.41155,1 +0.2932,-0.2288,1 +0.48329,-0.18494,1 +0.64459,-0.14108,1 +0.46025,0.012427,1 +0.6273,0.15863,1 +0.57546,0.26827,1 +0.72523,0.44371,1 +0.22408,0.52412,1 +0.44297,0.67032,1 +0.322,0.69225,1 +0.13767,0.57529,1 +-0.0063364,0.39985,1 +-0.092742,0.55336,1 +-0.20795,0.35599,1 +-0.20795,0.17325,1 +-0.43836,0.21711,1 +-0.21947,-0.016813,1 +-0.13882,-0.27266,1 +0.18376,0.93348,0 +0.22408,0.77997,0 +0.29896,0.61915,0 +0.50634,0.75804,0 +0.61578,0.7288,0 +0.60426,0.59722,0 +0.76555,0.50219,0 +0.92684,0.3633,0 +0.82316,0.27558,0 +0.96141,0.085526,0 +0.93836,0.012427,0 +0.86348,-0.082602,0 +0.89804,-0.20687,0 +0.85196,-0.36769,0 +0.82892,-0.5212,0 +0.79435,-0.55775,0 +0.59274,-0.7405,0 +0.51786,-0.5943,0 +0.46601,-0.41886,0 +0.35081,-0.57968,0 +0.28744,-0.76974,0 +0.085829,-0.75512,0 +0.14919,-0.57968,0 +-0.13306,-0.4481,0 +-0.40956,-0.41155,0 +-0.39228,-0.25804,0 +-0.74366,-0.25804,0 +-0.69758,0.041667,0 +-0.75518,0.2902,0 +-0.69758,0.68494,0 +-0.4038,0.70687,0 +-0.38076,0.91886,0 +-0.50749,0.90424,0 +-0.54781,0.70687,0 +0.10311,0.77997,0 +0.057028,0.91886,0 +-0.10426,0.99196,0 +-0.081221,1.1089,0 +0.28744,1.087,0 +0.39689,0.82383,0 +0.63882,0.88962,0 +0.82316,0.66301,0 +0.67339,0.64108,0 +1.0709,0.10015,0 +-0.046659,-0.57968,0 +-0.23675,-0.63816,0 +-0.15035,-0.36769,0 +-0.49021,-0.3019,0 +-0.46717,-0.13377,0 +-0.28859,-0.060673,0 +-0.61118,-0.067982,0 +-0.66302,-0.21418,0 +-0.59965,-0.41886,0 +-0.72638,-0.082602,0 +-0.83007,0.31213,0 +-0.72062,0.53874,0 +-0.59389,0.49488,0 +-0.48445,0.99927,0 +-0.0063364,0.99927,0 +0.63265,-0.030612,0 diff --git a/machine-learning-ex2/ex2/lib/jsonlab/AUTHORS.txt b/machine-learning-ex2/ex2/lib/jsonlab/AUTHORS.txt new file mode 100644 index 0000000..9dd3fc7 --- /dev/null +++ b/machine-learning-ex2/ex2/lib/jsonlab/AUTHORS.txt @@ -0,0 +1,41 @@ +The author of "jsonlab" toolbox is Qianqian Fang. Qianqian +is currently an Assistant Professor at Massachusetts General Hospital, +Harvard Medical School. + +Address: Martinos Center for Biomedical Imaging, + Massachusetts General Hospital, + Harvard Medical School + Bldg 149, 13th St, Charlestown, MA 02129, USA +URL: http://nmr.mgh.harvard.edu/~fangq/ +Email: or + + +The script loadjson.m was built upon previous works by + +- Nedialko Krouchev: http://www.mathworks.com/matlabcentral/fileexchange/25713 + date: 2009/11/02 +- François Glineur: http://www.mathworks.com/matlabcentral/fileexchange/23393 + date: 2009/03/22 +- Joel Feenstra: http://www.mathworks.com/matlabcentral/fileexchange/20565 + date: 2008/07/03 + + +This toolbox contains patches submitted by the following contributors: + +- Blake Johnson + part of revision 341 + +- Niclas Borlin + various fixes in revision 394, including + - loadjson crashes for all-zero sparse matrix. + - loadjson crashes for empty sparse matrix. + - Non-zero size of 0-by-N and N-by-0 empty matrices is lost after savejson/loadjson. + - loadjson crashes for sparse real column vector. + - loadjson crashes for sparse complex column vector. + - Data is corrupted by savejson for sparse real row vector. + - savejson crashes for sparse complex row vector. + +- Yul Kang + patches for svn revision 415. + - savejson saves an empty cell array as [] instead of null + - loadjson differentiates an empty struct from an empty array diff --git a/machine-learning-ex2/ex2/lib/jsonlab/ChangeLog.txt b/machine-learning-ex2/ex2/lib/jsonlab/ChangeLog.txt new file mode 100644 index 0000000..07824f5 --- /dev/null +++ b/machine-learning-ex2/ex2/lib/jsonlab/ChangeLog.txt @@ -0,0 +1,74 @@ +============================================================================ + + JSONlab - a toolbox to encode/decode JSON/UBJSON files in MATLAB/Octave + +---------------------------------------------------------------------------- + +JSONlab ChangeLog (key features marked by *): + +== JSONlab 1.0 (codename: Optimus - Final), FangQ == + + 2015/01/02 polish help info for all major functions, update examples, finalize 1.0 + 2014/12/19 fix a bug to strictly respect NoRowBracket in savejson + +== JSONlab 1.0.0-RC2 (codename: Optimus - RC2), FangQ == + + 2014/11/22 show progress bar in loadjson ('ShowProgress') + 2014/11/17 add Compact option in savejson to output compact JSON format ('Compact') + 2014/11/17 add FastArrayParser in loadjson to specify fast parser applicable levels + 2014/09/18 start official github mirror: https://github.com/fangq/jsonlab + +== JSONlab 1.0.0-RC1 (codename: Optimus - RC1), FangQ == + + 2014/09/17 fix several compatibility issues when running on octave versions 3.2-3.8 + 2014/09/17 support 2D cell and struct arrays in both savejson and saveubjson + 2014/08/04 escape special characters in a JSON string + 2014/02/16 fix a bug when saving ubjson files + +== JSONlab 0.9.9 (codename: Optimus - beta), FangQ == + + 2014/01/22 use binary read and write in saveubjson and loadubjson + +== JSONlab 0.9.8-1 (codename: Optimus - alpha update 1), FangQ == + + 2013/10/07 better round-trip conservation for empty arrays and structs (patch submitted by Yul Kang) + +== JSONlab 0.9.8 (codename: Optimus - alpha), FangQ == + 2013/08/23 *universal Binary JSON (UBJSON) support, including both saveubjson and loadubjson + +== JSONlab 0.9.1 (codename: Rodimus, update 1), FangQ == + 2012/12/18 *handling of various empty and sparse matrices (fixes submitted by Niclas Borlin) + +== JSONlab 0.9.0 (codename: Rodimus), FangQ == + + 2012/06/17 *new format for an invalid leading char, unpacking hex code in savejson + 2012/06/01 support JSONP in savejson + 2012/05/25 fix the empty cell bug (reported by Cyril Davin) + 2012/04/05 savejson can save to a file (suggested by Patrick Rapin) + +== JSONlab 0.8.1 (codename: Sentiel, Update 1), FangQ == + + 2012/02/28 loadjson quotation mark escape bug, see http://bit.ly/yyk1nS + 2012/01/25 patch to handle root-less objects, contributed by Blake Johnson + +== JSONlab 0.8.0 (codename: Sentiel), FangQ == + + 2012/01/13 *speed up loadjson by 20 fold when parsing large data arrays in matlab + 2012/01/11 remove row bracket if an array has 1 element, suggested by Mykel Kochenderfer + 2011/12/22 *accept sequence of 'param',value input in savejson and loadjson + 2011/11/18 fix struct array bug reported by Mykel Kochenderfer + +== JSONlab 0.5.1 (codename: Nexus Update 1), FangQ == + + 2011/10/21 fix a bug in loadjson, previous code does not use any of the acceleration + 2011/10/20 loadjson supports JSON collections - concatenated JSON objects + +== JSONlab 0.5.0 (codename: Nexus), FangQ == + + 2011/10/16 package and release jsonlab 0.5.0 + 2011/10/15 *add json demo and regression test, support cpx numbers, fix double quote bug + 2011/10/11 *speed up readjson dramatically, interpret _Array* tags, show data in root level + 2011/10/10 create jsonlab project, start jsonlab website, add online documentation + 2011/10/07 *speed up savejson by 25x using sprintf instead of mat2str, add options support + 2011/10/06 *savejson works for structs, cells and arrays + 2011/09/09 derive loadjson from JSON parser from MATLAB Central, draft savejson.m diff --git a/machine-learning-ex2/ex2/lib/jsonlab/LICENSE_BSD.txt b/machine-learning-ex2/ex2/lib/jsonlab/LICENSE_BSD.txt new file mode 100644 index 0000000..32d66cb --- /dev/null +++ b/machine-learning-ex2/ex2/lib/jsonlab/LICENSE_BSD.txt @@ -0,0 +1,25 @@ +Copyright 2011-2015 Qianqian Fang . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are +permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of + conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list + of conditions and the following disclaimer in the documentation and/or other materials + provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those of the +authors and should not be interpreted as representing official policies, either expressed +or implied, of the copyright holders. diff --git a/machine-learning-ex2/ex2/lib/jsonlab/README.txt b/machine-learning-ex2/ex2/lib/jsonlab/README.txt new file mode 100644 index 0000000..7b4f732 --- /dev/null +++ b/machine-learning-ex2/ex2/lib/jsonlab/README.txt @@ -0,0 +1,394 @@ +=============================================================================== += JSONLab = += An open-source MATLAB/Octave JSON encoder and decoder = +=============================================================================== + +*Copyright (C) 2011-2015 Qianqian Fang +*License: BSD License, see License_BSD.txt for details +*Version: 1.0 (Optimus - Final) + +------------------------------------------------------------------------------- + +Table of Content: + +I. Introduction +II. Installation +III.Using JSONLab +IV. Known Issues and TODOs +V. Contribution and feedback + +------------------------------------------------------------------------------- + +I. Introduction + +JSON ([http://www.json.org/ JavaScript Object Notation]) is a highly portable, +human-readable and "[http://en.wikipedia.org/wiki/JSON fat-free]" text format +to represent complex and hierarchical data. It is as powerful as +[http://en.wikipedia.org/wiki/XML XML], but less verbose. JSON format is widely +used for data-exchange in applications, and is essential for the wild success +of [http://en.wikipedia.org/wiki/Ajax_(programming) Ajax] and +[http://en.wikipedia.org/wiki/Web_2.0 Web2.0]. + +UBJSON (Universal Binary JSON) is a binary JSON format, specifically +optimized for compact file size and better performance while keeping +the semantics as simple as the text-based JSON format. Using the UBJSON +format allows to wrap complex binary data in a flexible and extensible +structure, making it possible to process complex and large dataset +without accuracy loss due to text conversions. + +We envision that both JSON and its binary version will serve as part of +the mainstream data-exchange formats for scientific research in the future. +It will provide the flexibility and generality achieved by other popular +general-purpose file specifications, such as +[http://www.hdfgroup.org/HDF5/whatishdf5.html HDF5], with significantly +reduced complexity and enhanced performance. + +JSONLab is a free and open-source implementation of a JSON/UBJSON encoder +and a decoder in the native MATLAB language. It can be used to convert a MATLAB +data structure (array, struct, cell, struct array and cell array) into +JSON/UBJSON formatted strings, or to decode a JSON/UBJSON file into MATLAB +data structure. JSONLab supports both MATLAB and +[http://www.gnu.org/software/octave/ GNU Octave] (a free MATLAB clone). + +------------------------------------------------------------------------------- + +II. Installation + +The installation of JSONLab is no different than any other simple +MATLAB toolbox. You only need to download/unzip the JSONLab package +to a folder, and add the folder's path to MATLAB/Octave's path list +by using the following command: + + addpath('/path/to/jsonlab'); + +If you want to add this path permanently, you need to type "pathtool", +browse to the jsonlab root folder and add to the list, then click "Save". +Then, run "rehash" in MATLAB, and type "which loadjson", if you see an +output, that means JSONLab is installed for MATLAB/Octave. + +------------------------------------------------------------------------------- + +III.Using JSONLab + +JSONLab provides two functions, loadjson.m -- a MATLAB->JSON decoder, +and savejson.m -- a MATLAB->JSON encoder, for the text-based JSON, and +two equivallent functions -- loadubjson and saveubjson for the binary +JSON. The detailed help info for the four functions can be found below: + +=== loadjson.m === +
+  data=loadjson(fname,opt)
+     or
+  data=loadjson(fname,'param1',value1,'param2',value2,...)
+ 
+  parse a JSON (JavaScript Object Notation) file or string
+ 
+  authors:Qianqian Fang (fangq nmr.mgh.harvard.edu)
+  created on 2011/09/09, including previous works from 
+ 
+          Nedialko Krouchev: http://www.mathworks.com/matlabcentral/fileexchange/25713
+             created on 2009/11/02
+          François Glineur: http://www.mathworks.com/matlabcentral/fileexchange/23393
+             created on  2009/03/22
+          Joel Feenstra:
+          http://www.mathworks.com/matlabcentral/fileexchange/20565
+             created on 2008/07/03
+ 
+  $Id: loadjson.m 452 2014-11-22 16:43:33Z fangq $
+ 
+  input:
+       fname: input file name, if fname contains "{}" or "[]", fname
+              will be interpreted as a JSON string
+       opt: a struct to store parsing options, opt can be replaced by 
+            a list of ('param',value) pairs - the param string is equivallent
+            to a field in opt. opt can have the following 
+            fields (first in [.|.] is the default)
+ 
+            opt.SimplifyCell [0|1]: if set to 1, loadjson will call cell2mat
+                          for each element of the JSON data, and group 
+                          arrays based on the cell2mat rules.
+            opt.FastArrayParser [1|0 or integer]: if set to 1, use a
+                          speed-optimized array parser when loading an 
+                          array object. The fast array parser may 
+                          collapse block arrays into a single large
+                          array similar to rules defined in cell2mat; 0 to 
+                          use a legacy parser; if set to a larger-than-1
+                          value, this option will specify the minimum
+                          dimension to enable the fast array parser. For
+                          example, if the input is a 3D array, setting
+                          FastArrayParser to 1 will return a 3D array;
+                          setting to 2 will return a cell array of 2D
+                          arrays; setting to 3 will return to a 2D cell
+                          array of 1D vectors; setting to 4 will return a
+                          3D cell array.
+            opt.ShowProgress [0|1]: if set to 1, loadjson displays a progress bar.
+ 
+  output:
+       dat: a cell array, where {...} blocks are converted into cell arrays,
+            and [...] are converted to arrays
+ 
+  examples:
+       dat=loadjson('{"obj":{"string":"value","array":[1,2,3]}}')
+       dat=loadjson(['examples' filesep 'example1.json'])
+       dat=loadjson(['examples' filesep 'example1.json'],'SimplifyCell',1)
+
+ +=== savejson.m === + +
+  json=savejson(rootname,obj,filename)
+     or
+  json=savejson(rootname,obj,opt)
+  json=savejson(rootname,obj,'param1',value1,'param2',value2,...)
+ 
+  convert a MATLAB object (cell, struct or array) into a JSON (JavaScript
+  Object Notation) string
+ 
+  author: Qianqian Fang (fangq nmr.mgh.harvard.edu)
+  created on 2011/09/09
+ 
+  $Id: savejson.m 458 2014-12-19 22:17:17Z fangq $
+ 
+  input:
+       rootname: the name of the root-object, when set to '', the root name
+         is ignored, however, when opt.ForceRootName is set to 1 (see below),
+         the MATLAB variable name will be used as the root name.
+       obj: a MATLAB object (array, cell, cell array, struct, struct array).
+       filename: a string for the file name to save the output JSON data.
+       opt: a struct for additional options, ignore to use default values.
+         opt can have the following fields (first in [.|.] is the default)
+ 
+         opt.FileName [''|string]: a file name to save the output JSON data
+         opt.FloatFormat ['%.10g'|string]: format to show each numeric element
+                          of a 1D/2D array;
+         opt.ArrayIndent [1|0]: if 1, output explicit data array with
+                          precedent indentation; if 0, no indentation
+         opt.ArrayToStruct[0|1]: when set to 0, savejson outputs 1D/2D
+                          array in JSON array format; if sets to 1, an
+                          array will be shown as a struct with fields
+                          "_ArrayType_", "_ArraySize_" and "_ArrayData_"; for
+                          sparse arrays, the non-zero elements will be
+                          saved to _ArrayData_ field in triplet-format i.e.
+                          (ix,iy,val) and "_ArrayIsSparse_" will be added
+                          with a value of 1; for a complex array, the 
+                          _ArrayData_ array will include two columns 
+                          (4 for sparse) to record the real and imaginary 
+                          parts, and also "_ArrayIsComplex_":1 is added. 
+         opt.ParseLogical [0|1]: if this is set to 1, logical array elem
+                          will use true/false rather than 1/0.
+         opt.NoRowBracket [1|0]: if this is set to 1, arrays with a single
+                          numerical element will be shown without a square
+                          bracket, unless it is the root object; if 0, square
+                          brackets are forced for any numerical arrays.
+         opt.ForceRootName [0|1]: when set to 1 and rootname is empty, savejson
+                          will use the name of the passed obj variable as the 
+                          root object name; if obj is an expression and 
+                          does not have a name, 'root' will be used; if this 
+                          is set to 0 and rootname is empty, the root level 
+                          will be merged down to the lower level.
+         opt.Inf ['"$1_Inf_"'|string]: a customized regular expression pattern
+                          to represent +/-Inf. The matched pattern is '([-+]*)Inf'
+                          and $1 represents the sign. For those who want to use
+                          1e999 to represent Inf, they can set opt.Inf to '$11e999'
+         opt.NaN ['"_NaN_"'|string]: a customized regular expression pattern
+                          to represent NaN
+         opt.JSONP [''|string]: to generate a JSONP output (JSON with padding),
+                          for example, if opt.JSONP='foo', the JSON data is
+                          wrapped inside a function call as 'foo(...);'
+         opt.UnpackHex [1|0]: conver the 0x[hex code] output by loadjson 
+                          back to the string form
+         opt.SaveBinary [0|1]: 1 - save the JSON file in binary mode; 0 - text mode.
+         opt.Compact [0|1]: 1- out compact JSON format (remove all newlines and tabs)
+ 
+         opt can be replaced by a list of ('param',value) pairs. The param 
+         string is equivallent to a field in opt and is case sensitive.
+  output:
+       json: a string in the JSON format (see http://json.org)
+ 
+  examples:
+       jsonmesh=struct('MeshNode',[0 0 0;1 0 0;0 1 0;1 1 0;0 0 1;1 0 1;0 1 1;1 1 1],... 
+                'MeshTetra',[1 2 4 8;1 3 4 8;1 2 6 8;1 5 6 8;1 5 7 8;1 3 7 8],...
+                'MeshTri',[1 2 4;1 2 6;1 3 4;1 3 7;1 5 6;1 5 7;...
+                           2 8 4;2 8 6;3 8 4;3 8 7;5 8 6;5 8 7],...
+                'MeshCreator','FangQ','MeshTitle','T6 Cube',...
+                'SpecialData',[nan, inf, -inf]);
+       savejson('jmesh',jsonmesh)
+       savejson('',jsonmesh,'ArrayIndent',0,'FloatFormat','\t%.5g')
+ 
+ +=== loadubjson.m === + +
+  data=loadubjson(fname,opt)
+     or
+  data=loadubjson(fname,'param1',value1,'param2',value2,...)
+ 
+  parse a JSON (JavaScript Object Notation) file or string
+ 
+  authors:Qianqian Fang (fangq nmr.mgh.harvard.edu)
+  created on 2013/08/01
+ 
+  $Id: loadubjson.m 436 2014-08-05 20:51:40Z fangq $
+ 
+  input:
+       fname: input file name, if fname contains "{}" or "[]", fname
+              will be interpreted as a UBJSON string
+       opt: a struct to store parsing options, opt can be replaced by 
+            a list of ('param',value) pairs - the param string is equivallent
+            to a field in opt. opt can have the following 
+            fields (first in [.|.] is the default)
+ 
+            opt.SimplifyCell [0|1]: if set to 1, loadubjson will call cell2mat
+                          for each element of the JSON data, and group 
+                          arrays based on the cell2mat rules.
+            opt.IntEndian [B|L]: specify the endianness of the integer fields
+                          in the UBJSON input data. B - Big-Endian format for 
+                          integers (as required in the UBJSON specification); 
+                          L - input integer fields are in Little-Endian order.
+ 
+  output:
+       dat: a cell array, where {...} blocks are converted into cell arrays,
+            and [...] are converted to arrays
+ 
+  examples:
+       obj=struct('string','value','array',[1 2 3]);
+       ubjdata=saveubjson('obj',obj);
+       dat=loadubjson(ubjdata)
+       dat=loadubjson(['examples' filesep 'example1.ubj'])
+       dat=loadubjson(['examples' filesep 'example1.ubj'],'SimplifyCell',1)
+
+ +=== saveubjson.m === + +
+  json=saveubjson(rootname,obj,filename)
+     or
+  json=saveubjson(rootname,obj,opt)
+  json=saveubjson(rootname,obj,'param1',value1,'param2',value2,...)
+ 
+  convert a MATLAB object (cell, struct or array) into a Universal 
+  Binary JSON (UBJSON) binary string
+ 
+  author: Qianqian Fang (fangq nmr.mgh.harvard.edu)
+  created on 2013/08/17
+ 
+  $Id: saveubjson.m 440 2014-09-17 19:59:45Z fangq $
+ 
+  input:
+       rootname: the name of the root-object, when set to '', the root name
+         is ignored, however, when opt.ForceRootName is set to 1 (see below),
+         the MATLAB variable name will be used as the root name.
+       obj: a MATLAB object (array, cell, cell array, struct, struct array)
+       filename: a string for the file name to save the output UBJSON data
+       opt: a struct for additional options, ignore to use default values.
+         opt can have the following fields (first in [.|.] is the default)
+ 
+         opt.FileName [''|string]: a file name to save the output JSON data
+         opt.ArrayToStruct[0|1]: when set to 0, saveubjson outputs 1D/2D
+                          array in JSON array format; if sets to 1, an
+                          array will be shown as a struct with fields
+                          "_ArrayType_", "_ArraySize_" and "_ArrayData_"; for
+                          sparse arrays, the non-zero elements will be
+                          saved to _ArrayData_ field in triplet-format i.e.
+                          (ix,iy,val) and "_ArrayIsSparse_" will be added
+                          with a value of 1; for a complex array, the 
+                          _ArrayData_ array will include two columns 
+                          (4 for sparse) to record the real and imaginary 
+                          parts, and also "_ArrayIsComplex_":1 is added. 
+         opt.ParseLogical [1|0]: if this is set to 1, logical array elem
+                          will use true/false rather than 1/0.
+         opt.NoRowBracket [1|0]: if this is set to 1, arrays with a single
+                          numerical element will be shown without a square
+                          bracket, unless it is the root object; if 0, square
+                          brackets are forced for any numerical arrays.
+         opt.ForceRootName [0|1]: when set to 1 and rootname is empty, saveubjson
+                          will use the name of the passed obj variable as the 
+                          root object name; if obj is an expression and 
+                          does not have a name, 'root' will be used; if this 
+                          is set to 0 and rootname is empty, the root level 
+                          will be merged down to the lower level.
+         opt.JSONP [''|string]: to generate a JSONP output (JSON with padding),
+                          for example, if opt.JSON='foo', the JSON data is
+                          wrapped inside a function call as 'foo(...);'
+         opt.UnpackHex [1|0]: conver the 0x[hex code] output by loadjson 
+                          back to the string form
+ 
+         opt can be replaced by a list of ('param',value) pairs. The param 
+         string is equivallent to a field in opt and is case sensitive.
+  output:
+       json: a binary string in the UBJSON format (see http://ubjson.org)
+ 
+  examples:
+       jsonmesh=struct('MeshNode',[0 0 0;1 0 0;0 1 0;1 1 0;0 0 1;1 0 1;0 1 1;1 1 1],... 
+                'MeshTetra',[1 2 4 8;1 3 4 8;1 2 6 8;1 5 6 8;1 5 7 8;1 3 7 8],...
+                'MeshTri',[1 2 4;1 2 6;1 3 4;1 3 7;1 5 6;1 5 7;...
+                           2 8 4;2 8 6;3 8 4;3 8 7;5 8 6;5 8 7],...
+                'MeshCreator','FangQ','MeshTitle','T6 Cube',...
+                'SpecialData',[nan, inf, -inf]);
+       saveubjson('jsonmesh',jsonmesh)
+       saveubjson('jsonmesh',jsonmesh,'meshdata.ubj')
+
+ + +=== examples === + +Under the "examples" folder, you can find several scripts to demonstrate the +basic utilities of JSONLab. Running the "demo_jsonlab_basic.m" script, you +will see the conversions from MATLAB data structure to JSON text and backward. +In "jsonlab_selftest.m", we load complex JSON files downloaded from the Internet +and validate the loadjson/savejson functions for regression testing purposes. +Similarly, a "demo_ubjson_basic.m" script is provided to test the saveubjson +and loadubjson pairs for various matlab data structures. + +Please run these examples and understand how JSONLab works before you use +it to process your data. + +------------------------------------------------------------------------------- + +IV. Known Issues and TODOs + +JSONLab has several known limitations. We are striving to make it more general +and robust. Hopefully in a few future releases, the limitations become less. + +Here are the known issues: + +# 3D or higher dimensional cell/struct-arrays will be converted to 2D arrays; +# When processing names containing multi-byte characters, Octave and MATLAB \ +can give different field-names; you can use feature('DefaultCharacterSet','latin1') \ +in MATLAB to get consistant results +# savejson can not handle class and dataset. +# saveubjson converts a logical array into a uint8 ([U]) array +# an unofficial N-D array count syntax is implemented in saveubjson. We are \ +actively communicating with the UBJSON spec maintainer to investigate the \ +possibility of making it upstream +# loadubjson can not parse all UBJSON Specification (Draft 9) compliant \ +files, however, it can parse all UBJSON files produced by saveubjson. + +------------------------------------------------------------------------------- + +V. Contribution and feedback + +JSONLab is an open-source project. This means you can not only use it and modify +it as you wish, but also you can contribute your changes back to JSONLab so +that everyone else can enjoy the improvement. For anyone who want to contribute, +please download JSONLab source code from it's subversion repository by using the +following command: + + svn checkout svn://svn.code.sf.net/p/iso2mesh/code/trunk/jsonlab jsonlab + +You can make changes to the files as needed. Once you are satisfied with your +changes, and ready to share it with others, please cd the root directory of +JSONLab, and type + + svn diff > yourname_featurename.patch + +You then email the .patch file to JSONLab's maintainer, Qianqian Fang, at +the email address shown in the beginning of this file. Qianqian will review +the changes and commit it to the subversion if they are satisfactory. + +We appreciate any suggestions and feedbacks from you. Please use iso2mesh's +mailing list to report any questions you may have with JSONLab: + +http://groups.google.com/group/iso2mesh-users?hl=en&pli=1 + +(Subscription to the mailing list is needed in order to post messages). diff --git a/machine-learning-ex2/ex2/lib/jsonlab/jsonopt.m b/machine-learning-ex2/ex2/lib/jsonlab/jsonopt.m new file mode 100644 index 0000000..0bebd8d --- /dev/null +++ b/machine-learning-ex2/ex2/lib/jsonlab/jsonopt.m @@ -0,0 +1,32 @@ +function val=jsonopt(key,default,varargin) +% +% val=jsonopt(key,default,optstruct) +% +% setting options based on a struct. The struct can be produced +% by varargin2struct from a list of 'param','value' pairs +% +% authors:Qianqian Fang (fangq nmr.mgh.harvard.edu) +% +% $Id: loadjson.m 371 2012-06-20 12:43:06Z fangq $ +% +% input: +% key: a string with which one look up a value from a struct +% default: if the key does not exist, return default +% optstruct: a struct where each sub-field is a key +% +% output: +% val: if key exists, val=optstruct.key; otherwise val=default +% +% license: +% BSD, see LICENSE_BSD.txt files for details +% +% -- this function is part of jsonlab toolbox (http://iso2mesh.sf.net/cgi-bin/index.cgi?jsonlab) +% + +val=default; +if(nargin<=2) return; end +opt=varargin{1}; +if(isstruct(opt) && isfield(opt,key)) + val=getfield(opt,key); +end + diff --git a/machine-learning-ex2/ex2/lib/jsonlab/loadjson.m b/machine-learning-ex2/ex2/lib/jsonlab/loadjson.m new file mode 100644 index 0000000..42798c0 --- /dev/null +++ b/machine-learning-ex2/ex2/lib/jsonlab/loadjson.m @@ -0,0 +1,566 @@ +function data = loadjson(fname,varargin) +% +% data=loadjson(fname,opt) +% or +% data=loadjson(fname,'param1',value1,'param2',value2,...) +% +% parse a JSON (JavaScript Object Notation) file or string +% +% authors:Qianqian Fang (fangq nmr.mgh.harvard.edu) +% created on 2011/09/09, including previous works from +% +% Nedialko Krouchev: http://www.mathworks.com/matlabcentral/fileexchange/25713 +% created on 2009/11/02 +% François Glineur: http://www.mathworks.com/matlabcentral/fileexchange/23393 +% created on 2009/03/22 +% Joel Feenstra: +% http://www.mathworks.com/matlabcentral/fileexchange/20565 +% created on 2008/07/03 +% +% $Id: loadjson.m 460 2015-01-03 00:30:45Z fangq $ +% +% input: +% fname: input file name, if fname contains "{}" or "[]", fname +% will be interpreted as a JSON string +% opt: a struct to store parsing options, opt can be replaced by +% a list of ('param',value) pairs - the param string is equivallent +% to a field in opt. opt can have the following +% fields (first in [.|.] is the default) +% +% opt.SimplifyCell [0|1]: if set to 1, loadjson will call cell2mat +% for each element of the JSON data, and group +% arrays based on the cell2mat rules. +% opt.FastArrayParser [1|0 or integer]: if set to 1, use a +% speed-optimized array parser when loading an +% array object. The fast array parser may +% collapse block arrays into a single large +% array similar to rules defined in cell2mat; 0 to +% use a legacy parser; if set to a larger-than-1 +% value, this option will specify the minimum +% dimension to enable the fast array parser. For +% example, if the input is a 3D array, setting +% FastArrayParser to 1 will return a 3D array; +% setting to 2 will return a cell array of 2D +% arrays; setting to 3 will return to a 2D cell +% array of 1D vectors; setting to 4 will return a +% 3D cell array. +% opt.ShowProgress [0|1]: if set to 1, loadjson displays a progress bar. +% +% output: +% dat: a cell array, where {...} blocks are converted into cell arrays, +% and [...] are converted to arrays +% +% examples: +% dat=loadjson('{"obj":{"string":"value","array":[1,2,3]}}') +% dat=loadjson(['examples' filesep 'example1.json']) +% dat=loadjson(['examples' filesep 'example1.json'],'SimplifyCell',1) +% +% license: +% BSD, see LICENSE_BSD.txt files for details +% +% -- this function is part of JSONLab toolbox (http://iso2mesh.sf.net/cgi-bin/index.cgi?jsonlab) +% + +global pos inStr len esc index_esc len_esc isoct arraytoken + +if(regexp(fname,'[\{\}\]\[]','once')) + string=fname; +elseif(exist(fname,'file')) + fid = fopen(fname,'rb'); + string = fread(fid,inf,'uint8=>char')'; + fclose(fid); +else + error('input file does not exist'); +end + +pos = 1; len = length(string); inStr = string; +isoct=exist('OCTAVE_VERSION','builtin'); +arraytoken=find(inStr=='[' | inStr==']' | inStr=='"'); +jstr=regexprep(inStr,'\\\\',' '); +escquote=regexp(jstr,'\\"'); +arraytoken=sort([arraytoken escquote]); + +% String delimiters and escape chars identified to improve speed: +esc = find(inStr=='"' | inStr=='\' ); % comparable to: regexp(inStr, '["\\]'); +index_esc = 1; len_esc = length(esc); + +opt=varargin2struct(varargin{:}); + +if(jsonopt('ShowProgress',0,opt)==1) + opt.progressbar_=waitbar(0,'loading ...'); +end +jsoncount=1; +while pos <= len + switch(next_char) + case '{' + data{jsoncount} = parse_object(opt); + case '[' + data{jsoncount} = parse_array(opt); + otherwise + error_pos('Outer level structure must be an object or an array'); + end + jsoncount=jsoncount+1; +end % while + +jsoncount=length(data); +if(jsoncount==1 && iscell(data)) + data=data{1}; +end + +if(~isempty(data)) + if(isstruct(data)) % data can be a struct array + data=jstruct2array(data); + elseif(iscell(data)) + data=jcell2array(data); + end +end +if(isfield(opt,'progressbar_')) + close(opt.progressbar_); +end + +%% +function newdata=jcell2array(data) +len=length(data); +newdata=data; +for i=1:len + if(isstruct(data{i})) + newdata{i}=jstruct2array(data{i}); + elseif(iscell(data{i})) + newdata{i}=jcell2array(data{i}); + end +end + +%%------------------------------------------------------------------------- +function newdata=jstruct2array(data) +fn=fieldnames(data); +newdata=data; +len=length(data); +for i=1:length(fn) % depth-first + for j=1:len + if(isstruct(getfield(data(j),fn{i}))) + newdata(j)=setfield(newdata(j),fn{i},jstruct2array(getfield(data(j),fn{i}))); + end + end +end +if(~isempty(strmatch('x0x5F_ArrayType_',fn)) && ~isempty(strmatch('x0x5F_ArrayData_',fn))) + newdata=cell(len,1); + for j=1:len + ndata=cast(data(j).x0x5F_ArrayData_,data(j).x0x5F_ArrayType_); + iscpx=0; + if(~isempty(strmatch('x0x5F_ArrayIsComplex_',fn))) + if(data(j).x0x5F_ArrayIsComplex_) + iscpx=1; + end + end + if(~isempty(strmatch('x0x5F_ArrayIsSparse_',fn))) + if(data(j).x0x5F_ArrayIsSparse_) + if(~isempty(strmatch('x0x5F_ArraySize_',fn))) + dim=data(j).x0x5F_ArraySize_; + if(iscpx && size(ndata,2)==4-any(dim==1)) + ndata(:,end-1)=complex(ndata(:,end-1),ndata(:,end)); + end + if isempty(ndata) + % All-zeros sparse + ndata=sparse(dim(1),prod(dim(2:end))); + elseif dim(1)==1 + % Sparse row vector + ndata=sparse(1,ndata(:,1),ndata(:,2),dim(1),prod(dim(2:end))); + elseif dim(2)==1 + % Sparse column vector + ndata=sparse(ndata(:,1),1,ndata(:,2),dim(1),prod(dim(2:end))); + else + % Generic sparse array. + ndata=sparse(ndata(:,1),ndata(:,2),ndata(:,3),dim(1),prod(dim(2:end))); + end + else + if(iscpx && size(ndata,2)==4) + ndata(:,3)=complex(ndata(:,3),ndata(:,4)); + end + ndata=sparse(ndata(:,1),ndata(:,2),ndata(:,3)); + end + end + elseif(~isempty(strmatch('x0x5F_ArraySize_',fn))) + if(iscpx && size(ndata,2)==2) + ndata=complex(ndata(:,1),ndata(:,2)); + end + ndata=reshape(ndata(:),data(j).x0x5F_ArraySize_); + end + newdata{j}=ndata; + end + if(len==1) + newdata=newdata{1}; + end +end + +%%------------------------------------------------------------------------- +function object = parse_object(varargin) + parse_char('{'); + object = []; + if next_char ~= '}' + while 1 + str = parseStr(varargin{:}); + if isempty(str) + error_pos('Name of value at position %d cannot be empty'); + end + parse_char(':'); + val = parse_value(varargin{:}); + eval( sprintf( 'object.%s = val;', valid_field(str) ) ); + if next_char == '}' + break; + end + parse_char(','); + end + end + parse_char('}'); + +%%------------------------------------------------------------------------- + +function object = parse_array(varargin) % JSON array is written in row-major order +global pos inStr isoct + parse_char('['); + object = cell(0, 1); + dim2=[]; + arraydepth=jsonopt('JSONLAB_ArrayDepth_',1,varargin{:}); + pbar=jsonopt('progressbar_',-1,varargin{:}); + + if next_char ~= ']' + if(jsonopt('FastArrayParser',1,varargin{:})>=1 && arraydepth>=jsonopt('FastArrayParser',1,varargin{:})) + [endpos, e1l, e1r, maxlevel]=matching_bracket(inStr,pos); + arraystr=['[' inStr(pos:endpos)]; + arraystr=regexprep(arraystr,'"_NaN_"','NaN'); + arraystr=regexprep(arraystr,'"([-+]*)_Inf_"','$1Inf'); + arraystr(arraystr==sprintf('\n'))=[]; + arraystr(arraystr==sprintf('\r'))=[]; + %arraystr=regexprep(arraystr,'\s*,',','); % this is slow,sometimes needed + if(~isempty(e1l) && ~isempty(e1r)) % the array is in 2D or higher D + astr=inStr((e1l+1):(e1r-1)); + astr=regexprep(astr,'"_NaN_"','NaN'); + astr=regexprep(astr,'"([-+]*)_Inf_"','$1Inf'); + astr(astr==sprintf('\n'))=[]; + astr(astr==sprintf('\r'))=[]; + astr(astr==' ')=''; + if(isempty(find(astr=='[', 1))) % array is 2D + dim2=length(sscanf(astr,'%f,',[1 inf])); + end + else % array is 1D + astr=arraystr(2:end-1); + astr(astr==' ')=''; + [obj, count, errmsg, nextidx]=sscanf(astr,'%f,',[1,inf]); + if(nextidx>=length(astr)-1) + object=obj; + pos=endpos; + parse_char(']'); + return; + end + end + if(~isempty(dim2)) + astr=arraystr; + astr(astr=='[')=''; + astr(astr==']')=''; + astr(astr==' ')=''; + [obj, count, errmsg, nextidx]=sscanf(astr,'%f,',inf); + if(nextidx>=length(astr)-1) + object=reshape(obj,dim2,numel(obj)/dim2)'; + pos=endpos; + parse_char(']'); + if(pbar>0) + waitbar(pos/length(inStr),pbar,'loading ...'); + end + return; + end + end + arraystr=regexprep(arraystr,'\]\s*,','];'); + else + arraystr='['; + end + try + if(isoct && regexp(arraystr,'"','once')) + error('Octave eval can produce empty cells for JSON-like input'); + end + object=eval(arraystr); + pos=endpos; + catch + while 1 + newopt=varargin2struct(varargin{:},'JSONLAB_ArrayDepth_',arraydepth+1); + val = parse_value(newopt); + object{end+1} = val; + if next_char == ']' + break; + end + parse_char(','); + end + end + end + if(jsonopt('SimplifyCell',0,varargin{:})==1) + try + oldobj=object; + object=cell2mat(object')'; + if(iscell(oldobj) && isstruct(object) && numel(object)>1 && jsonopt('SimplifyCellArray',1,varargin{:})==0) + object=oldobj; + elseif(size(object,1)>1 && ndims(object)==2) + object=object'; + end + catch + end + end + parse_char(']'); + + if(pbar>0) + waitbar(pos/length(inStr),pbar,'loading ...'); + end +%%------------------------------------------------------------------------- + +function parse_char(c) + global pos inStr len + skip_whitespace; + if pos > len || inStr(pos) ~= c + error_pos(sprintf('Expected %c at position %%d', c)); + else + pos = pos + 1; + skip_whitespace; + end + +%%------------------------------------------------------------------------- + +function c = next_char + global pos inStr len + skip_whitespace; + if pos > len + c = []; + else + c = inStr(pos); + end + +%%------------------------------------------------------------------------- + +function skip_whitespace + global pos inStr len + while pos <= len && isspace(inStr(pos)) + pos = pos + 1; + end + +%%------------------------------------------------------------------------- +function str = parseStr(varargin) + global pos inStr len esc index_esc len_esc + % len, ns = length(inStr), keyboard + if inStr(pos) ~= '"' + error_pos('String starting with " expected at position %d'); + else + pos = pos + 1; + end + str = ''; + while pos <= len + while index_esc <= len_esc && esc(index_esc) < pos + index_esc = index_esc + 1; + end + if index_esc > len_esc + str = [str inStr(pos:len)]; + pos = len + 1; + break; + else + str = [str inStr(pos:esc(index_esc)-1)]; + pos = esc(index_esc); + end + nstr = length(str); switch inStr(pos) + case '"' + pos = pos + 1; + if(~isempty(str)) + if(strcmp(str,'_Inf_')) + str=Inf; + elseif(strcmp(str,'-_Inf_')) + str=-Inf; + elseif(strcmp(str,'_NaN_')) + str=NaN; + end + end + return; + case '\' + if pos+1 > len + error_pos('End of file reached right after escape character'); + end + pos = pos + 1; + switch inStr(pos) + case {'"' '\' '/'} + str(nstr+1) = inStr(pos); + pos = pos + 1; + case {'b' 'f' 'n' 'r' 't'} + str(nstr+1) = sprintf(['\' inStr(pos)]); + pos = pos + 1; + case 'u' + if pos+4 > len + error_pos('End of file reached in escaped unicode character'); + end + str(nstr+(1:6)) = inStr(pos-1:pos+4); + pos = pos + 5; + end + otherwise % should never happen + str(nstr+1) = inStr(pos), keyboard + pos = pos + 1; + end + end + error_pos('End of file while expecting end of inStr'); + +%%------------------------------------------------------------------------- + +function num = parse_number(varargin) + global pos inStr len isoct + currstr=inStr(pos:end); + numstr=0; + if(isoct~=0) + numstr=regexp(currstr,'^\s*-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+\-]?\d+)?','end'); + [num, one] = sscanf(currstr, '%f', 1); + delta=numstr+1; + else + [num, one, err, delta] = sscanf(currstr, '%f', 1); + if ~isempty(err) + error_pos('Error reading number at position %d'); + end + end + pos = pos + delta-1; + +%%------------------------------------------------------------------------- + +function val = parse_value(varargin) + global pos inStr len + true = 1; false = 0; + + pbar=jsonopt('progressbar_',-1,varargin{:}); + if(pbar>0) + waitbar(pos/len,pbar,'loading ...'); + end + + switch(inStr(pos)) + case '"' + val = parseStr(varargin{:}); + return; + case '[' + val = parse_array(varargin{:}); + return; + case '{' + val = parse_object(varargin{:}); + if isstruct(val) + if(~isempty(strmatch('x0x5F_ArrayType_',fieldnames(val), 'exact'))) + val=jstruct2array(val); + end + elseif isempty(val) + val = struct; + end + return; + case {'-','0','1','2','3','4','5','6','7','8','9'} + val = parse_number(varargin{:}); + return; + case 't' + if pos+3 <= len && strcmpi(inStr(pos:pos+3), 'true') + val = true; + pos = pos + 4; + return; + end + case 'f' + if pos+4 <= len && strcmpi(inStr(pos:pos+4), 'false') + val = false; + pos = pos + 5; + return; + end + case 'n' + if pos+3 <= len && strcmpi(inStr(pos:pos+3), 'null') + val = []; + pos = pos + 4; + return; + end + end + error_pos('Value expected at position %d'); +%%------------------------------------------------------------------------- + +function error_pos(msg) + global pos inStr len + poShow = max(min([pos-15 pos-1 pos pos+20],len),1); + if poShow(3) == poShow(2) + poShow(3:4) = poShow(2)+[0 -1]; % display nothing after + end + msg = [sprintf(msg, pos) ': ' ... + inStr(poShow(1):poShow(2)) '' inStr(poShow(3):poShow(4)) ]; + error( ['JSONparser:invalidFormat: ' msg] ); + +%%------------------------------------------------------------------------- + +function str = valid_field(str) +global isoct +% From MATLAB doc: field names must begin with a letter, which may be +% followed by any combination of letters, digits, and underscores. +% Invalid characters will be converted to underscores, and the prefix +% "x0x[Hex code]_" will be added if the first character is not a letter. + pos=regexp(str,'^[^A-Za-z]','once'); + if(~isempty(pos)) + if(~isoct) + str=regexprep(str,'^([^A-Za-z])','x0x${sprintf(''%X'',unicode2native($1))}_','once'); + else + str=sprintf('x0x%X_%s',char(str(1)),str(2:end)); + end + end + if(isempty(regexp(str,'[^0-9A-Za-z_]', 'once' ))) return; end + if(~isoct) + str=regexprep(str,'([^0-9A-Za-z_])','_0x${sprintf(''%X'',unicode2native($1))}_'); + else + pos=regexp(str,'[^0-9A-Za-z_]'); + if(isempty(pos)) return; end + str0=str; + pos0=[0 pos(:)' length(str)]; + str=''; + for i=1:length(pos) + str=[str str0(pos0(i)+1:pos(i)-1) sprintf('_0x%X_',str0(pos(i)))]; + end + if(pos(end)~=length(str)) + str=[str str0(pos0(end-1)+1:pos0(end))]; + end + end + %str(~isletter(str) & ~('0' <= str & str <= '9')) = '_'; + +%%------------------------------------------------------------------------- +function endpos = matching_quote(str,pos) +len=length(str); +while(pos1 && str(pos-1)=='\')) + endpos=pos; + return; + end + end + pos=pos+1; +end +error('unmatched quotation mark'); +%%------------------------------------------------------------------------- +function [endpos, e1l, e1r, maxlevel] = matching_bracket(str,pos) +global arraytoken +level=1; +maxlevel=level; +endpos=0; +bpos=arraytoken(arraytoken>=pos); +tokens=str(bpos); +len=length(tokens); +pos=1; +e1l=[]; +e1r=[]; +while(pos<=len) + c=tokens(pos); + if(c==']') + level=level-1; + if(isempty(e1r)) e1r=bpos(pos); end + if(level==0) + endpos=bpos(pos); + return + end + end + if(c=='[') + if(isempty(e1l)) e1l=bpos(pos); end + level=level+1; + maxlevel=max(maxlevel,level); + end + if(c=='"') + pos=matching_quote(tokens,pos+1); + end + pos=pos+1; +end +if(endpos==0) + error('unmatched "]"'); +end + diff --git a/machine-learning-ex2/ex2/lib/jsonlab/loadubjson.m b/machine-learning-ex2/ex2/lib/jsonlab/loadubjson.m new file mode 100644 index 0000000..0155115 --- /dev/null +++ b/machine-learning-ex2/ex2/lib/jsonlab/loadubjson.m @@ -0,0 +1,528 @@ +function data = loadubjson(fname,varargin) +% +% data=loadubjson(fname,opt) +% or +% data=loadubjson(fname,'param1',value1,'param2',value2,...) +% +% parse a JSON (JavaScript Object Notation) file or string +% +% authors:Qianqian Fang (fangq nmr.mgh.harvard.edu) +% created on 2013/08/01 +% +% $Id: loadubjson.m 460 2015-01-03 00:30:45Z fangq $ +% +% input: +% fname: input file name, if fname contains "{}" or "[]", fname +% will be interpreted as a UBJSON string +% opt: a struct to store parsing options, opt can be replaced by +% a list of ('param',value) pairs - the param string is equivallent +% to a field in opt. opt can have the following +% fields (first in [.|.] is the default) +% +% opt.SimplifyCell [0|1]: if set to 1, loadubjson will call cell2mat +% for each element of the JSON data, and group +% arrays based on the cell2mat rules. +% opt.IntEndian [B|L]: specify the endianness of the integer fields +% in the UBJSON input data. B - Big-Endian format for +% integers (as required in the UBJSON specification); +% L - input integer fields are in Little-Endian order. +% +% output: +% dat: a cell array, where {...} blocks are converted into cell arrays, +% and [...] are converted to arrays +% +% examples: +% obj=struct('string','value','array',[1 2 3]); +% ubjdata=saveubjson('obj',obj); +% dat=loadubjson(ubjdata) +% dat=loadubjson(['examples' filesep 'example1.ubj']) +% dat=loadubjson(['examples' filesep 'example1.ubj'],'SimplifyCell',1) +% +% license: +% BSD, see LICENSE_BSD.txt files for details +% +% -- this function is part of JSONLab toolbox (http://iso2mesh.sf.net/cgi-bin/index.cgi?jsonlab) +% + +global pos inStr len esc index_esc len_esc isoct arraytoken fileendian systemendian + +if(regexp(fname,'[\{\}\]\[]','once')) + string=fname; +elseif(exist(fname,'file')) + fid = fopen(fname,'rb'); + string = fread(fid,inf,'uint8=>char')'; + fclose(fid); +else + error('input file does not exist'); +end + +pos = 1; len = length(string); inStr = string; +isoct=exist('OCTAVE_VERSION','builtin'); +arraytoken=find(inStr=='[' | inStr==']' | inStr=='"'); +jstr=regexprep(inStr,'\\\\',' '); +escquote=regexp(jstr,'\\"'); +arraytoken=sort([arraytoken escquote]); + +% String delimiters and escape chars identified to improve speed: +esc = find(inStr=='"' | inStr=='\' ); % comparable to: regexp(inStr, '["\\]'); +index_esc = 1; len_esc = length(esc); + +opt=varargin2struct(varargin{:}); +fileendian=upper(jsonopt('IntEndian','B',opt)); +[os,maxelem,systemendian]=computer; + +jsoncount=1; +while pos <= len + switch(next_char) + case '{' + data{jsoncount} = parse_object(opt); + case '[' + data{jsoncount} = parse_array(opt); + otherwise + error_pos('Outer level structure must be an object or an array'); + end + jsoncount=jsoncount+1; +end % while + +jsoncount=length(data); +if(jsoncount==1 && iscell(data)) + data=data{1}; +end + +if(~isempty(data)) + if(isstruct(data)) % data can be a struct array + data=jstruct2array(data); + elseif(iscell(data)) + data=jcell2array(data); + end +end + + +%% +function newdata=parse_collection(id,data,obj) + +if(jsoncount>0 && exist('data','var')) + if(~iscell(data)) + newdata=cell(1); + newdata{1}=data; + data=newdata; + end +end + +%% +function newdata=jcell2array(data) +len=length(data); +newdata=data; +for i=1:len + if(isstruct(data{i})) + newdata{i}=jstruct2array(data{i}); + elseif(iscell(data{i})) + newdata{i}=jcell2array(data{i}); + end +end + +%%------------------------------------------------------------------------- +function newdata=jstruct2array(data) +fn=fieldnames(data); +newdata=data; +len=length(data); +for i=1:length(fn) % depth-first + for j=1:len + if(isstruct(getfield(data(j),fn{i}))) + newdata(j)=setfield(newdata(j),fn{i},jstruct2array(getfield(data(j),fn{i}))); + end + end +end +if(~isempty(strmatch('x0x5F_ArrayType_',fn)) && ~isempty(strmatch('x0x5F_ArrayData_',fn))) + newdata=cell(len,1); + for j=1:len + ndata=cast(data(j).x0x5F_ArrayData_,data(j).x0x5F_ArrayType_); + iscpx=0; + if(~isempty(strmatch('x0x5F_ArrayIsComplex_',fn))) + if(data(j).x0x5F_ArrayIsComplex_) + iscpx=1; + end + end + if(~isempty(strmatch('x0x5F_ArrayIsSparse_',fn))) + if(data(j).x0x5F_ArrayIsSparse_) + if(~isempty(strmatch('x0x5F_ArraySize_',fn))) + dim=double(data(j).x0x5F_ArraySize_); + if(iscpx && size(ndata,2)==4-any(dim==1)) + ndata(:,end-1)=complex(ndata(:,end-1),ndata(:,end)); + end + if isempty(ndata) + % All-zeros sparse + ndata=sparse(dim(1),prod(dim(2:end))); + elseif dim(1)==1 + % Sparse row vector + ndata=sparse(1,ndata(:,1),ndata(:,2),dim(1),prod(dim(2:end))); + elseif dim(2)==1 + % Sparse column vector + ndata=sparse(ndata(:,1),1,ndata(:,2),dim(1),prod(dim(2:end))); + else + % Generic sparse array. + ndata=sparse(ndata(:,1),ndata(:,2),ndata(:,3),dim(1),prod(dim(2:end))); + end + else + if(iscpx && size(ndata,2)==4) + ndata(:,3)=complex(ndata(:,3),ndata(:,4)); + end + ndata=sparse(ndata(:,1),ndata(:,2),ndata(:,3)); + end + end + elseif(~isempty(strmatch('x0x5F_ArraySize_',fn))) + if(iscpx && size(ndata,2)==2) + ndata=complex(ndata(:,1),ndata(:,2)); + end + ndata=reshape(ndata(:),data(j).x0x5F_ArraySize_); + end + newdata{j}=ndata; + end + if(len==1) + newdata=newdata{1}; + end +end + +%%------------------------------------------------------------------------- +function object = parse_object(varargin) + parse_char('{'); + object = []; + type=''; + count=-1; + if(next_char == '$') + type=inStr(pos+1); % TODO + pos=pos+2; + end + if(next_char == '#') + pos=pos+1; + count=double(parse_number()); + end + if next_char ~= '}' + num=0; + while 1 + str = parseStr(varargin{:}); + if isempty(str) + error_pos('Name of value at position %d cannot be empty'); + end + %parse_char(':'); + val = parse_value(varargin{:}); + num=num+1; + eval( sprintf( 'object.%s = val;', valid_field(str) ) ); + if next_char == '}' || (count>=0 && num>=count) + break; + end + %parse_char(','); + end + end + if(count==-1) + parse_char('}'); + end + +%%------------------------------------------------------------------------- +function [cid,len]=elem_info(type) +id=strfind('iUIlLdD',type); +dataclass={'int8','uint8','int16','int32','int64','single','double'}; +bytelen=[1,1,2,4,8,4,8]; +if(id>0) + cid=dataclass{id}; + len=bytelen(id); +else + error_pos('unsupported type at position %d'); +end +%%------------------------------------------------------------------------- + + +function [data adv]=parse_block(type,count,varargin) +global pos inStr isoct fileendian systemendian +[cid,len]=elem_info(type); +datastr=inStr(pos:pos+len*count-1); +if(isoct) + newdata=int8(datastr); +else + newdata=uint8(datastr); +end +id=strfind('iUIlLdD',type); +if(id<=5 && fileendian~=systemendian) + newdata=swapbytes(typecast(newdata,cid)); +end +data=typecast(newdata,cid); +adv=double(len*count); + +%%------------------------------------------------------------------------- + + +function object = parse_array(varargin) % JSON array is written in row-major order +global pos inStr isoct + parse_char('['); + object = cell(0, 1); + dim=[]; + type=''; + count=-1; + if(next_char == '$') + type=inStr(pos+1); + pos=pos+2; + end + if(next_char == '#') + pos=pos+1; + if(next_char=='[') + dim=parse_array(varargin{:}); + count=prod(double(dim)); + else + count=double(parse_number()); + end + end + if(~isempty(type)) + if(count>=0) + [object adv]=parse_block(type,count,varargin{:}); + if(~isempty(dim)) + object=reshape(object,dim); + end + pos=pos+adv; + return; + else + endpos=matching_bracket(inStr,pos); + [cid,len]=elem_info(type); + count=(endpos-pos)/len; + [object adv]=parse_block(type,count,varargin{:}); + pos=pos+adv; + parse_char(']'); + return; + end + end + if next_char ~= ']' + while 1 + val = parse_value(varargin{:}); + object{end+1} = val; + if next_char == ']' + break; + end + %parse_char(','); + end + end + if(jsonopt('SimplifyCell',0,varargin{:})==1) + try + oldobj=object; + object=cell2mat(object')'; + if(iscell(oldobj) && isstruct(object) && numel(object)>1 && jsonopt('SimplifyCellArray',1,varargin{:})==0) + object=oldobj; + elseif(size(object,1)>1 && ndims(object)==2) + object=object'; + end + catch + end + end + if(count==-1) + parse_char(']'); + end + +%%------------------------------------------------------------------------- + +function parse_char(c) + global pos inStr len + skip_whitespace; + if pos > len || inStr(pos) ~= c + error_pos(sprintf('Expected %c at position %%d', c)); + else + pos = pos + 1; + skip_whitespace; + end + +%%------------------------------------------------------------------------- + +function c = next_char + global pos inStr len + skip_whitespace; + if pos > len + c = []; + else + c = inStr(pos); + end + +%%------------------------------------------------------------------------- + +function skip_whitespace + global pos inStr len + while pos <= len && isspace(inStr(pos)) + pos = pos + 1; + end + +%%------------------------------------------------------------------------- +function str = parseStr(varargin) + global pos inStr esc index_esc len_esc + % len, ns = length(inStr), keyboard + type=inStr(pos); + if type ~= 'S' && type ~= 'C' && type ~= 'H' + error_pos('String starting with S expected at position %d'); + else + pos = pos + 1; + end + if(type == 'C') + str=inStr(pos); + pos=pos+1; + return; + end + bytelen=double(parse_number()); + if(length(inStr)>=pos+bytelen-1) + str=inStr(pos:pos+bytelen-1); + pos=pos+bytelen; + else + error_pos('End of file while expecting end of inStr'); + end + +%%------------------------------------------------------------------------- + +function num = parse_number(varargin) + global pos inStr len isoct fileendian systemendian + id=strfind('iUIlLdD',inStr(pos)); + if(isempty(id)) + error_pos('expecting a number at position %d'); + end + type={'int8','uint8','int16','int32','int64','single','double'}; + bytelen=[1,1,2,4,8,4,8]; + datastr=inStr(pos+1:pos+bytelen(id)); + if(isoct) + newdata=int8(datastr); + else + newdata=uint8(datastr); + end + if(id<=5 && fileendian~=systemendian) + newdata=swapbytes(typecast(newdata,type{id})); + end + num=typecast(newdata,type{id}); + pos = pos + bytelen(id)+1; + +%%------------------------------------------------------------------------- + +function val = parse_value(varargin) + global pos inStr len + true = 1; false = 0; + + switch(inStr(pos)) + case {'S','C','H'} + val = parseStr(varargin{:}); + return; + case '[' + val = parse_array(varargin{:}); + return; + case '{' + val = parse_object(varargin{:}); + if isstruct(val) + if(~isempty(strmatch('x0x5F_ArrayType_',fieldnames(val), 'exact'))) + val=jstruct2array(val); + end + elseif isempty(val) + val = struct; + end + return; + case {'i','U','I','l','L','d','D'} + val = parse_number(varargin{:}); + return; + case 'T' + val = true; + pos = pos + 1; + return; + case 'F' + val = false; + pos = pos + 1; + return; + case {'Z','N'} + val = []; + pos = pos + 1; + return; + end + error_pos('Value expected at position %d'); +%%------------------------------------------------------------------------- + +function error_pos(msg) + global pos inStr len + poShow = max(min([pos-15 pos-1 pos pos+20],len),1); + if poShow(3) == poShow(2) + poShow(3:4) = poShow(2)+[0 -1]; % display nothing after + end + msg = [sprintf(msg, pos) ': ' ... + inStr(poShow(1):poShow(2)) '' inStr(poShow(3):poShow(4)) ]; + error( ['JSONparser:invalidFormat: ' msg] ); + +%%------------------------------------------------------------------------- + +function str = valid_field(str) +global isoct +% From MATLAB doc: field names must begin with a letter, which may be +% followed by any combination of letters, digits, and underscores. +% Invalid characters will be converted to underscores, and the prefix +% "x0x[Hex code]_" will be added if the first character is not a letter. + pos=regexp(str,'^[^A-Za-z]','once'); + if(~isempty(pos)) + if(~isoct) + str=regexprep(str,'^([^A-Za-z])','x0x${sprintf(''%X'',unicode2native($1))}_','once'); + else + str=sprintf('x0x%X_%s',char(str(1)),str(2:end)); + end + end + if(isempty(regexp(str,'[^0-9A-Za-z_]', 'once' ))) return; end + if(~isoct) + str=regexprep(str,'([^0-9A-Za-z_])','_0x${sprintf(''%X'',unicode2native($1))}_'); + else + pos=regexp(str,'[^0-9A-Za-z_]'); + if(isempty(pos)) return; end + str0=str; + pos0=[0 pos(:)' length(str)]; + str=''; + for i=1:length(pos) + str=[str str0(pos0(i)+1:pos(i)-1) sprintf('_0x%X_',str0(pos(i)))]; + end + if(pos(end)~=length(str)) + str=[str str0(pos0(end-1)+1:pos0(end))]; + end + end + %str(~isletter(str) & ~('0' <= str & str <= '9')) = '_'; + +%%------------------------------------------------------------------------- +function endpos = matching_quote(str,pos) +len=length(str); +while(pos1 && str(pos-1)=='\')) + endpos=pos; + return; + end + end + pos=pos+1; +end +error('unmatched quotation mark'); +%%------------------------------------------------------------------------- +function [endpos e1l e1r maxlevel] = matching_bracket(str,pos) +global arraytoken +level=1; +maxlevel=level; +endpos=0; +bpos=arraytoken(arraytoken>=pos); +tokens=str(bpos); +len=length(tokens); +pos=1; +e1l=[]; +e1r=[]; +while(pos<=len) + c=tokens(pos); + if(c==']') + level=level-1; + if(isempty(e1r)) e1r=bpos(pos); end + if(level==0) + endpos=bpos(pos); + return + end + end + if(c=='[') + if(isempty(e1l)) e1l=bpos(pos); end + level=level+1; + maxlevel=max(maxlevel,level); + end + if(c=='"') + pos=matching_quote(tokens,pos+1); + end + pos=pos+1; +end +if(endpos==0) + error('unmatched "]"'); +end + diff --git a/machine-learning-ex2/ex2/lib/jsonlab/mergestruct.m b/machine-learning-ex2/ex2/lib/jsonlab/mergestruct.m new file mode 100644 index 0000000..6de6100 --- /dev/null +++ b/machine-learning-ex2/ex2/lib/jsonlab/mergestruct.m @@ -0,0 +1,33 @@ +function s=mergestruct(s1,s2) +% +% s=mergestruct(s1,s2) +% +% merge two struct objects into one +% +% authors:Qianqian Fang (fangq nmr.mgh.harvard.edu) +% date: 2012/12/22 +% +% input: +% s1,s2: a struct object, s1 and s2 can not be arrays +% +% output: +% s: the merged struct object. fields in s1 and s2 will be combined in s. +% +% license: +% BSD, see LICENSE_BSD.txt files for details +% +% -- this function is part of jsonlab toolbox (http://iso2mesh.sf.net/cgi-bin/index.cgi?jsonlab) +% + +if(~isstruct(s1) || ~isstruct(s2)) + error('input parameters contain non-struct'); +end +if(length(s1)>1 || length(s2)>1) + error('can not merge struct arrays'); +end +fn=fieldnames(s2); +s=s1; +for i=1:length(fn) + s=setfield(s,fn{i},getfield(s2,fn{i})); +end + diff --git a/machine-learning-ex2/ex2/lib/jsonlab/savejson.m b/machine-learning-ex2/ex2/lib/jsonlab/savejson.m new file mode 100644 index 0000000..7e84076 --- /dev/null +++ b/machine-learning-ex2/ex2/lib/jsonlab/savejson.m @@ -0,0 +1,475 @@ +function json=savejson(rootname,obj,varargin) +% +% json=savejson(rootname,obj,filename) +% or +% json=savejson(rootname,obj,opt) +% json=savejson(rootname,obj,'param1',value1,'param2',value2,...) +% +% convert a MATLAB object (cell, struct or array) into a JSON (JavaScript +% Object Notation) string +% +% author: Qianqian Fang (fangq nmr.mgh.harvard.edu) +% created on 2011/09/09 +% +% $Id: savejson.m 460 2015-01-03 00:30:45Z fangq $ +% +% input: +% rootname: the name of the root-object, when set to '', the root name +% is ignored, however, when opt.ForceRootName is set to 1 (see below), +% the MATLAB variable name will be used as the root name. +% obj: a MATLAB object (array, cell, cell array, struct, struct array). +% filename: a string for the file name to save the output JSON data. +% opt: a struct for additional options, ignore to use default values. +% opt can have the following fields (first in [.|.] is the default) +% +% opt.FileName [''|string]: a file name to save the output JSON data +% opt.FloatFormat ['%.10g'|string]: format to show each numeric element +% of a 1D/2D array; +% opt.ArrayIndent [1|0]: if 1, output explicit data array with +% precedent indentation; if 0, no indentation +% opt.ArrayToStruct[0|1]: when set to 0, savejson outputs 1D/2D +% array in JSON array format; if sets to 1, an +% array will be shown as a struct with fields +% "_ArrayType_", "_ArraySize_" and "_ArrayData_"; for +% sparse arrays, the non-zero elements will be +% saved to _ArrayData_ field in triplet-format i.e. +% (ix,iy,val) and "_ArrayIsSparse_" will be added +% with a value of 1; for a complex array, the +% _ArrayData_ array will include two columns +% (4 for sparse) to record the real and imaginary +% parts, and also "_ArrayIsComplex_":1 is added. +% opt.ParseLogical [0|1]: if this is set to 1, logical array elem +% will use true/false rather than 1/0. +% opt.NoRowBracket [1|0]: if this is set to 1, arrays with a single +% numerical element will be shown without a square +% bracket, unless it is the root object; if 0, square +% brackets are forced for any numerical arrays. +% opt.ForceRootName [0|1]: when set to 1 and rootname is empty, savejson +% will use the name of the passed obj variable as the +% root object name; if obj is an expression and +% does not have a name, 'root' will be used; if this +% is set to 0 and rootname is empty, the root level +% will be merged down to the lower level. +% opt.Inf ['"$1_Inf_"'|string]: a customized regular expression pattern +% to represent +/-Inf. The matched pattern is '([-+]*)Inf' +% and $1 represents the sign. For those who want to use +% 1e999 to represent Inf, they can set opt.Inf to '$11e999' +% opt.NaN ['"_NaN_"'|string]: a customized regular expression pattern +% to represent NaN +% opt.JSONP [''|string]: to generate a JSONP output (JSON with padding), +% for example, if opt.JSONP='foo', the JSON data is +% wrapped inside a function call as 'foo(...);' +% opt.UnpackHex [1|0]: conver the 0x[hex code] output by loadjson +% back to the string form +% opt.SaveBinary [0|1]: 1 - save the JSON file in binary mode; 0 - text mode. +% opt.Compact [0|1]: 1- out compact JSON format (remove all newlines and tabs) +% +% opt can be replaced by a list of ('param',value) pairs. The param +% string is equivallent to a field in opt and is case sensitive. +% output: +% json: a string in the JSON format (see http://json.org) +% +% examples: +% jsonmesh=struct('MeshNode',[0 0 0;1 0 0;0 1 0;1 1 0;0 0 1;1 0 1;0 1 1;1 1 1],... +% 'MeshTetra',[1 2 4 8;1 3 4 8;1 2 6 8;1 5 6 8;1 5 7 8;1 3 7 8],... +% 'MeshTri',[1 2 4;1 2 6;1 3 4;1 3 7;1 5 6;1 5 7;... +% 2 8 4;2 8 6;3 8 4;3 8 7;5 8 6;5 8 7],... +% 'MeshCreator','FangQ','MeshTitle','T6 Cube',... +% 'SpecialData',[nan, inf, -inf]); +% savejson('jmesh',jsonmesh) +% savejson('',jsonmesh,'ArrayIndent',0,'FloatFormat','\t%.5g') +% +% license: +% BSD, see LICENSE_BSD.txt files for details +% +% -- this function is part of JSONLab toolbox (http://iso2mesh.sf.net/cgi-bin/index.cgi?jsonlab) +% + +if(nargin==1) + varname=inputname(1); + obj=rootname; + if(isempty(varname)) + varname='root'; + end + rootname=varname; +else + varname=inputname(2); +end +if(length(varargin)==1 && ischar(varargin{1})) + opt=struct('FileName',varargin{1}); +else + opt=varargin2struct(varargin{:}); +end +opt.IsOctave=exist('OCTAVE_VERSION','builtin'); +rootisarray=0; +rootlevel=1; +forceroot=jsonopt('ForceRootName',0,opt); +if((isnumeric(obj) || islogical(obj) || ischar(obj) || isstruct(obj) || iscell(obj)) && isempty(rootname) && forceroot==0) + rootisarray=1; + rootlevel=0; +else + if(isempty(rootname)) + rootname=varname; + end +end +if((isstruct(obj) || iscell(obj))&& isempty(rootname) && forceroot) + rootname='root'; +end + +whitespaces=struct('tab',sprintf('\t'),'newline',sprintf('\n'),'sep',sprintf(',\n')); +if(jsonopt('Compact',0,opt)==1) + whitespaces=struct('tab','','newline','','sep',','); +end +if(~isfield(opt,'whitespaces_')) + opt.whitespaces_=whitespaces; +end + +nl=whitespaces.newline; + +json=obj2json(rootname,obj,rootlevel,opt); +if(rootisarray) + json=sprintf('%s%s',json,nl); +else + json=sprintf('{%s%s%s}\n',nl,json,nl); +end + +jsonp=jsonopt('JSONP','',opt); +if(~isempty(jsonp)) + json=sprintf('%s(%s);%s',jsonp,json,nl); +end + +% save to a file if FileName is set, suggested by Patrick Rapin +if(~isempty(jsonopt('FileName','',opt))) + if(jsonopt('SaveBinary',0,opt)==1) + fid = fopen(opt.FileName, 'wb'); + fwrite(fid,json); + else + fid = fopen(opt.FileName, 'wt'); + fwrite(fid,json,'char'); + end + fclose(fid); +end + +%%------------------------------------------------------------------------- +function txt=obj2json(name,item,level,varargin) + +if(iscell(item)) + txt=cell2json(name,item,level,varargin{:}); +elseif(isstruct(item)) + txt=struct2json(name,item,level,varargin{:}); +elseif(ischar(item)) + txt=str2json(name,item,level,varargin{:}); +else + txt=mat2json(name,item,level,varargin{:}); +end + +%%------------------------------------------------------------------------- +function txt=cell2json(name,item,level,varargin) +txt=''; +if(~iscell(item)) + error('input is not a cell'); +end + +dim=size(item); +if(ndims(squeeze(item))>2) % for 3D or higher dimensions, flatten to 2D for now + item=reshape(item,dim(1),numel(item)/dim(1)); + dim=size(item); +end +len=numel(item); +ws=jsonopt('whitespaces_',struct('tab',sprintf('\t'),'newline',sprintf('\n'),'sep',sprintf(',\n')),varargin{:}); +padding0=repmat(ws.tab,1,level); +padding2=repmat(ws.tab,1,level+1); +nl=ws.newline; +if(len>1) + if(~isempty(name)) + txt=sprintf('%s"%s": [%s',padding0, checkname(name,varargin{:}),nl); name=''; + else + txt=sprintf('%s[%s',padding0,nl); + end +elseif(len==0) + if(~isempty(name)) + txt=sprintf('%s"%s": []',padding0, checkname(name,varargin{:})); name=''; + else + txt=sprintf('%s[]',padding0); + end +end +for j=1:dim(2) + if(dim(1)>1) txt=sprintf('%s%s[%s',txt,padding2,nl); end + for i=1:dim(1) + txt=sprintf('%s%s',txt,obj2json(name,item{i,j},level+(dim(1)>1)+1,varargin{:})); + if(i1) txt=sprintf('%s%s%s]',txt,nl,padding2); end + if(j1) txt=sprintf('%s%s%s]',txt,nl,padding0); end + +%%------------------------------------------------------------------------- +function txt=struct2json(name,item,level,varargin) +txt=''; +if(~isstruct(item)) + error('input is not a struct'); +end +dim=size(item); +if(ndims(squeeze(item))>2) % for 3D or higher dimensions, flatten to 2D for now + item=reshape(item,dim(1),numel(item)/dim(1)); + dim=size(item); +end +len=numel(item); +ws=struct('tab',sprintf('\t'),'newline',sprintf('\n')); +ws=jsonopt('whitespaces_',ws,varargin{:}); +padding0=repmat(ws.tab,1,level); +padding2=repmat(ws.tab,1,level+1); +padding1=repmat(ws.tab,1,level+(dim(1)>1)+(len>1)); +nl=ws.newline; + +if(~isempty(name)) + if(len>1) txt=sprintf('%s"%s": [%s',padding0,checkname(name,varargin{:}),nl); end +else + if(len>1) txt=sprintf('%s[%s',padding0,nl); end +end +for j=1:dim(2) + if(dim(1)>1) txt=sprintf('%s%s[%s',txt,padding2,nl); end + for i=1:dim(1) + names = fieldnames(item(i,j)); + if(~isempty(name) && len==1) + txt=sprintf('%s%s"%s": {%s',txt,padding1, checkname(name,varargin{:}),nl); + else + txt=sprintf('%s%s{%s',txt,padding1,nl); + end + if(~isempty(names)) + for e=1:length(names) + txt=sprintf('%s%s',txt,obj2json(names{e},getfield(item(i,j),... + names{e}),level+(dim(1)>1)+1+(len>1),varargin{:})); + if(e1) txt=sprintf('%s%s%s]',txt,nl,padding2); end + if(j1) txt=sprintf('%s%s%s]',txt,nl,padding0); end + +%%------------------------------------------------------------------------- +function txt=str2json(name,item,level,varargin) +txt=''; +if(~ischar(item)) + error('input is not a string'); +end +item=reshape(item, max(size(item),[1 0])); +len=size(item,1); +ws=struct('tab',sprintf('\t'),'newline',sprintf('\n'),'sep',sprintf(',\n')); +ws=jsonopt('whitespaces_',ws,varargin{:}); +padding1=repmat(ws.tab,1,level); +padding0=repmat(ws.tab,1,level+1); +nl=ws.newline; +sep=ws.sep; + +if(~isempty(name)) + if(len>1) txt=sprintf('%s"%s": [%s',padding1,checkname(name,varargin{:}),nl); end +else + if(len>1) txt=sprintf('%s[%s',padding1,nl); end +end +isoct=jsonopt('IsOctave',0,varargin{:}); +for e=1:len + if(isoct) + val=regexprep(item(e,:),'\\','\\'); + val=regexprep(val,'"','\"'); + val=regexprep(val,'^"','\"'); + else + val=regexprep(item(e,:),'\\','\\\\'); + val=regexprep(val,'"','\\"'); + val=regexprep(val,'^"','\\"'); + end + val=escapejsonstring(val); + if(len==1) + obj=['"' checkname(name,varargin{:}) '": ' '"',val,'"']; + if(isempty(name)) obj=['"',val,'"']; end + txt=sprintf('%s%s%s%s',txt,padding1,obj); + else + txt=sprintf('%s%s%s%s',txt,padding0,['"',val,'"']); + end + if(e==len) sep=''; end + txt=sprintf('%s%s',txt,sep); +end +if(len>1) txt=sprintf('%s%s%s%s',txt,nl,padding1,']'); end + +%%------------------------------------------------------------------------- +function txt=mat2json(name,item,level,varargin) +if(~isnumeric(item) && ~islogical(item)) + error('input is not an array'); +end +ws=struct('tab',sprintf('\t'),'newline',sprintf('\n'),'sep',sprintf(',\n')); +ws=jsonopt('whitespaces_',ws,varargin{:}); +padding1=repmat(ws.tab,1,level); +padding0=repmat(ws.tab,1,level+1); +nl=ws.newline; +sep=ws.sep; + +if(length(size(item))>2 || issparse(item) || ~isreal(item) || ... + isempty(item) ||jsonopt('ArrayToStruct',0,varargin{:})) + if(isempty(name)) + txt=sprintf('%s{%s%s"_ArrayType_": "%s",%s%s"_ArraySize_": %s,%s',... + padding1,nl,padding0,class(item),nl,padding0,regexprep(mat2str(size(item)),'\s+',','),nl); + else + txt=sprintf('%s"%s": {%s%s"_ArrayType_": "%s",%s%s"_ArraySize_": %s,%s',... + padding1,checkname(name,varargin{:}),nl,padding0,class(item),nl,padding0,regexprep(mat2str(size(item)),'\s+',','),nl); + end +else + if(numel(item)==1 && jsonopt('NoRowBracket',1,varargin{:})==1 && level>0) + numtxt=regexprep(regexprep(matdata2json(item,level+1,varargin{:}),'^\[',''),']',''); + else + numtxt=matdata2json(item,level+1,varargin{:}); + end + if(isempty(name)) + txt=sprintf('%s%s',padding1,numtxt); + else + if(numel(item)==1 && jsonopt('NoRowBracket',1,varargin{:})==1) + txt=sprintf('%s"%s": %s',padding1,checkname(name,varargin{:}),numtxt); + else + txt=sprintf('%s"%s": %s',padding1,checkname(name,varargin{:}),numtxt); + end + end + return; +end +dataformat='%s%s%s%s%s'; + +if(issparse(item)) + [ix,iy]=find(item); + data=full(item(find(item))); + if(~isreal(item)) + data=[real(data(:)),imag(data(:))]; + if(size(item,1)==1) + % Kludge to have data's 'transposedness' match item's. + % (Necessary for complex row vector handling below.) + data=data'; + end + txt=sprintf(dataformat,txt,padding0,'"_ArrayIsComplex_": ','1', sep); + end + txt=sprintf(dataformat,txt,padding0,'"_ArrayIsSparse_": ','1', sep); + if(size(item,1)==1) + % Row vector, store only column indices. + txt=sprintf(dataformat,txt,padding0,'"_ArrayData_": ',... + matdata2json([iy(:),data'],level+2,varargin{:}), nl); + elseif(size(item,2)==1) + % Column vector, store only row indices. + txt=sprintf(dataformat,txt,padding0,'"_ArrayData_": ',... + matdata2json([ix,data],level+2,varargin{:}), nl); + else + % General case, store row and column indices. + txt=sprintf(dataformat,txt,padding0,'"_ArrayData_": ',... + matdata2json([ix,iy,data],level+2,varargin{:}), nl); + end +else + if(isreal(item)) + txt=sprintf(dataformat,txt,padding0,'"_ArrayData_": ',... + matdata2json(item(:)',level+2,varargin{:}), nl); + else + txt=sprintf(dataformat,txt,padding0,'"_ArrayIsComplex_": ','1', sep); + txt=sprintf(dataformat,txt,padding0,'"_ArrayData_": ',... + matdata2json([real(item(:)) imag(item(:))],level+2,varargin{:}), nl); + end +end +txt=sprintf('%s%s%s',txt,padding1,'}'); + +%%------------------------------------------------------------------------- +function txt=matdata2json(mat,level,varargin) + +ws=struct('tab',sprintf('\t'),'newline',sprintf('\n'),'sep',sprintf(',\n')); +ws=jsonopt('whitespaces_',ws,varargin{:}); +tab=ws.tab; +nl=ws.newline; + +if(size(mat,1)==1) + pre=''; + post=''; + level=level-1; +else + pre=sprintf('[%s',nl); + post=sprintf('%s%s]',nl,repmat(tab,1,level-1)); +end + +if(isempty(mat)) + txt='null'; + return; +end +floatformat=jsonopt('FloatFormat','%.10g',varargin{:}); +%if(numel(mat)>1) + formatstr=['[' repmat([floatformat ','],1,size(mat,2)-1) [floatformat sprintf('],%s',nl)]]; +%else +% formatstr=[repmat([floatformat ','],1,size(mat,2)-1) [floatformat sprintf(',\n')]]; +%end + +if(nargin>=2 && size(mat,1)>1 && jsonopt('ArrayIndent',1,varargin{:})==1) + formatstr=[repmat(tab,1,level) formatstr]; +end + +txt=sprintf(formatstr,mat'); +txt(end-length(nl):end)=[]; +if(islogical(mat) && jsonopt('ParseLogical',0,varargin{:})==1) + txt=regexprep(txt,'1','true'); + txt=regexprep(txt,'0','false'); +end +%txt=regexprep(mat2str(mat),'\s+',','); +%txt=regexprep(txt,';',sprintf('],\n[')); +% if(nargin>=2 && size(mat,1)>1) +% txt=regexprep(txt,'\[',[repmat(sprintf('\t'),1,level) '[']); +% end +txt=[pre txt post]; +if(any(isinf(mat(:)))) + txt=regexprep(txt,'([-+]*)Inf',jsonopt('Inf','"$1_Inf_"',varargin{:})); +end +if(any(isnan(mat(:)))) + txt=regexprep(txt,'NaN',jsonopt('NaN','"_NaN_"',varargin{:})); +end + +%%------------------------------------------------------------------------- +function newname=checkname(name,varargin) +isunpack=jsonopt('UnpackHex',1,varargin{:}); +newname=name; +if(isempty(regexp(name,'0x([0-9a-fA-F]+)_','once'))) + return +end +if(isunpack) + isoct=jsonopt('IsOctave',0,varargin{:}); + if(~isoct) + newname=regexprep(name,'(^x|_){1}0x([0-9a-fA-F]+)_','${native2unicode(hex2dec($2))}'); + else + pos=regexp(name,'(^x|_){1}0x([0-9a-fA-F]+)_','start'); + pend=regexp(name,'(^x|_){1}0x([0-9a-fA-F]+)_','end'); + if(isempty(pos)) return; end + str0=name; + pos0=[0 pend(:)' length(name)]; + newname=''; + for i=1:length(pos) + newname=[newname str0(pos0(i)+1:pos(i)-1) char(hex2dec(str0(pos(i)+3:pend(i)-1)))]; + end + if(pos(end)~=length(name)) + newname=[newname str0(pos0(end-1)+1:pos0(end))]; + end + end +end + +%%------------------------------------------------------------------------- +function newstr=escapejsonstring(str) +newstr=str; +isoct=exist('OCTAVE_VERSION','builtin'); +if(isoct) + vv=sscanf(OCTAVE_VERSION,'%f'); + if(vv(1)>=3.8) isoct=0; end +end +if(isoct) + escapechars={'\a','\f','\n','\r','\t','\v'}; + for i=1:length(escapechars); + newstr=regexprep(newstr,escapechars{i},escapechars{i}); + end +else + escapechars={'\a','\b','\f','\n','\r','\t','\v'}; + for i=1:length(escapechars); + newstr=regexprep(newstr,escapechars{i},regexprep(escapechars{i},'\\','\\\\')); + end +end diff --git a/machine-learning-ex2/ex2/lib/jsonlab/saveubjson.m b/machine-learning-ex2/ex2/lib/jsonlab/saveubjson.m new file mode 100644 index 0000000..eaec433 --- /dev/null +++ b/machine-learning-ex2/ex2/lib/jsonlab/saveubjson.m @@ -0,0 +1,504 @@ +function json=saveubjson(rootname,obj,varargin) +% +% json=saveubjson(rootname,obj,filename) +% or +% json=saveubjson(rootname,obj,opt) +% json=saveubjson(rootname,obj,'param1',value1,'param2',value2,...) +% +% convert a MATLAB object (cell, struct or array) into a Universal +% Binary JSON (UBJSON) binary string +% +% author: Qianqian Fang (fangq nmr.mgh.harvard.edu) +% created on 2013/08/17 +% +% $Id: saveubjson.m 460 2015-01-03 00:30:45Z fangq $ +% +% input: +% rootname: the name of the root-object, when set to '', the root name +% is ignored, however, when opt.ForceRootName is set to 1 (see below), +% the MATLAB variable name will be used as the root name. +% obj: a MATLAB object (array, cell, cell array, struct, struct array) +% filename: a string for the file name to save the output UBJSON data +% opt: a struct for additional options, ignore to use default values. +% opt can have the following fields (first in [.|.] is the default) +% +% opt.FileName [''|string]: a file name to save the output JSON data +% opt.ArrayToStruct[0|1]: when set to 0, saveubjson outputs 1D/2D +% array in JSON array format; if sets to 1, an +% array will be shown as a struct with fields +% "_ArrayType_", "_ArraySize_" and "_ArrayData_"; for +% sparse arrays, the non-zero elements will be +% saved to _ArrayData_ field in triplet-format i.e. +% (ix,iy,val) and "_ArrayIsSparse_" will be added +% with a value of 1; for a complex array, the +% _ArrayData_ array will include two columns +% (4 for sparse) to record the real and imaginary +% parts, and also "_ArrayIsComplex_":1 is added. +% opt.ParseLogical [1|0]: if this is set to 1, logical array elem +% will use true/false rather than 1/0. +% opt.NoRowBracket [1|0]: if this is set to 1, arrays with a single +% numerical element will be shown without a square +% bracket, unless it is the root object; if 0, square +% brackets are forced for any numerical arrays. +% opt.ForceRootName [0|1]: when set to 1 and rootname is empty, saveubjson +% will use the name of the passed obj variable as the +% root object name; if obj is an expression and +% does not have a name, 'root' will be used; if this +% is set to 0 and rootname is empty, the root level +% will be merged down to the lower level. +% opt.JSONP [''|string]: to generate a JSONP output (JSON with padding), +% for example, if opt.JSON='foo', the JSON data is +% wrapped inside a function call as 'foo(...);' +% opt.UnpackHex [1|0]: conver the 0x[hex code] output by loadjson +% back to the string form +% +% opt can be replaced by a list of ('param',value) pairs. The param +% string is equivallent to a field in opt and is case sensitive. +% output: +% json: a binary string in the UBJSON format (see http://ubjson.org) +% +% examples: +% jsonmesh=struct('MeshNode',[0 0 0;1 0 0;0 1 0;1 1 0;0 0 1;1 0 1;0 1 1;1 1 1],... +% 'MeshTetra',[1 2 4 8;1 3 4 8;1 2 6 8;1 5 6 8;1 5 7 8;1 3 7 8],... +% 'MeshTri',[1 2 4;1 2 6;1 3 4;1 3 7;1 5 6;1 5 7;... +% 2 8 4;2 8 6;3 8 4;3 8 7;5 8 6;5 8 7],... +% 'MeshCreator','FangQ','MeshTitle','T6 Cube',... +% 'SpecialData',[nan, inf, -inf]); +% saveubjson('jsonmesh',jsonmesh) +% saveubjson('jsonmesh',jsonmesh,'meshdata.ubj') +% +% license: +% BSD, see LICENSE_BSD.txt files for details +% +% -- this function is part of JSONLab toolbox (http://iso2mesh.sf.net/cgi-bin/index.cgi?jsonlab) +% + +if(nargin==1) + varname=inputname(1); + obj=rootname; + if(isempty(varname)) + varname='root'; + end + rootname=varname; +else + varname=inputname(2); +end +if(length(varargin)==1 && ischar(varargin{1})) + opt=struct('FileName',varargin{1}); +else + opt=varargin2struct(varargin{:}); +end +opt.IsOctave=exist('OCTAVE_VERSION','builtin'); +rootisarray=0; +rootlevel=1; +forceroot=jsonopt('ForceRootName',0,opt); +if((isnumeric(obj) || islogical(obj) || ischar(obj) || isstruct(obj) || iscell(obj)) && isempty(rootname) && forceroot==0) + rootisarray=1; + rootlevel=0; +else + if(isempty(rootname)) + rootname=varname; + end +end +if((isstruct(obj) || iscell(obj))&& isempty(rootname) && forceroot) + rootname='root'; +end +json=obj2ubjson(rootname,obj,rootlevel,opt); +if(~rootisarray) + json=['{' json '}']; +end + +jsonp=jsonopt('JSONP','',opt); +if(~isempty(jsonp)) + json=[jsonp '(' json ')']; +end + +% save to a file if FileName is set, suggested by Patrick Rapin +if(~isempty(jsonopt('FileName','',opt))) + fid = fopen(opt.FileName, 'wb'); + fwrite(fid,json); + fclose(fid); +end + +%%------------------------------------------------------------------------- +function txt=obj2ubjson(name,item,level,varargin) + +if(iscell(item)) + txt=cell2ubjson(name,item,level,varargin{:}); +elseif(isstruct(item)) + txt=struct2ubjson(name,item,level,varargin{:}); +elseif(ischar(item)) + txt=str2ubjson(name,item,level,varargin{:}); +else + txt=mat2ubjson(name,item,level,varargin{:}); +end + +%%------------------------------------------------------------------------- +function txt=cell2ubjson(name,item,level,varargin) +txt=''; +if(~iscell(item)) + error('input is not a cell'); +end + +dim=size(item); +if(ndims(squeeze(item))>2) % for 3D or higher dimensions, flatten to 2D for now + item=reshape(item,dim(1),numel(item)/dim(1)); + dim=size(item); +end +len=numel(item); % let's handle 1D cell first +if(len>1) + if(~isempty(name)) + txt=[S_(checkname(name,varargin{:})) '[']; name=''; + else + txt='['; + end +elseif(len==0) + if(~isempty(name)) + txt=[S_(checkname(name,varargin{:})) 'Z']; name=''; + else + txt='Z'; + end +end +for j=1:dim(2) + if(dim(1)>1) txt=[txt '[']; end + for i=1:dim(1) + txt=[txt obj2ubjson(name,item{i,j},level+(len>1),varargin{:})]; + end + if(dim(1)>1) txt=[txt ']']; end +end +if(len>1) txt=[txt ']']; end + +%%------------------------------------------------------------------------- +function txt=struct2ubjson(name,item,level,varargin) +txt=''; +if(~isstruct(item)) + error('input is not a struct'); +end +dim=size(item); +if(ndims(squeeze(item))>2) % for 3D or higher dimensions, flatten to 2D for now + item=reshape(item,dim(1),numel(item)/dim(1)); + dim=size(item); +end +len=numel(item); + +if(~isempty(name)) + if(len>1) txt=[S_(checkname(name,varargin{:})) '[']; end +else + if(len>1) txt='['; end +end +for j=1:dim(2) + if(dim(1)>1) txt=[txt '[']; end + for i=1:dim(1) + names = fieldnames(item(i,j)); + if(~isempty(name) && len==1) + txt=[txt S_(checkname(name,varargin{:})) '{']; + else + txt=[txt '{']; + end + if(~isempty(names)) + for e=1:length(names) + txt=[txt obj2ubjson(names{e},getfield(item(i,j),... + names{e}),level+(dim(1)>1)+1+(len>1),varargin{:})]; + end + end + txt=[txt '}']; + end + if(dim(1)>1) txt=[txt ']']; end +end +if(len>1) txt=[txt ']']; end + +%%------------------------------------------------------------------------- +function txt=str2ubjson(name,item,level,varargin) +txt=''; +if(~ischar(item)) + error('input is not a string'); +end +item=reshape(item, max(size(item),[1 0])); +len=size(item,1); + +if(~isempty(name)) + if(len>1) txt=[S_(checkname(name,varargin{:})) '[']; end +else + if(len>1) txt='['; end +end +isoct=jsonopt('IsOctave',0,varargin{:}); +for e=1:len + val=item(e,:); + if(len==1) + obj=['' S_(checkname(name,varargin{:})) '' '',S_(val),'']; + if(isempty(name)) obj=['',S_(val),'']; end + txt=[txt,'',obj]; + else + txt=[txt,'',['',S_(val),'']]; + end +end +if(len>1) txt=[txt ']']; end + +%%------------------------------------------------------------------------- +function txt=mat2ubjson(name,item,level,varargin) +if(~isnumeric(item) && ~islogical(item)) + error('input is not an array'); +end + +if(length(size(item))>2 || issparse(item) || ~isreal(item) || ... + isempty(item) || jsonopt('ArrayToStruct',0,varargin{:})) + cid=I_(uint32(max(size(item)))); + if(isempty(name)) + txt=['{' S_('_ArrayType_'),S_(class(item)),S_('_ArraySize_'),I_a(size(item),cid(1)) ]; + else + if(isempty(item)) + txt=[S_(checkname(name,varargin{:})),'Z']; + return; + else + txt=[S_(checkname(name,varargin{:})),'{',S_('_ArrayType_'),S_(class(item)),S_('_ArraySize_'),I_a(size(item),cid(1))]; + end + end +else + if(isempty(name)) + txt=matdata2ubjson(item,level+1,varargin{:}); + else + if(numel(item)==1 && jsonopt('NoRowBracket',1,varargin{:})==1) + numtxt=regexprep(regexprep(matdata2ubjson(item,level+1,varargin{:}),'^\[',''),']',''); + txt=[S_(checkname(name,varargin{:})) numtxt]; + else + txt=[S_(checkname(name,varargin{:})),matdata2ubjson(item,level+1,varargin{:})]; + end + end + return; +end +if(issparse(item)) + [ix,iy]=find(item); + data=full(item(find(item))); + if(~isreal(item)) + data=[real(data(:)),imag(data(:))]; + if(size(item,1)==1) + % Kludge to have data's 'transposedness' match item's. + % (Necessary for complex row vector handling below.) + data=data'; + end + txt=[txt,S_('_ArrayIsComplex_'),'T']; + end + txt=[txt,S_('_ArrayIsSparse_'),'T']; + if(size(item,1)==1) + % Row vector, store only column indices. + txt=[txt,S_('_ArrayData_'),... + matdata2ubjson([iy(:),data'],level+2,varargin{:})]; + elseif(size(item,2)==1) + % Column vector, store only row indices. + txt=[txt,S_('_ArrayData_'),... + matdata2ubjson([ix,data],level+2,varargin{:})]; + else + % General case, store row and column indices. + txt=[txt,S_('_ArrayData_'),... + matdata2ubjson([ix,iy,data],level+2,varargin{:})]; + end +else + if(isreal(item)) + txt=[txt,S_('_ArrayData_'),... + matdata2ubjson(item(:)',level+2,varargin{:})]; + else + txt=[txt,S_('_ArrayIsComplex_'),'T']; + txt=[txt,S_('_ArrayData_'),... + matdata2ubjson([real(item(:)) imag(item(:))],level+2,varargin{:})]; + end +end +txt=[txt,'}']; + +%%------------------------------------------------------------------------- +function txt=matdata2ubjson(mat,level,varargin) +if(isempty(mat)) + txt='Z'; + return; +end +if(size(mat,1)==1) + level=level-1; +end +type=''; +hasnegtive=(mat<0); +if(isa(mat,'integer') || isinteger(mat) || (isfloat(mat) && all(mod(mat(:),1) == 0))) + if(isempty(hasnegtive)) + if(max(mat(:))<=2^8) + type='U'; + end + end + if(isempty(type)) + % todo - need to consider negative ones separately + id= histc(abs(max(mat(:))),[0 2^7 2^15 2^31 2^63]); + if(isempty(find(id))) + error('high-precision data is not yet supported'); + end + key='iIlL'; + type=key(find(id)); + end + txt=[I_a(mat(:),type,size(mat))]; +elseif(islogical(mat)) + logicalval='FT'; + if(numel(mat)==1) + txt=logicalval(mat+1); + else + txt=['[$U#' I_a(size(mat),'l') typecast(swapbytes(uint8(mat(:)')),'uint8')]; + end +else + if(numel(mat)==1) + txt=['[' D_(mat) ']']; + else + txt=D_a(mat(:),'D',size(mat)); + end +end + +%txt=regexprep(mat2str(mat),'\s+',','); +%txt=regexprep(txt,';',sprintf('],[')); +% if(nargin>=2 && size(mat,1)>1) +% txt=regexprep(txt,'\[',[repmat(sprintf('\t'),1,level) '[']); +% end +if(any(isinf(mat(:)))) + txt=regexprep(txt,'([-+]*)Inf',jsonopt('Inf','"$1_Inf_"',varargin{:})); +end +if(any(isnan(mat(:)))) + txt=regexprep(txt,'NaN',jsonopt('NaN','"_NaN_"',varargin{:})); +end + +%%------------------------------------------------------------------------- +function newname=checkname(name,varargin) +isunpack=jsonopt('UnpackHex',1,varargin{:}); +newname=name; +if(isempty(regexp(name,'0x([0-9a-fA-F]+)_','once'))) + return +end +if(isunpack) + isoct=jsonopt('IsOctave',0,varargin{:}); + if(~isoct) + newname=regexprep(name,'(^x|_){1}0x([0-9a-fA-F]+)_','${native2unicode(hex2dec($2))}'); + else + pos=regexp(name,'(^x|_){1}0x([0-9a-fA-F]+)_','start'); + pend=regexp(name,'(^x|_){1}0x([0-9a-fA-F]+)_','end'); + if(isempty(pos)) return; end + str0=name; + pos0=[0 pend(:)' length(name)]; + newname=''; + for i=1:length(pos) + newname=[newname str0(pos0(i)+1:pos(i)-1) char(hex2dec(str0(pos(i)+3:pend(i)-1)))]; + end + if(pos(end)~=length(name)) + newname=[newname str0(pos0(end-1)+1:pos0(end))]; + end + end +end +%%------------------------------------------------------------------------- +function val=S_(str) +if(length(str)==1) + val=['C' str]; +else + val=['S' I_(int32(length(str))) str]; +end +%%------------------------------------------------------------------------- +function val=I_(num) +if(~isinteger(num)) + error('input is not an integer'); +end +if(num>=0 && num<255) + val=['U' data2byte(swapbytes(cast(num,'uint8')),'uint8')]; + return; +end +key='iIlL'; +cid={'int8','int16','int32','int64'}; +for i=1:4 + if((num>0 && num<2^(i*8-1)) || (num<0 && num>=-2^(i*8-1))) + val=[key(i) data2byte(swapbytes(cast(num,cid{i})),'uint8')]; + return; + end +end +error('unsupported integer'); + +%%------------------------------------------------------------------------- +function val=D_(num) +if(~isfloat(num)) + error('input is not a float'); +end + +if(isa(num,'single')) + val=['d' data2byte(num,'uint8')]; +else + val=['D' data2byte(num,'uint8')]; +end +%%------------------------------------------------------------------------- +function data=I_a(num,type,dim,format) +id=find(ismember('iUIlL',type)); + +if(id==0) + error('unsupported integer array'); +end + +% based on UBJSON specs, all integer types are stored in big endian format + +if(id==1) + data=data2byte(swapbytes(int8(num)),'uint8'); + blen=1; +elseif(id==2) + data=data2byte(swapbytes(uint8(num)),'uint8'); + blen=1; +elseif(id==3) + data=data2byte(swapbytes(int16(num)),'uint8'); + blen=2; +elseif(id==4) + data=data2byte(swapbytes(int32(num)),'uint8'); + blen=4; +elseif(id==5) + data=data2byte(swapbytes(int64(num)),'uint8'); + blen=8; +end + +if(nargin>=3 && length(dim)>=2 && prod(dim)~=dim(2)) + format='opt'; +end +if((nargin<4 || strcmp(format,'opt')) && numel(num)>1) + if(nargin>=3 && (length(dim)==1 || (length(dim)>=2 && prod(dim)~=dim(2)))) + cid=I_(uint32(max(dim))); + data=['$' type '#' I_a(dim,cid(1)) data(:)']; + else + data=['$' type '#' I_(int32(numel(data)/blen)) data(:)']; + end + data=['[' data(:)']; +else + data=reshape(data,blen,numel(data)/blen); + data(2:blen+1,:)=data; + data(1,:)=type; + data=data(:)'; + data=['[' data(:)' ']']; +end +%%------------------------------------------------------------------------- +function data=D_a(num,type,dim,format) +id=find(ismember('dD',type)); + +if(id==0) + error('unsupported float array'); +end + +if(id==1) + data=data2byte(single(num),'uint8'); +elseif(id==2) + data=data2byte(double(num),'uint8'); +end + +if(nargin>=3 && length(dim)>=2 && prod(dim)~=dim(2)) + format='opt'; +end +if((nargin<4 || strcmp(format,'opt')) && numel(num)>1) + if(nargin>=3 && (length(dim)==1 || (length(dim)>=2 && prod(dim)~=dim(2)))) + cid=I_(uint32(max(dim))); + data=['$' type '#' I_a(dim,cid(1)) data(:)']; + else + data=['$' type '#' I_(int32(numel(data)/(id*4))) data(:)']; + end + data=['[' data]; +else + data=reshape(data,(id*4),length(data)/(id*4)); + data(2:(id*4+1),:)=data; + data(1,:)=type; + data=data(:)'; + data=['[' data(:)' ']']; +end +%%------------------------------------------------------------------------- +function bytes=data2byte(varargin) +bytes=typecast(varargin{:}); +bytes=bytes(:)'; diff --git a/machine-learning-ex2/ex2/lib/jsonlab/varargin2struct.m b/machine-learning-ex2/ex2/lib/jsonlab/varargin2struct.m new file mode 100644 index 0000000..9a5c2b6 --- /dev/null +++ b/machine-learning-ex2/ex2/lib/jsonlab/varargin2struct.m @@ -0,0 +1,40 @@ +function opt=varargin2struct(varargin) +% +% opt=varargin2struct('param1',value1,'param2',value2,...) +% or +% opt=varargin2struct(...,optstruct,...) +% +% convert a series of input parameters into a structure +% +% authors:Qianqian Fang (fangq nmr.mgh.harvard.edu) +% date: 2012/12/22 +% +% input: +% 'param', value: the input parameters should be pairs of a string and a value +% optstruct: if a parameter is a struct, the fields will be merged to the output struct +% +% output: +% opt: a struct where opt.param1=value1, opt.param2=value2 ... +% +% license: +% BSD, see LICENSE_BSD.txt files for details +% +% -- this function is part of jsonlab toolbox (http://iso2mesh.sf.net/cgi-bin/index.cgi?jsonlab) +% + +len=length(varargin); +opt=struct; +if(len==0) return; end +i=1; +while(i<=len) + if(isstruct(varargin{i})) + opt=mergestruct(opt,varargin{i}); + elseif(ischar(varargin{i}) && i 0 && resp(1) == '{'; + isHtml = findstr(lower(resp), ']+>', ' '); + strippedResponse = regexprep(strippedResponse, '[\t ]+', ' '); + fprintf(strippedResponse); +end + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Service configuration +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +function submissionUrl = submissionUrl() + submissionUrl = 'https://www-origin.coursera.org/api/onDemandProgrammingImmediateFormSubmissions.v1'; +end diff --git a/machine-learning-ex2/ex2/mapFeature.m b/machine-learning-ex2/ex2/mapFeature.m new file mode 100644 index 0000000..d02a72a --- /dev/null +++ b/machine-learning-ex2/ex2/mapFeature.m @@ -0,0 +1,21 @@ +function out = mapFeature(X1, X2) +% MAPFEATURE Feature mapping function to polynomial features +% +% MAPFEATURE(X1, X2) maps the two input features +% to quadratic features used in the regularization exercise. +% +% Returns a new feature array with more features, comprising of +% X1, X2, X1.^2, X2.^2, X1*X2, X1*X2.^2, etc.. +% +% Inputs X1, X2 must be the same size +% + +degree = 6; +out = ones(size(X1(:,1))); +for i = 1:degree + for j = 0:i + out(:, end+1) = (X1.^(i-j)).*(X2.^j); + end +end + +end \ No newline at end of file diff --git a/machine-learning-ex2/ex2/plotData.m b/machine-learning-ex2/ex2/plotData.m new file mode 100644 index 0000000..a3a458d --- /dev/null +++ b/machine-learning-ex2/ex2/plotData.m @@ -0,0 +1,33 @@ +function plotData(X, y) +%PLOTDATA Plots the data points X and y into a new figure +% PLOTDATA(x,y) plots the data points with + for the positive examples +% and o for the negative examples. X is assumed to be a Mx2 matrix. + +% Create New Figure +figure; hold on; + +% ====================== YOUR CODE HERE ====================== +% Instructions: Plot the positive and negative examples on a +% 2D plot, using the option 'k+' for the positive +% examples and 'ko' for the negative examples. +% + + +pos = find(y == 1); +neg = find(y == 0); +plot(X(pos, 1), X(pos, 2), 'k+', 'LineWidth', 2, 'MarkerSize', 7); +plot(X(neg, 1), X(neg, 2), 'ko', 'MarkerFaceColor', 'y', 'MarkerSize', 7); + + + + + + + +% ========================================================================= + + + +hold off; + +end diff --git a/machine-learning-ex2/ex2/plotDecisionBoundary.m b/machine-learning-ex2/ex2/plotDecisionBoundary.m new file mode 100644 index 0000000..cd36314 --- /dev/null +++ b/machine-learning-ex2/ex2/plotDecisionBoundary.m @@ -0,0 +1,48 @@ +function plotDecisionBoundary(theta, X, y) +%PLOTDECISIONBOUNDARY Plots the data points X and y into a new figure with +%the decision boundary defined by theta +% PLOTDECISIONBOUNDARY(theta, X,y) plots the data points with + for the +% positive examples and o for the negative examples. X is assumed to be +% a either +% 1) Mx3 matrix, where the first column is an all-ones column for the +% intercept. +% 2) MxN, N>3 matrix, where the first column is all-ones + +% Plot Data +plotData(X(:,2:3), y); +hold on + +if size(X, 2) <= 3 + % Only need 2 points to define a line, so choose two endpoints + plot_x = [min(X(:,2))-2, max(X(:,2))+2]; + + % Calculate the decision boundary line + plot_y = (-1./theta(3)).*(theta(2).*plot_x + theta(1)); + + % Plot, and adjust axes for better viewing + plot(plot_x, plot_y) + + % Legend, specific for the exercise + legend('Admitted', 'Not admitted', 'Decision Boundary') + axis([30, 100, 30, 100]) +else + % Here is the grid range + u = linspace(-1, 1.5, 50); + v = linspace(-1, 1.5, 50); + + z = zeros(length(u), length(v)); + % Evaluate z = theta*x over the grid + for i = 1:length(u) + for j = 1:length(v) + z(i,j) = mapFeature(u(i), v(j))*theta; + end + end + z = z'; % important to transpose z before calling contour + + % Plot z = 0 + % Notice you need to specify the range [0, 0] + contour(u, v, z, [0, 0], 'LineWidth', 2) +end +hold off + +end diff --git a/machine-learning-ex2/ex2/predict.m b/machine-learning-ex2/ex2/predict.m new file mode 100644 index 0000000..8b8a8ad --- /dev/null +++ b/machine-learning-ex2/ex2/predict.m @@ -0,0 +1,28 @@ +function p = predict(theta, X) +%PREDICT Predict whether the label is 0 or 1 using learned logistic +%regression parameters theta +% p = PREDICT(theta, X) computes the predictions for X using a +% threshold at 0.5 (i.e., if sigmoid(theta'*x) >= 0.5, predict 1) + +m = size(X, 1); % Number of training examples + +% You need to return the following variables correctly +p = zeros(m, 1); + +% ====================== YOUR CODE HERE ====================== +% Instructions: Complete the following code to make predictions using +% your learned logistic regression parameters. +% You should set p to a vector of 0's and 1's +% + +y = sigmoid(X * theta) +p(find(y >= 0.5)) = 1; + + + + + +% ========================================================================= + + +end diff --git a/machine-learning-ex2/ex2/sigmoid.m b/machine-learning-ex2/ex2/sigmoid.m new file mode 100644 index 0000000..ddffa19 --- /dev/null +++ b/machine-learning-ex2/ex2/sigmoid.m @@ -0,0 +1,17 @@ +function g = sigmoid(z) +%SIGMOID Compute sigmoid function +% g = SIGMOID(z) computes the sigmoid of z. + +% You need to return the following variables correctly +g = zeros(size(z)); + +% ====================== YOUR CODE HERE ====================== +% Instructions: Compute the sigmoid of each value of z (z can be a matrix, +% vector or scalar). + +g = 1 ./ (1 + power(e, -z)); + + +% ============================================================= + +end diff --git a/machine-learning-ex2/ex2/submit.m b/machine-learning-ex2/ex2/submit.m new file mode 100644 index 0000000..8ae80d6 --- /dev/null +++ b/machine-learning-ex2/ex2/submit.m @@ -0,0 +1,62 @@ +function submit() + addpath('./lib'); + + conf.assignmentSlug = 'logistic-regression'; + conf.itemName = 'Logistic Regression'; + conf.partArrays = { ... + { ... + '1', ... + { 'sigmoid.m' }, ... + 'Sigmoid Function', ... + }, ... + { ... + '2', ... + { 'costFunction.m' }, ... + 'Logistic Regression Cost', ... + }, ... + { ... + '3', ... + { 'costFunction.m' }, ... + 'Logistic Regression Gradient', ... + }, ... + { ... + '4', ... + { 'predict.m' }, ... + 'Predict', ... + }, ... + { ... + '5', ... + { 'costFunctionReg.m' }, ... + 'Regularized Logistic Regression Cost', ... + }, ... + { ... + '6', ... + { 'costFunctionReg.m' }, ... + 'Regularized Logistic Regression Gradient', ... + }, ... + }; + conf.output = @output; + + submitWithConfiguration(conf); +end + +function out = output(partId, auxstring) + % Random Test Cases + X = [ones(20,1) (exp(1) * sin(1:1:20))' (exp(0.5) * cos(1:1:20))']; + y = sin(X(:,1) + X(:,2)) > 0; + if partId == '1' + out = sprintf('%0.5f ', sigmoid(X)); + elseif partId == '2' + out = sprintf('%0.5f ', costFunction([0.25 0.5 -0.5]', X, y)); + elseif partId == '3' + [cost, grad] = costFunction([0.25 0.5 -0.5]', X, y); + out = sprintf('%0.5f ', grad); + elseif partId == '4' + out = sprintf('%0.5f ', predict([0.25 0.5 -0.5]', X)); + elseif partId == '5' + out = sprintf('%0.5f ', costFunctionReg([0.25 0.5 -0.5]', X, y, 0.1)); + elseif partId == '6' + [cost, grad] = costFunctionReg([0.25 0.5 -0.5]', X, y, 0.1); + out = sprintf('%0.5f ', grad); + end +end diff --git a/machine-learning-ex2/ex2/token.mat b/machine-learning-ex2/ex2/token.mat new file mode 100644 index 0000000..6a43b0d --- /dev/null +++ b/machine-learning-ex2/ex2/token.mat @@ -0,0 +1,15 @@ +# Created by Octave 4.4.0, Sat Jun 16 21:15:01 2018 JST +# name: email +# type: sq_string +# elements: 1 +# length: 20 +huuson1994@gmail.com + + +# name: token +# type: sq_string +# elements: 1 +# length: 16 +4i8bX7KbDFvM6i62 + +