Code Monkey home page Code Monkey logo

random-forest's Introduction

ml-random-forest

NPM version build status npm download

Random forest for classification and regression.

Installation

npm i ml-random-forest

Usage

As classifier

import IrisDataset from 'ml-dataset-iris';
import { RandomForestClassifier as RFClassifier } from 'ml-random-forest';

const trainingSet = IrisDataset.getNumbers();
const predictions = IrisDataset.getClasses().map((elem) =>
  IrisDataset.getDistinctClasses().indexOf(elem)
);

const options = {
  seed: 3,
  maxFeatures: 0.8,
  replacement: true,
  nEstimators: 25
};

const classifier = new RFClassifier(options);
classifier.train(trainingSet, predictions);
const result = classifier.predict(trainingSet);
const oobResult = classifier.predictOOB();
const confusionMatrix = classifier.getConfusionMatrix();

As regression

import { RandomForestRegression as RFRegression } from 'ml-random-forest';

const dataset = [
  [73, 80, 75, 152],
  [93, 88, 93, 185],
  [89, 91, 90, 180],
  [96, 98, 100, 196],
  [73, 66, 70, 142],
  [53, 46, 55, 101],
  [69, 74, 77, 149],
  [47, 56, 60, 115],
  [87, 79, 90, 175],
  [79, 70, 88, 164],
  [69, 70, 73, 141],
  [70, 65, 74, 141],
  [93, 95, 91, 184],
  [79, 80, 73, 152],
  [70, 73, 78, 148],
  [93, 89, 96, 192],
  [78, 75, 68, 147],
  [81, 90, 93, 183],
  [88, 92, 86, 177],
  [78, 83, 77, 159],
  [82, 86, 90, 177],
  [86, 82, 89, 175],
  [78, 83, 85, 175],
  [76, 83, 71, 149],
  [96, 93, 95, 192]
];

const trainingSet = new Array(dataset.length);
const predictions = new Array(dataset.length);

for (let i = 0; i < dataset.length; ++i) {
  trainingSet[i] = dataset[i].slice(0, 3);
  predictions[i] = dataset[i][3];
}

const options = {
  seed: 3,
  maxFeatures: 2,
  replacement: false,
  nEstimators: 200
};

const regression = new RFRegression(options);
regression.train(trainingSet, predictions);
const result = regression.predict(trainingSet);

License

MIT

random-forest's People

Contributors

aiday-mar avatar drigosalazar avatar fabriond avatar greenkeeper[bot] avatar jeffersonh44 avatar lpatiny avatar maasencioh avatar maneetgoyal avatar micha-lmxt avatar mljs-bot avatar nlhlong01 avatar targos avatar wadjih-bencheikh18 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

random-forest's Issues

Problem of accuracy

The accuracy seems to be worst than with Scikit-learn.

sklearn
# coding: utf8

from sklearn.metrics import accuracy_score
from sklearn.ensemble import RandomForestClassifier

def do_RandomForest(x_train, y_train, x_test, y_test, n=1000):
  rf = RandomForestClassifier(n_estimators=n)
  rf.fit(x_train, y_train)
  score = rf.score(x_test, y_test)
  y_predict = rf.predict(x_test)
  return score, y_predict

if __name__ == "__main__":
    x_train = [[0,-1], [1,0], [1,1], [1,-1], [2,0], [2,1], [2,-1], [3,2], [0,4], [1,3], [1,4], [1,5], [2,3], [2,4], [2,5], [3,4], [1, 10], [1, 12], [2, 10], [2,11], [2, 14], [3, 11]]
    y_train = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2]
    x_test = [[0, -2], [1, 0.5], [1.5, -1], [1, 2.5], [2, 3.5], [1.5, 4], [1, 10.5], [2.5, 10.5], [2, 11.5]]
    y_test = [0, 0, 0, 1, 1, 1, 2, 2, 2]
    score, y_star = do_RandomForest(x_train, y_train, x_test, y_test)
    print score
    print y_star
    # output : 
    # 1.0 
    # [0 0 0 1 1 1 2 2 2]
ml-random-forest
const {Matrix} = require('ml-matrix');
const {RandomForestClassifier} = require('ml-random-forest');

