Created
November 9, 2011 07:28
-
-
Save silentrob/1350707 to your computer and use it in GitHub Desktop.
Using Sylvester to run gradient decent in Node.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
6.1101,17.592 | |
5.5277,9.1302 | |
8.5186,13.662 | |
7.0032,11.854 | |
5.8598,6.8233 | |
8.3829,11.886 | |
7.4764,4.3483 | |
8.5781,12 | |
6.4862,6.5987 | |
5.0546,3.8166 | |
5.7107,3.2522 | |
14.164,15.505 | |
5.734,3.1551 | |
8.4084,7.2258 | |
5.6407,0.71618 | |
5.3794,3.5129 | |
6.3654,5.3048 | |
5.1301,0.56077 | |
6.4296,3.6518 | |
7.0708,5.3893 | |
6.1891,3.1386 | |
20.27,21.767 | |
5.4901,4.263 | |
6.3261,5.1875 | |
5.5649,3.0825 | |
18.945,22.638 | |
12.828,13.501 | |
10.957,7.0467 | |
13.176,14.692 | |
22.203,24.147 | |
5.2524,-1.22 | |
6.5894,5.9966 | |
9.2482,12.134 | |
5.8918,1.8495 | |
8.2111,6.5426 | |
7.9334,4.5623 | |
8.0959,4.1164 | |
5.6063,3.3928 | |
12.836,10.117 | |
6.3534,5.4974 | |
5.4069,0.55657 | |
6.8825,3.9115 | |
11.708,5.3854 | |
5.7737,2.4406 | |
7.8247,6.7318 | |
7.0931,1.0463 | |
5.0702,5.1337 | |
5.8014,1.844 | |
11.7,8.0043 | |
5.5416,1.0179 | |
7.5402,6.7504 | |
5.3077,1.8396 | |
7.4239,4.2885 | |
7.6031,4.9981 | |
6.3328,1.4233 | |
6.3589,-1.4211 | |
6.2742,2.4756 | |
5.6397,4.6042 | |
9.3102,3.9624 | |
9.4536,5.4141 | |
8.8254,5.1694 | |
5.1793,-0.74279 | |
21.279,17.929 | |
14.908,12.054 | |
18.959,17.054 | |
7.2182,4.8852 | |
8.2951,5.7442 | |
10.236,7.7754 | |
5.4994,1.0173 | |
20.341,20.992 | |
10.136,6.6799 | |
7.3345,4.0259 | |
6.0062,1.2784 | |
7.2259,3.3411 | |
5.0269,-2.6807 | |
6.5479,0.29678 | |
7.5386,3.8845 | |
5.0365,5.7014 | |
10.274,6.7526 | |
5.1077,2.0576 | |
5.7292,0.47953 | |
5.1884,0.20421 | |
6.3557,0.67861 | |
9.7687,7.5435 | |
6.5159,5.3436 | |
8.5172,4.2415 | |
9.1802,6.7981 | |
6.002,0.92695 | |
5.5204,0.152 | |
5.0594,2.8214 | |
5.7077,1.8451 | |
7.6366,4.2959 | |
5.8707,7.2029 | |
5.3054,1.9869 | |
8.2934,0.14454 | |
13.394,9.0551 | |
5.4369,0.61705 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var Vector = require('./node_modules/sylvester').Vector; | |
var Matrix = require('./node_modules/sylvester').Matrix; | |
/* | |
- Here is my Octive | |
hyp = X* theta; | |
n = hyp - y; | |
x = n'*n; | |
J = n'*n/(2*m); | |
*/ | |
var computeCost = function(X, y, theta) { | |
var J = 0; | |
var m = y.dimensions(); | |
y = y.transpose(); | |
var hyp = X.multiply(theta); | |
var n = hyp.subtract(y); | |
var n1 = n.transpose(); | |
var n2 = n1.multiply(n) | |
J = n2.e(1,1) / (2*m); | |
return J; | |
} | |
/* | |
- Here is my Octive | |
- Approch one | |
%temp0 = theta(1,1) - alpha/m * (n' * X(:,1)); | |
%temp1 = theta(2,1) - alpha/m * (n' * X(:,2)); | |
%theta(1,1) = temp0; | |
%theta(2,1) = temp1; | |
- Approch two - Vectorized (used below) | |
hyp = X * theta; | |
n = hyp - y; | |
theta = theta - (alpha/m * (n' * X))'; | |
*/ | |
var gradientDescent = function(X, y, theta, alpha, num_iters) { | |
var m = y.dimensions(); | |
for (var i = 1; i <= num_iters; i++) { | |
var hyp = X.multiply(theta); | |
var yT = y.transpose(); | |
var n = hyp.subtract(yT); | |
var nTmX = (n.transpose()).multiply(X); | |
var amT = nTmX.multiply(alpha/m).transpose(); | |
theta = theta.subtract(amT) | |
} | |
return theta; | |
} | |
// Starting point. | |
var data = Matrix.loadFile('./ex1data.txt'); | |
var m = data.rows(); // number of training examples | |
var X = data.col(1); | |
var y = data.col(2); | |
var ones = Matrix.Ones(m, 1); | |
X1 = ones.augment(X.transpose()); // Add a column of ones to x | |
X = X1; | |
theta = Matrix.Zero(2, 1); // initialize fitting parameters | |
// Some gradient descent settings | |
var iterations = 1500; | |
var alpha = 0.01; | |
var J = computeCost(X, y, theta); | |
theta = gradientDescent(X, y, theta, alpha, iterations); | |
console.log('Theta found by gradient descent: '); | |
console.log(theta.e(1,1), theta.e(2,1)); | |
// Predict values for population sizes of 35,000 and 70,000 | |
var predict1 = $V([1,3.5]); | |
predict1 = predict1.dot(theta); | |
var predict2 = $V([1, 7]); | |
predict2 = predict2.dot(theta); | |
// | |
console.log('For population = 35,000, we predict a profit of', predict1 * 10000, "\n"); | |
console.log('For population = 70,000, we predict a profit of', predict2 * 10000, "\n"); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment