gauss
文件大小: unknow
源码售价: 5 个金币 积分规则     积分充值
资源说明:JavaScript statistics, analytics, and data library - Node.js and web browser ready
Gauss
=============
[![Build Status](https://travis-ci.org/Dwolla/arbalest.svg?branch=master)](https://travis-ci.org/wayoutmind/gauss)
[![Dependency Status](https://gemnasium.com/wayoutmind/gauss.png)](https://gemnasium.com/wayoutmind/gauss)

> JavaScript statistics, analytics, and set library - [Node.js](http://nodejs.org/) and web browser ready

Evented, asynchronous, and fast, [Node.js][1] is an attractive platform for data mining, statistics, and data analysis.
[Gauss](http://en.wikipedia.org/wiki/Carl_Friedrich_Gauss) makes it easy to calculate and explore data through JavaScript,
both on Node.js and within the web browser.

[1]: http://nodejs.org/

## License
MIT/X11 - See [LICENSE][2]

## Support
Mailing list - [Google Group](https://groups.google.com/forum/?pli=1#!forum/gaussjs)

[2]: http://github.com/wayoutmind/gauss/blob/master/LICENSE

## Getting started

### Install with NPM (Node Package Manager)

Getting started with Gauss + Node.js is easy:

    $ npm install gauss

``` javascript
var gauss = require('gauss');
```

### Using Gauss within a web browser

Gauss requires support for ECMAScript 5 `Object.defineProperty`. Compatibility is listed [here](http://kangax.github.com/es5-compat-table/). Download and include [gauss.min.js](https://raw.github.com/wayoutmind/gauss/master/gauss.min.js):

``` html


```

The [Bower](http://bower.io/) package manager can also be used to install Gauss:

    $ bower install gauss

Gauss is also [Asynchronous Module Definition](http://requirejs.org/docs/whyamd.html) compatible and
works with module loaders like [RequireJS](http://requirejs.org):

``` html


```

### Installing development dependencies and running tests

To run Gauss's tests you'll need [Vows](http://vowsjs.org/). NPM can automatically resolve this:

    $ npm install gauss --devel

To invoke the tests:

    $ npm test

## API

### Instantiation

``` javascript
// List of numbers
var set = new gauss.Vector(5, 1, 3, 2, 21);
// From a regular Array
var numbers = new gauss.Vector([8, 6, 7, 5, 3, 0, 9]);
// After instantiation, Gauss objects can be conveniently used like any Array
numbers[0] = 2;
set[1] = 7;
```

*Note: To prevent unintended scope/prototype pollution, Gauss versions after 0.2.3 have [removed support for monkey patching](https://github.com/wayoutmind/gauss/issues/6) the native Array data type.
Use the .toArray() method of any Gauss object to a convert to a vanilla Array.*

### Scope chaining

Gauss collections utilize scope chaining for converting between collection types:

``` javascript
var Collection = gauss.Collection;
var things = new Collection(
    { type: 1, age: 1 },
    { type: 2, age: 2 },
    { type: 1, age: 3 },
    { type: 2, age: 4 });
things
    .find({ type: 2 })
    .map(function(thing) { return thing.age; })
    .toVector() // Scope chained converter, converting mapped collection of ages to Vector
    .sum();
```

### Callbacks and method chaining

All of Gauss's methods accept an *optional* [callback][3]:

[3]: http://en.wikipedia.org/wiki/Callback_(computer_programming)

``` javascript
set.min();
set.min(function(result) {
    result / 2;
    /* Do more things with the minimum*/
});
```

In addition, for methods that return another Vector, method chaining makes it easy to perform calculations that flow through each other:

``` javascript
set.quantile(4).stdev(); // Find the standard deviation of data set's quartiles
```

Finally, you can mix and match both callbacks and chaining:

``` javascript
set.quantile(4).stdev(function(stdev) {
    if (stdev > 1) {
        /* Do something awesome */
    }
});
```

### Collection

#### Collection.indexBy

    .indexBy(predicate, callback)

Returns the first index of an element that matches a condition.

#### Collection.indicesOf

    .indicesOf(element, callback)

Returns the indices of all elements that match a value.

#### Collection.indicesBy

    .indicesBy(predicate, callback)

Returns all indices of an element that match a condition.

#### Collection.lastIndexBy

    .lastIndexBy(predicate, callback)

Returns the last index of an element that matches a condition.

#### Collection.find

    .find(predicate, callback)

Returns all the elements that match a condition.

``` javascript
var people = new gauss.Collection(
  { firstname: 'John', lastname: 'Smith' },
  { firstname: 'Jane', lastname: 'Doe' },
  { firstname: 'Mike', lastname: 'Smith' },
  { firstname: 'Susan', lastname: 'Baker' }
);
// Using a predicate Function
people.find(function(e) { return e.firstname === 'Jane' });
> [{ firstname: 'Jane', lastname: 'Doe' }]
// Using a condition Object
people.find({ lastname: 'Smith' });
> [{ firstname: 'John', lastname: 'Smith' },
  { firstname: 'Mike', lastname: 'Smith' }]
```

#### Collection.findOne

    .findOne(predicate, callback)

Returns the first element that matches a condition.

``` javascript
// Using a predicate Function
people.findOne(function(e) { return e.firstname === 'Jane' });
> { firstname: 'Jane', lastname: 'Doe' }
// Using a condition Object
people.findOne({ lastname: 'Smith' });
> { firstname: 'John', lastname: 'Smith' }
```

#### Collection.split

    .split(predicate[, callback])

Returns a Collection split by a condition (binomial cluster).

``` javascript
Collection(1, 2, 3, 4).split(function(e) { return e % 2 === 0 });
> [[1, 3], [2, 4]]
```

#### Collection.mode

    .mode(callback)

Returns the value(s) that occur the most frequently in a data set. If there is a tie, returns a Collection of values.

#### Collection.frequency

    .frequency(element, callback)

Returns the number of occurrences of value within a data set.

#### Collection.distribution

    .distribution(format, callback)

Returns an `Object` containing the (frequency) distribution of values within the Collection. Default format: `absolute`; `relative` returns ratio of occurrences and total number of values in a data set.

``` javascript
set.distribution();
> {
    1: 1,
    2: 1,
    3: 1,
    5: 1,
    21: 1
  }
set.distribution('relative');
> {
    1: 0.2,
    2: 0.2,
    3: 0.2,
    5: 0.2,
    21: 0.2
  }
```

#### Collection.append

    .append(that, callback)

Return Collection appended with an Array.

``` javascript
var numbers = new Collection(1, 2, 3).append([1, 2, 3]);
> [1, 2, 3, 1, 2, 3]
```

#### Collection.unique

    .unique(callback)

Return a Collection with unique values.

``` javascript
var numbers = new Collection(1, 2, 3, 3, 4, 4).unique();
> [1, 2, 3, 4]
```

#### Collection.union

    .union(array, callback)

Return the union of a Collection with another array.

``` javascript
var union = new Collection('a', 'b', 'c').union(['c', 'd', 'e']);
> ['a', 'b', 'c', 'd', 'e']
```

#### Collection.extend

    .extend(methods, callback)

Returns a Collection extended with named functions.

### Vector

Extends *Collection* methods with numerical functions.

#### Vector.min

    .min(callback)

Returns the smallest number.

#### Vector.max

    .max(callback)

Returns the largest number.

#### Vector.equal

    .equal(that)

Returns `true` or `false` if Vector values are equal to another Vector or Array.

#### Vector.sum

    .sum(callback)

Returns the sum of the numbers.

#### Vector.product

    .product(callback)

Returns the product of the numbers.

#### Vector.push

    .push(number1, ..., numberN, callback)

Returns the updated Vector with one or more elements appended to the end; performs/maintains streaming calculations.

``` javascript
var Vector = require('gauss').Vector,
    digits = new Vector();
// Push some numbers in
digits.push(1, 2, 3);
> 3
digits.sum();
> 6
// Keep on pushing; sum is updated as numbers are pushed
 digits.push(4, 5, 6);
> 6
```
*Note: Streaming calculations like sum(), product(), variance(), and functions dependent on streaming capable functions benefit from O(1) amortized performance.*

#### Vector.range

    .range(callback)

Returns the difference between the largest and smallest value in a data set.

#### Vector.mean

    .mean(callback)

Returns the arithmetic mean.

#### Vector.gmean

    .gmean(callback)

Returns the geometric mean.

#### Vector.hmean

    .hmean(callback)

Returns the harmonic mean.

#### Vector.qmean

    .qmean(callback)

Returns the quadratic mean (RMS, root mean square).

#### Vector.pmean

    .pmean(p, callback)

Returns the power/generalized mean given an order or power *p*.

```javascript
// p = -1, harmonic mean
set.pmean(-1);
// p = 1, arithmetic mean
set.pmean(1);
// p = 2, quadratic mean
set.pmean(2);
```

#### Vector.median

    .median(callback)

Returns the median. If there are an even amount of numbers in the data set, returns the arithmetic mean of the two middle values.

#### Vector.mode

    .mode(callback)

Returns the value(s) that occur the most frequently in a data set. If there is a tie, returns a Vector of values.

#### Vector.variance

    .variance(callback)

Returns a measure of how far a set of numbers are spread out from each other.

#### Vector.stdev

    .stdev(percent, callback)

Returns the standard deviation of data set. If a percent is given, returns the standard deviation with respect to a percentile of the population.

#### Vector.frequency

    .frequency(value, callback)

Returns the number of occurrences of value within a data set.

#### Vector.percentile

    .percentile(value, callback)

Returns the value that below which a certain percent of observations fall within the data set.

#### Vector.density

    .density(percent, callback)

Returns a Vector which is a percentile subset of values occurring within a data set.

#### Vector.distribution

    .distribution(format, callback)

Returns an `Object` containing the (frequency) distribution of values within the Vector. Default format: `absolute`; `relative` returns ratio of occurrences and total number of values in a data set.

``` javascript
set.distribution();
> {
    1: 1,
    2: 1,
    3: 1,
    5: 1,
    21: 1
  }
set.distribution('relative');
> {
    1: 0.2,
    2: 0.2,
    3: 0.2,
    5: 0.2,
    21: 0.2
  }
```

#### Vector.quantile

    .quantile(quantity, callback)

Returns a Vector of values that divide a frequency distribution into equal groups, each containing the same fraction of the total data set.

``` javascript
set.quantile(4); // Quartiles
```

#### Vector.sma

    .sma(period, callback)

Returns a Vector of the simple moving average (SMA); unweighted means of the previous n data points. `period` is the length of observation window for moving average.

``` javascript
var prices = [22.2734, 22.194, 22.0847, 22.1741, 22.184, 22.1344,
22.2337, 22.4323, 22.2436, 22.2933, 22.1542, 22.3926,
22.3816, 22.6109, 23.3558, 24.0519, 23.753, 23.8324,
23.9516, 23.6338, 23.8225, 23.8722, 23.6537, 23.187,
23.0976, 23.326, 22.6805, 23.0976, 22.4025, 22.1725];

prices = prices.toVector();

// 10-period SMA
prices.sma(10);
> [ 22.22475, 22.21283, 22.232689999999998,
    22.26238, 22.30606, 22.42324,
    22.61499, 22.76692, 22.90693,
    23.07773, 23.211779999999997, 23.37861,
    23.52657, 23.653779999999998, 23.711389999999998,
    23.68557, 23.61298, 23.50573,
    23.43225, 23.27734, 23.13121
  ]
```

#### Vector.ema

    .ema(options, callback)

Returns a Vector of the exponential moving average (EMA); weighted means of the previous n data points.
`options` is

- Number Length of the observation window for moving average, using the default smoothing ratio (2 / period + 1) **or**
- Object.period Length of the observation window for moving average
- Object.ratio Function returning a Number to be used as smoothing ratio

``` javascript
// 10-period EMA
prices.ema(10);
> [ 22.22475, 22.21192272727273, 22.24477314049587,
    22.269650751314803, 22.331696069257568, 22.51789678393801,
    22.796806459585646, 22.970659830570074, 23.127339861375514,
    23.27720534112542, 23.34204073364807, 23.429396963893875,
    23.509906606822263, 23.536050860127308, 23.47258706737689,
    23.40440760058109, 23.390151673202713, 23.261124096256765,
    23.231392442391897, 23.080684725593372, 22.91556023003094
  ]

// 10-period Welles Wilder EMA
prices.ema({
    period: 10,
    ratio: function(n) { return 1 / n; }
});
> [ 22.22475, 22.217695, 22.2351855,
    22.24982695, 22.285934255, 22.3929208295,
    22.55881874655, 22.678236871895, 22.793653184705498,
    22.90944786623495, 22.981883079611453, 23.065944771650308,
    23.146570294485276, 23.19728326503675, 23.196254938533073,
    23.186389444679765, 23.20035050021179, 23.14836545019061,
    23.14328890517155, 23.069210014654395, 22.979539013188955
  ]
```

#### Vector.delta

    .delta(callback)

Returns a Vector of values containing the sequential difference between numbers in a sequence.

#### Vector.add

    .add(other, callback)

Returns a new vector which is the result of adding the input, element-wise to existing vector.
Takes input of a Array of same length as the existing Vector, or a scalar.

``` javascript
var a = new Vector(1,2);
var b = new Vector(3,4);
a.add(b)
> [4,6]
a.add(10)
> [11,13]
```

#### Vector.subtract

    .subtract(other, callback)

Returns a new vector which is the result of subtracting the input, element-wise from the existing vector.
Takes input of a Array of same length as the existing Vector, or a scalar.

#### Vector.multiply

    .multiply(other, callback)

Returns a new vector which is the result of element-wise multiplying the existing vector by the input.
Takes input of a Array of same length as the existing Vector, or a scalar.

#### Vector.divide

    .divide(other, callback)

Returns a new vector which is the result of element-wise dividing the existing vector by the input.
Takes input of a Array of same length as the existing Vector, or a scalar.

#### Vector.extend

    .extend(methods, callback)

Returns a Vector extended with named functions.

Within the function body, `this` is attached to the Vector being extended and the function may take zero or more arguments.
To maintain chainability, return `this`.

``` javascript
// Instantiate a new Vector with extensions
var set = new Vector(14, 6, 9, 3, 18,
    7, 11, 1, 2, 20,
    12, 16, 8, 4, 5,
    19, 15, 17, 10, 13
).extend({
    head: function() {
        return this[0];
    },
    tail: function() {
        return this.slice(1);
    }
});
set.head()
> 14
set.tail()
> [ 6, 9, 3, 18,
    7, 11, 1, 2, 20,
    12, 16, 8, 4, 5,
    19, 15, 17, 10, 13
  ]
// Extend instantiated objects
set.extend({
    // Distribution of deltas
    ddist: function(format) {
        return this.delta().distribution(format);
    }
});
set.ddist('relative')
> {
    '1': 0.10526315789473684,
    '2': 0.05263157894736842,
    '3': 0.10526315789473684,
    '4': 0.10526315789473684,
    '14': 0.05263157894736842,
    '15': 0.05263157894736842,
    '18': 0.05263157894736842,
    '-11': 0.05263157894736842,
    '-10': 0.05263157894736842,
    '-8': 0.15789473684210525,
    '-7': 0.05263157894736842,
    '-6': 0.05263157894736842,
    '-4': 0.10526315789473684
  }
```

#### Vector.copy

    .copy(callback)

Returns a copy of the data set.

#### Vector.clone

    .clone(callback)

Returns another instance of the Vector object and data.

### Sample

By default, `Vector` calculates values against the population `n`. However, sample statistics functions on `n - 1` are available by using the `sample` modifier for the following functions:

``` javascript
Vector().sample
{ mean: [Function],
  gmean: [Function],
  hmean: [Function],
  qmean: [Function],
  pmean: [Function],
  variance: [Function],
  stdev: [Function] }
```

### Math

`Vector` supports applying all the [Math](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Math#Methods) object methods to an entire Vector set of numbers.

For example, applying `pow` primitive method on a set to calculate the quadratic mean

``` javascript
var squares = set.pow(2); // A Vector of set's members squared
> [25, 1, 9, 4, 441]
Math.sqrt(squares.sum() / squares.length); // Sum the squares -> find average -> quadratic mean (RMS)
> 9.797958971132712
```

### TimeSeries

*Deprecated*

Perform time series analysis. TimeSeries currently accepts time in epoch milliseconds followed by a numeric value.

``` javascript
var gauss = require('gauss');
var set = new gauss.TimeSeries([1315378833000, 3.5], [1315789015000, 7.826]);
```

#### TimeSeries.times

    .times(callback)

Returns a Vector of the times.

#### TimeSeries.values

    .values(callback)

Returns a Vector of the time series values.

### Using the REPL console

To experiment with Gauss or to quickly start a Node.js command-line environment for number crunching, Gauss ships with a lightweight REPL (Read–eval–print loop). Start the REPL with `npm start` within the source directory, or `gauss` if installed globally (via `npm install -g gauss`).

For example, using the `help()` function and analyzing a data file from the Gauss REPL:

``` javascript
$ gauss
gauss> help()
Gauss 0.2.12
   /* https://github.com/wayoutmind/gauss#api */
   Functions: print, inspect, cwd, clear, install, uninstall, help
   Usage:
     var set = new Vector(1, 2, 3);
     var times = new gauss.TimeSeries();
{ version: '0.2.10',
  Collection: [Function],
  Vector: [Function],
  TimeSeries: [Function] }
gauss> var fs = require('fs');
gauss> var data = fs.readFileSync('data.txt').toString();
gauss> data = data.split('\n');
[ '8',
  '6',
  '7',
  '5',
  '3',
  '0',
  '9' ]
gauss> data = data.map(function(line) { return parseInt(line) });
gauss> var set = new Vector(data);
gauss> set.mean()
5.428571428571429
```

本源码包内暂不包含可直接显示的源代码文件,请下载源码包。