// our training set (X,Y)
var X = new Matrix([[0,-1], [1,0], [1,1], [1,-1], [2,0], [2,1], [2,-1], [3,2], [0,4], [1,3], [1,4], [1,5], [2,3], [2,4], [2,5], [3,4], [1, 10], [1, 12], [2, 10], [2,11], [2, 14], [3, 11]]);
var Y = Matrix.columnVector([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2]);

// the test set (Xtest, Ytest)
var Xtest = new Matrix([[0, -2], [1, 0.5], [1.5, -1], [1, 2.5], [2, 3.5], [1.5, 4], [1, 10.5], [2.5, 10.5], [2, 11.5]])
var Ytest = Matrix.columnVector([0, 0, 0, 1, 1, 1, 2, 2, 2]);

// we will train our model
var rf = new RandomForestClassifier({nEstimators: 1000});
rf.train(X,Y);

// we try to predict the test set
var finalResults = rf.predict(Xtest);
console.log(finalResults)
// Now, you can compare finalResults with the Ytest, which is what you wanted to have.
// output (expected is [0, 0, 0, 1, 1, 1, 2, 2, 2]):
// [ 0, 0, 1, 0, 1, 1, 0, 2, 1 ]
// 5 true predictions (9 values) -> 55% accuracy 

I don't see where is the problem with ml-random-forest, but the results don't seem to be good...

Cannot load the saved Model

Saved the Random Forest model using toJSON() but while trying to load the saved model it gives an error of
(node:38489) UnhandledPromiseRejectionWarning: TypeError: classifier.load is not a function (classifier being the Random forest classifier)

Random Forest Regression error 'input must not be empty' when fed text frequency array training set

Hi there.

My use case is to get a movie's genre, and predict the rating that would be given. Since genre are discrete values I considered using Naive Bayes. However since I need to predict the movie rating given, I read that Random Forest can get me the desired result.

