Neural Network Classification

by wybiral

HTML

<script src="http://www.numericjs.com/lib/numeric-1.2.3.min.js"></script>
<script src="http://underscorejs.org/underscore-min.js"></script>
<body>
    <div id="toolbar">Alpha:
        <input id="alpha" type="text" value="0.1" size="10" />Lambda:
        <input id="lambda" type="text" value="0.0" size="10" />Group:
        <select id="group">
            <option value="0">Blue</option>
            <option value="1">Orange</option>
        </select>
    </div>
    <div id="content">
        <canvas id="canvas"></canvas>
    </div>
</body>

CSS

#toolbar, #content {
    width: 400px;
    margin: 0;
    padding: 0;
    text-align: center;
}
body, input, select {
    font: bold 11px arial, sans-serif;
}

JavaScript

var sum = numeric.sum,
    mul = numeric.mul,
    div = numeric.div,
    dot = numeric.dot,
    add = numeric.add,
    sub = numeric.sub,
    neg = numeric.neg,
    log = numeric.log,
    pow = numeric.pow,
    sqrt = numeric.sqrt,
    abs = numeric.abs,
    min = numeric.min,
    max = numeric.max,
    transpose = numeric.transpose;

function fmincg(f, X, length) {
    var mul = numeric.mul,
        dot = numeric.dot,
        add = numeric.add,
        sub = numeric.sub,
        min = Math.min,
        max = Math.max,
        abs = Math.abs,
        sqrt = Math.sqrt,
        realmin = Number.MIN_VALUE,
        EXT = 3,
        RHO = 0.01,
        SIG = 0.5,
        INT = 0.1,
        MAX = 20,
        RATIO = 100,
        M = 0,
        i = 0,
        red = 1,
        ls_failed = 0,
        evaluateCost = f(X),
        f1 = evaluateCost.cost,
        df1 = evaluateCost.gradient;
    i = i + (length < 0 ? 1 : 0);
    var s = mul(df1, -1);
    var d1 = dot(mul(s, -1), s);
    var z1 = red / (1 - d1);
    while (i < abs(length)) {
        i = i + (length > 0 ? 1 : 0);
        var X0 = X;
        var f0 = f1;
        var df0 = df1;
        X = add(X, mul(s, z1));
        var evaluateCost2 = f(X);
        var f2 = evaluateCost2.cost;
        var df2 = evaluateCost2.gradient;
        i = i + (length < 0 ? 1 : 0);
        var d2 = dot(df2, s);
        var f3 = f1;
        var d3 = d1;
        var z3 = -z1;
        if (length > 0) {
            M = MAX;
        } else {
            M = min(MAX, -length - i);
        }
        var success = 0;
        var limit = -1;
        while (true) {
            while (((f2 > f1 + z1 * RHO * d1) | (d2 > -SIG * d1)) && (M > 0)) {
                limit = z1;
                var z2 = 0;
                var A = 0;
                var B = 0;
                if (f2 > f1) {
                    z2 = z3 - (0.5 * d3 * z3 * z3) / (d3 * z3 + f2 - f3);
                } else {
                    A = 6 * (f2 - f3) / z3 + 3 * (d2 + d3);
        ...