48 lines
1.3 KiB
JavaScript
48 lines
1.3 KiB
JavaScript
// modifies the matrix "in place"
|
|
Matrix.prototype.inverse = function() {
|
|
if (this.height != this.width) {
|
|
throw "can't invert a non-square matrix";
|
|
}
|
|
|
|
var I = new IdentityMatrix(this.height);
|
|
for (var i = 0; i < this.height; i++)
|
|
this.mtx[i] = this.mtx[i].concat(I.mtx[i])
|
|
this.width *= 2;
|
|
|
|
this.toReducedRowEchelonForm();
|
|
|
|
for (var i = 0; i < this.height; i++)
|
|
this.mtx[i].splice(0, this.height);
|
|
this.width /= 2;
|
|
|
|
return this;
|
|
}
|
|
|
|
function ColumnVector(ary) {
|
|
return new Matrix(ary.map(function(v) {return [v]}))
|
|
}
|
|
ColumnVector.prototype = Matrix.prototype
|
|
|
|
Matrix.prototype.regression_coefficients = function(x) {
|
|
var x_t = x.transpose();
|
|
return x_t.mult(x).inverse().mult(x_t).mult(this);
|
|
}
|
|
|
|
// the Ruby example
|
|
var y = new ColumnVector([1,2,3,4,5]);
|
|
var x = new ColumnVector([2,1,3,4,5]);
|
|
print(y.regression_coefficients(x));
|
|
print();
|
|
|
|
// the Tcl example
|
|
y = new ColumnVector([
|
|
52.21, 53.12, 54.48, 55.84, 57.20, 58.57, 59.93, 61.29,
|
|
63.11, 64.47, 66.28, 68.10, 69.92, 72.19, 74.46
|
|
]);
|
|
x = new Matrix(
|
|
[1.47,1.50,1.52,1.55,1.57,1.60,1.63,1.65,1.68,1.70,1.73,1.75,1.78,1.80,1.83].map(
|
|
function(v) {return [Math.pow(v,0), Math.pow(v,1), Math.pow(v,2)]}
|
|
)
|
|
);
|
|
print(y.regression_coefficients(x));
|