I have the following training set which is arrays of inverse document frequencies as follows.
var genreList = ["Biography","Drama","History","Documentary","Action","Comedy","Thriller","Crime","Music","Family","Fantasy","Musical","Animation","Adventure","Sport","Horror","Mystery","Sci-Fi"]
var trainingset = [ [0.1111111111111111,0.05555555555555555,0.2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0.125,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0.1111111111111111,0,0,0,0.041666666666666664,0.041666666666666664,0,0,0,0,0,0,0,0,0,0,0,0],[0.1111111111111111,0.05555555555555555,0,0,0,0,0.25,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0.041666666666666664,0,0,0.1,1,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0.3333333333333333,0.25,1,0,0,0,0,0,0],[0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0,0.07692307692307693,0.034482758620689655,0,0,0,0],[0,0.05555555555555555,0,0.125,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0.07692307692307693,0.034482758620689655,0,0,0,0],[0,0,0,0,0.041666666666666664,0.041666666666666664,0,0.1,0,0,0,0,0,0,0,0,0,0],[0,0.05555555555555555,0,0,0,0,0,0,0,0.3333333333333333,0.25,0,0,0,0,0,0,0],[0,0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0.07692307692307693,0.034482758620689655,0,0,0,0],[0.1111111111111111,0.05555555555555555,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0],[0,0,0,0,0.041666666666666664,0.041666666666666664,0,0,0,0,0,0,0,0.034482758620689655,0,0,0,0],[0,0.05555555555555555,0,0,0,0.041666666666666664,0,0.1,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0.041666666666666664,0,0,0,0,0,0.25,0,0,0.034482758620689655,0,0,0,0],[0,0.05555555555555555,0,0,0,0.041666666666666664,0,0.1,0,0,0,0,0,0,0,0,0,0],[0,0,0,0.125,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0.1111111111111111,0.05555555555555555,0,0,0,0.041666666666666664,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0.07692307692307693,0.034482758620689655,0,0,0,0],[0,0,0,0,0,0,0.25,0,0,0,0,0,0,0,0,0.5,0.3333333333333333,0],[0,0.05555555555555555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0.1111111111111111,0.05555555555555555,0.2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0.125,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0.07692307692307693,0.034482758620689655,0,0,0,0],[0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0,0,0.034482758620689655,0,0,0,0.07692307692307693],[0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0,0,0.034482758620689655,0,0,0,0.07692307692307693],[0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0,0,0.034482758620689655,0,0,0,0.07692307692307693],[0,0,0,0,0,0,0.25,0,0,0,0,0,0,0.034482758620689655,0,0,0,0.07692307692307693],[0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0,0,0.034482758620689655,0,0,0,0.07692307692307693],[0,0,0,0,0.041666666666666664,0.041666666666666664,0,0,0,0,0,0,0,0.034482758620689655,0,0,0,0],[0,0,0,0,0.041666666666666664,0.041666666666666664,0,0,0,0,0,0,0,0.034482758620689655,0,0,0,0],[0,0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0.07692307692307693,0.034482758620689655,0,0,0,0],[0,0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0.07692307692307693,0.034482758620689655,0,0,0,0],[0,0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0,0,0,0,0,0],[0,0.05555555555555555,0,0,0,0,0,0.1,0,0,0,0,0,0,0,0,0.3333333333333333,0],[0,0,0,0,0.041666666666666664,0.041666666666666664,0,0.1,0,0,0,0,0,0,0,0,0,0],[0,0.05555555555555555,0,0,0,0,0,0.1,0,0,0,0,0,0,0,0,0.3333333333333333,0],[0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0,0,0.034482758620689655,0,0,0,0.07692307692307693],[0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0,0,0.034482758620689655,0,0,0,0.07692307692307693],[0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0,0,0.034482758620689655,0,0,0,0.07692307692307693],[0,0.05555555555555555,0.2,0,0,0,0,0.1,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0.07692307692307693,0.034482758620689655,0,0,0,0],[0,0,0,0,0.041666666666666664,0,0,0,0,0,0.25,0,0,0.034482758620689655,0,0,0,0],[0.1111111111111111,0.05555555555555555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0.07692307692307693,0.034482758620689655,0,0,0,0],[0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0,0,0.034482758620689655,0,0,0,0.07692307692307693],[0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0,0,0.034482758620689655,0,0,0,0.07692307692307693],[0,0,0,0,0,0.041666666666666664,0,0,0,0.3333333333333333,0,0,0.07692307692307693,0,0,0,0,0],[0,0,0,0.125,0,0,0,0.1,0,0,0,0,0,0,0,0,0,0],[0,0.05555555555555555,0,0,0,0,0.25,0,0,0,0,0,0,0,0,0.5,0,0],[0,0,0.2,0.125,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0.1,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0,0.07692307692307693,0.034482758620689655,0,0,0,0],[0,0.05555555555555555,0,0,0,0.041666666666666664,0,0,0,0,0,0,0,0,0,0,0,0],[0.1111111111111111,0.05555555555555555,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0.1111111111111111,0,0,0.125,0,0,0,0,0,0,0,0,0,0.034482758620689655,0,0,0,0],[0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0,0,0,0,0,0,0.07692307692307693],[0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0,0,0,0,0,0,0.07692307692307693],[0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0,0,0,0,0,0,0.07692307692307693],[0,0,0,0.125,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0.05555555555555555,0.2,0,0,0,0,0,0,0,0,0,0,0.034482758620689655,0,0,0,0],[0,0,0,0,0.041666666666666664,0.041666666666666664,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0.07692307692307693,0.034482758620689655,0,0,0,0],[0,0,0,0,0,0.041666666666666664,0,0,0,0,0,0,0.07692307692307693,0.034482758620689655,0,0,0,0] ]
var predictions = [7,10,8,9,7,3,7,7,10,7,5,6,7,9,8,7,7,7,9,8,7,6,8,8,10,8,7,5,5,8,6,5,6,8,8,2,6,8,7,6,6,5,9,6,6,10,7,7,6,6,10,8,9,7,8,6,8,9,9,7,6,9,7,6,7,7]
However I get the following console error:
Error: input must not be empty
at mean (index.js:12)
at squaredError (utils.js:82)
at Object.regressionError [as regression] (utils.js:106)
at TreeNode.bestSplit (TreeNode.js:57)
at TreeNode.train (TreeNode.js:157)
at DecisionTreeRegression.train (DecisionTreeRegression.js:43)
at RandomForestRegression.train (RandomForestBase.js:95)
at Object. (VJrxxZeJeWDr:131)
at Object.invoke (angular.js:5040)
at $controllerInit (angular.js:11000)

