forked from sheetjs/sheetjs
		
	
		
			
	
	
		
			79 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			79 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
							 | 
						||
| 
								 | 
							
								/* eslint-env node */
							 | 
						||
| 
								 | 
							
								var XLSX = require('xlsx');
							 | 
						||
| 
								 | 
							
								var tf = require('@tensorflow/tfjs');
							 | 
						||
| 
								 | 
							
								var linest = require('./linest');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* generate linreg.xlsx with 100 random points */
							 | 
						||
| 
								 | 
							
								var N = 100;
							 | 
						||
| 
								 | 
							
								linest.generate_random_file(N);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* get the first worksheet as an array of arrays, skip the first row */
							 | 
						||
| 
								 | 
							
								var wb = XLSX.readFile('linreg.xlsx');
							 | 
						||
| 
								 | 
							
								var ws = wb.Sheets[wb.SheetNames[0]];
							 | 
						||
| 
								 | 
							
								var aoa = XLSX.utils.sheet_to_json(ws, {header:1, raw:true}).slice(1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* calculate the coefficients in JS */
							 | 
						||
| 
								 | 
							
								(function(aoa) {
							 | 
						||
| 
								 | 
							
									var x_ = 0, y_ = 0, xx = 0, xy = 0, n = aoa.length;
							 | 
						||
| 
								 | 
							
									for(var i = 0; i < n; ++i) {
							 | 
						||
| 
								 | 
							
										x_ += aoa[i][0] / n;
							 | 
						||
| 
								 | 
							
										y_ += aoa[i][1] / n;
							 | 
						||
| 
								 | 
							
										xx += aoa[i][0] * aoa[i][0];
							 | 
						||
| 
								 | 
							
										xy += aoa[i][0] * aoa[i][1];
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									var m = Math.fround((xy - n * x_ * y_)/(xx - n * x_ * x_));
							 | 
						||
| 
								 | 
							
									console.log(m, Math.fround(y_ - m * x_), "JS Post");
							 | 
						||
| 
								 | 
							
								})(aoa);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* build X and Y vectors */
							 | 
						||
| 
								 | 
							
								var tensor = tf.tensor2d(aoa).transpose();
							 | 
						||
| 
								 | 
							
								console.log(tensor.shape);
							 | 
						||
| 
								 | 
							
								var xs = tensor.slice([0,0], [1,tensor.shape[1]]).flatten();
							 | 
						||
| 
								 | 
							
								var ys = tensor.slice([1,0], [1,tensor.shape[1]]).flatten();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* set up variables with initial guess */
							 | 
						||
| 
								 | 
							
								var x_ = xs.mean().dataSync()[0];
							 | 
						||
| 
								 | 
							
								var y_ = ys.mean().dataSync()[0];
							 | 
						||
| 
								 | 
							
								var a = tf.variable(tf.scalar(y_/x_));
							 | 
						||
| 
								 | 
							
								var b = tf.variable(tf.scalar(Math.random()));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* linear predictor */
							 | 
						||
| 
								 | 
							
								function predict(x) { return tf.tidy(function() { return a.mul(x).add(b); }); }
							 | 
						||
| 
								 | 
							
								/* mean square scoring */
							 | 
						||
| 
								 | 
							
								function loss(yh, y) { return yh.sub(y).square().mean(); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* train */
							 | 
						||
| 
								 | 
							
								for(var j = 0; j < 5; ++j) {
							 | 
						||
| 
								 | 
							
									var learning_rate = 0.0001 /(j+1), iterations = 1000;
							 | 
						||
| 
								 | 
							
									var optimizer = tf.train.sgd(learning_rate);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									for(var i = 0; i < iterations; ++i) optimizer.minimize(function() {
							 | 
						||
| 
								 | 
							
										var pred = predict(xs);
							 | 
						||
| 
								 | 
							
										var L = loss(pred, ys);
							 | 
						||
| 
								 | 
							
										return L
							 | 
						||
| 
								 | 
							
									});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/* compute the coefficient */
							 | 
						||
| 
								 | 
							
									var m = a.dataSync()[0], b_ = b.dataSync()[0];
							 | 
						||
| 
								 | 
							
									console.log(m, b_, "TF " + iterations * (j+1));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* export data to aoa */
							 | 
						||
| 
								 | 
							
								var yh = predict(xs);
							 | 
						||
| 
								 | 
							
								var tfdata = tf.stack([xs, ys, yh]).transpose();
							 | 
						||
| 
								 | 
							
								var shape = tfdata.shape;
							 | 
						||
| 
								 | 
							
								var tfarr = tfdata.dataSync();
							 | 
						||
| 
								 | 
							
								var tfaoa = [];
							 | 
						||
| 
								 | 
							
								for(j = 0; j < shape[0]; ++j) {
							 | 
						||
| 
								 | 
							
									tfaoa[j] = [];
							 | 
						||
| 
								 | 
							
									for(i = 0; i < shape[1]; ++i) tfaoa[j][i] = tfarr[j * shape[1] + i];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* add headers and export */
							 | 
						||
| 
								 | 
							
								tfaoa.unshift(["x", "y", "pred"]);
							 | 
						||
| 
								 | 
							
								var new_ws = XLSX.utils.aoa_to_sheet(tfaoa);
							 | 
						||
| 
								 | 
							
								var new_wb = XLSX.utils.book_new();
							 | 
						||
| 
								 | 
							
								XLSX.utils.book_append_sheet(new_wb, new_ws, "Sheet1");
							 | 
						||
| 
								 | 
							
								XLSX.writeFile(new_wb, "tfjs.xls");
							 |