Skip to content

Commit

Permalink
add pcp management
Browse files Browse the repository at this point in the history
  • Loading branch information
jdfekete committed Aug 4, 2015
1 parent 6bd01c9 commit d90406c
Show file tree
Hide file tree
Showing 6 changed files with 207 additions and 4 deletions.
3 changes: 2 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ reorder.v1.js: \
src/pca_order.js \
src/ca.js \
src/cuthill_mckee_order.js \
src/condition.js
src/condition.js \
src/pcp.js

test: all
@npm test
Expand Down
23 changes: 21 additions & 2 deletions examples/pcp/index.html
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
<meta charset="UTF8">
<script src="../../lib/d3.v3.js"></script>
<script src="../../lib/d3.parcoords.js"></script>
<script src="../../lib/science.v1.js"></script>
<script src="../../lib/tiny-queue.js"></script>
<script src="../../reorder.v1.js"></script>
<link rel="stylesheet" type="text/css" href="../../lib/d3.parcoords.css">
<div id="example" class="parcoords" style="width:360px;height:150px"></div>
<div id="example2" class="parcoords" style="width:360px;height:150px"></div>

<script>
var data = [
Expand All @@ -11,11 +15,26 @@
[2,-2,4,4,0.5,2],
[3,-3,9,6,0.33,4],
[4,-4,16,8,0.25,9]
];
],
dimensions = reorder.range(6),
axes = ['a', 'b', 'c', 'd', 'e', 'f'];

var pc = d3.parcoords()("#example")
.data(data)
.data(reorder.array_to_dicts(data, axes))
.render()
.ticks(3)
.createAxes();

var pcp = reorder.pcp(data, axes),
ndata = pcp[0],
perm = pcp[1],
naxes = pcp[2];

var pc2 = d3.parcoords()("#example2")
.data(reorder.array_to_dicts(ndata, naxes))
.render()
.ticks(3)
.dimensions(naxes)
.createAxes();

</script>
80 changes: 80 additions & 0 deletions reorder.v1.js
Original file line number Diff line number Diff line change
Expand Up @@ -2689,4 +2689,84 @@ reorder.condition = function(matrix) {
}
return ret;
};
function array_to_dicts(data, axes) {
if (arguments.length < 2)
axes = reorder.range(data[0].length);
var ret = [], row, dict, i, j;
for (i = 0; i < data.length; i++) {
row = data[i];
dict = {};
for (j = 0; j < row.length; j++) {
dict[axes[j]] = row[j];
}
ret.push(dict);
}
return ret;
}

reorder.array_to_dicts = array_to_dicts;

function dicts_to_array(dicts, keys) {
if (arguments.length < 2)
keys = Object.keys(dicts[0]);
var n = keys.length,
m = dicts.length,
array = Array(m), i, j, row;

for (i = 0; i < m; i++) {
row = Array(n);
array[i] = row;
for (j = 0; j < n; j++)
row[j] = dicts[i][keys[j]];
}
return array;
}

reorder.dicts_to_array = dicts_to_array;

function abs_matrix(x) {
return x.map(function(y) { return y.map(Math.abs); });
}

function pcp(data, axes) {
if (arguments.length < 2)
axes = reorder.range(data[0].length);
var tdata = reorder.transpose(data),
pcor = reorder.correlation.pearsonMatrix(tdata),
abs_pcor = abs_matrix(pcor),
h1 = science.stats.hcluster()
.linkage("complete")
.distanceMatrix(abs_pcor)(tdata),
perm = reorder.optimal_leaf_order()
.distanceMatrix(abs_pcor)(tdata),
naxes = reorder.permute(axes, perm);
tdata = reorder.permute(tdata, perm);

var i, c, sign = 1, signs = [], negs=0;

console.log('Permutation is '+perm);

for (i = 1; i < tdata.length; i++) {
c = pcor[perm[i-1]][perm[i]];
if (c < 0)
sign = -sign;
if (sign < 0) {
signs.push(-1);
negs++;
}
else
signs.push(1);
}
sign = (negs > (tdata.length-negs)) ? -1 : 1;
for (i = 0; i < (tdata.length-1); i++) {
if (signs[i]*sign < 0) {
naxes[i] = '-'+naxes[i];
tdata[i] = tdata[i].map(function(x) { return -x; });
}
}
var ndata = reorder.transpose(tdata);
return [ndata, perm, naxes];
}

reorder.pcp = pcp;
})(this);
2 changes: 1 addition & 1 deletion reorder.v1.min.js

Large diffs are not rendered by default.

80 changes: 80 additions & 0 deletions src/pcp.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
function array_to_dicts(data, axes) {
if (arguments.length < 2)
axes = reorder.range(data[0].length);
var ret = [], row, dict, i, j;
for (i = 0; i < data.length; i++) {
row = data[i];
dict = {};
for (j = 0; j < row.length; j++) {
dict[axes[j]] = row[j];
}
ret.push(dict);
}
return ret;
}

reorder.array_to_dicts = array_to_dicts;

function dicts_to_array(dicts, keys) {
if (arguments.length < 2)
keys = Object.keys(dicts[0]);
var n = keys.length,
m = dicts.length,
array = Array(m), i, j, row;

for (i = 0; i < m; i++) {
row = Array(n);
array[i] = row;
for (j = 0; j < n; j++)
row[j] = dicts[i][keys[j]];
}
return array;
}

reorder.dicts_to_array = dicts_to_array;

function abs_matrix(x) {
return x.map(function(y) { return y.map(Math.abs); });
}

function pcp(data, axes) {
if (arguments.length < 2)
axes = reorder.range(data[0].length);
var tdata = reorder.transpose(data),
pcor = reorder.correlation.pearsonMatrix(tdata),
abs_pcor = abs_matrix(pcor),
h1 = science.stats.hcluster()
.linkage("complete")
.distanceMatrix(abs_pcor)(tdata),
perm = reorder.optimal_leaf_order()
.distanceMatrix(abs_pcor)(tdata),
naxes = reorder.permute(axes, perm);
tdata = reorder.permute(tdata, perm);

var i, c, sign = 1, signs = [], negs=0;

console.log('Permutation is '+perm);

for (i = 1; i < tdata.length; i++) {
c = pcor[perm[i-1]][perm[i]];
if (c < 0)
sign = -sign;
if (sign < 0) {
signs.push(-1);
negs++;
}
else
signs.push(1);
}
sign = (negs > (tdata.length-negs)) ? -1 : 1;
for (i = 0; i < (tdata.length-1); i++) {
if (signs[i]*sign < 0) {
naxes[i] = '-'+naxes[i];
tdata[i] = tdata[i].map(function(x) { return -x; });
}
}
var ndata = reorder.transpose(tdata);
return [ndata, perm, naxes];
}

reorder.pcp = pcp;
23 changes: 23 additions & 0 deletions test/pcp-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
require("science");
require("../reorder.v1");

var vows = require("vows"),
assert = require("assert");

var suite = vows.describe("reorder.pcp");

suite.addBatch({
"pcp": {
"simple": function() {
var earray = [[0, 1, 2], [3, 4, 5]],
dicts = reorder.array_to_dicts(earray);
assert.equal(dicts.length, earray.length);
var array = reorder.dicts_to_array(dicts);
assert.deepEqual(earray,array);
}
}
});

suite.export(module);


0 comments on commit d90406c

Please sign in to comment.