Feature Bagging Options

Hi,

thank you for your work on this library.

Other implementations of random forests apply feature bagging at every split during tree generation. So I think it would be better to implement it at the CART level, not here.

Also, "replacement" is a bit of weird option, since it makes no sense to supply a feature more than once to the tree generation. Thus, it basically just randomly shrinks the number of features used for a tree.

Default seed makes a random forest generate same estimators

Hi! Thanks for bringing random forests to the JS world! I was experimenting with making ml-random-forest produce feature importance values and found this strange behavior. It can be reproduced with Iris or any other training data:

var IrisDataset = require('ml-dataset-iris')
var { RandomForestClassifier } = require('ml-random-forest')
var trainingSet = IrisDataset.getNumbers()
var predictions = IrisDataset.getClasses().map((elem) => IrisDataset.getDistinctClasses().indexOf(elem))

var options = {
  maxFeatures: 0.8,
  replacement: true,
  nEstimators: 25
}

var classifier = new RandomForestClassifier(options)
classifier.train(trainingSet, predictions)                                                                                                    
console.log(classifier.indexes)
console.log(JSON.stringify(classifier.estimators[0]) === JSON.stringify(classifier.estimators[1]))

Produces:

[
  [ 2, 3, 0 ], [ 2, 3, 0 ], [ 2, 3, 0 ],
  [ 2, 3, 0 ], [ 2, 3, 0 ], [ 2, 3, 0 ],
  [ 2, 3, 0 ], [ 2, 3, 0 ], [ 2, 3, 0 ],
  [ 2, 3, 0 ], [ 2, 3, 0 ], [ 2, 3, 0 ],
  [ 2, 3, 0 ], [ 2, 3, 0 ], [ 2, 3, 0 ],
  [ 2, 3, 0 ], [ 2, 3, 0 ], [ 2, 3, 0 ],
  [ 2, 3, 0 ], [ 2, 3, 0 ], [ 2, 3, 0 ],
  [ 2, 3, 0 ], [ 2, 3, 0 ], [ 2, 3, 0 ],
  [ 2, 3, 0 ]
]
true

So without manually resetting the seed with {seed: undefined} a random forest is not better than a decision tree.

That show two issues:

  1. Having default seed is not expected behavior. Random forest results should not be deterministic.
  2. When the seed is set, it should not prevent splitting data on different chunks for training. Maybe generate new seeds for each sample with seed+1, seed+2 or something else?

I can create a PR to fix this

Quantile estimation

Hi , I wonder if it could be possible to handle quantile informations from the library ?

Add logging and verbosity level

Please add options.verbosity and logging to track the train process.
Now it can take hours and there is no evidence of how far the model approaches.

Poor accuracy

Using your example with the Iris dataset I'm only getting around 75% accuracy. I believe a random forest should be able to fit the Iris dataset to around 90%. Do you get the same accuracy as me? I'm concerned because there might be an issue with the implementation of either the forest or the decision tree classifier.

RandomForestBase load showing error

This is caused in the DecisionTreeClassifier load method not finding the 'name' attribute in the json. The solution is to use the toJSON method of the DecisionTreeClassifier when creating the json in RandomForestBase.toJSON.

I solved it locally so if I get the permissions I would create a PR with this change.

Inconsistent array dimensions

I'm trying to get this model to work with a label-to-category dataset but I get this error and the docs didn't help in seeing what was wrong.

/mnt/c/Users/max/Projects/ac-learn/node_modules/ml-matrix/matrix.js:3101                                                                                                          
  throw new RangeError('Inconsistent array dimensions');
  ^
RangeError: Inconsistent array dimensions
at new Matrix (/mnt/c/Users/max/Projects/ac-learn/node_modules/ml-matrix/matrix.js:3101:17)
at Function.checkMatrix (/mnt/c/Users/max/Projects/ac-learn/node_modules/ml-matrix/matrix.js:1373:47)
at RandomForestClassifier.train (/mnt/c/Users/max/Projects/ac-learn/node_modules/ml-random-forest/lib/index.js:154:33)
at Object.<anonymous> (/mnt/c/Users/max/Projects/ac-learn/index.js:17:12)
at Module._compile (internal/modules/cjs/loader.js:799:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:810:10)
at Module.load (internal/modules/cjs/loader.js:666:32)
at tryModuleLoad (internal/modules/cjs/loader.js:606:12)
at Function.Module._load (internal/modules/cjs/loader.js:598:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:862:12)

Here's the code:

const RFClassifier = require('ml-random-foreset').RandomForestClassifier
const LabelDataset = require('./src/dataset')

const trainingSet = LabelDataset.getLabels()
const predictions = LabelDataset.getCategories().map(elem =>
  LabelDataset.getDistinctCategories().indexOf(elem),
)

const options = {
  seed: 3,
  maxFeatures: 0.8,
  replacement: true,
  nEstimators: 25,
}

const classifier = new RFClassifier(options)
classifier.train(trainingSet, predictions)
const result = classifier.predict(trainingSet)
/* eslint-disable no-console */
console.log('result=')
console.dir(result)
/* /* eslint-enable no-console */

I'm fairly new to ML (especially in JS) so I can't tell if something in options is wrong or if I should use ml-cart (which gave the exact same error with the `options from the README) or if the classification model that suits my problem (classifying a set of GitHub labels into categories) is neither Random Forest or Decision Tree.

Export `RandomForestBaseOptions` type

Please export RandomForestBaseOptions type from this package. It will be useful for type safety when you have an array of options during hyper-parameter optimization.

New feature: max_samples option for sample bootstrapping

Hello maintainers,

It would be nice if we have a max_samples option to determine the number of samples to draw from the dataset to train each estimator. The RF classifier implementation of Scikit Learn also has this feature.

I have implemented this in my forked version and can quickly create a PR.

Feature Importance

Hi,
I was looking to get some sort of feature importance out of RF, at least the basic Mean Decrease in Impurity.
Quickly browsed through the source code (including ml-cart) but it's clearly above my current skills to implement such a function (as present in scikit-learn).
Any chance it can be implemented in the future?
thanks

Can a model be saved?

Hi guys! Really cool work!!!

A question: can a model be saved and stored/serialized in a file for later usage?

Thanks,
Paul

Load model that was saved as JSON

I'm really enjoying this library. Thank you for all your work!

At the moment, it is possible to train and save a random forest model with toJSON(), but I don't see how to load a saved model. It would be really useful to be able to load pre-trained models.

Column indices are out of range

The error "column indices are out of range error" appears when I try
regression.train([[73, 80],[93, 88]],[152,182])

Uncaught RangeError: column indices are out of range
at checkColumnIndices (util.js:102:11)
at new MatrixColumnSelectionView (columnSelection.js:7:21)
at RandomForestRegression.train (RandomForestBase.js:130:20)
at processRegression (index.html:74:28)
at HTMLButtonElement.onclick (index.html:35:47)

types.d.ts file is causing compile error

i imported the lib in my backend project but the types.d.ts file is causing compile errors.

`node_modules/ml-random-forest/types/types.d.ts:25:6 - error TS1036: Statements are not allowed in ambient contexts.

25 };
~
node_modules/ml-random-forest/types/types.d.ts:27:22 - error TS2304: Cannot find name 'DecisionTreeClassifier'.

27 type Estimator = DecisionTreeClassifier | DecisionTreeRegression;
~~~~~~~~~~~~~~~~~~~~~~
node_modules/ml-random-forest/types/types.d.ts:27:47 - error TS2304: Cannot find name 'DecisionTreeRegression'.

27 type Estimator = DecisionTreeClassifier | DecisionTreeRegression;
~~~~~~~~~~~~~~~~~~~~~~
node_modules/ml-random-forest/types/types.d.ts:29:36 - error TS2689: Cannot extend an interface 'RandomForestBaseOptions'. Did you mean 'implements'?

29 class RandomForestBase extends RandomForestBaseOptions {
~~~~~~~~~~~~~~~~~~~~~~~
node_modules/ml-random-forest/types/types.d.ts:175:5 - error TS2666: Exports and export assignments are not permitted in module augmentations.

175 export { RandomForestClassifier, RandomForestRegression }
~~~~~~

Found 5 error(s).`

it works fine when i rename the types file to types.ts but it's just temporary.
Note: The library works fine in my front end js project.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.