d3_rails 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/d3_rails/version.rb +1 -1
- data/vendor/assets/javascripts/colorbrewer.js +32 -0
- data/vendor/assets/javascripts/d3_rails.js +1 -1
- data/vendor/assets/javascripts/science.js +225 -0
- data/vendor/assets/javascripts/science.lin.js +27 -0
- data/vendor/assets/javascripts/science.lin.min.js +1 -0
- data/vendor/assets/javascripts/science.min.js +1 -0
- data/vendor/assets/javascripts/science.stats.js +720 -0
- data/vendor/assets/javascripts/science.stats.min.js +1 -0
- data/vendor/assets/stylesheets/LICENSE +38 -0
- data/vendor/assets/stylesheets/azimuthal.css +21 -0
- data/vendor/assets/stylesheets/box.css +4 -0
- data/vendor/assets/stylesheets/bubble.css +8 -0
- data/vendor/assets/stylesheets/bullet.css +10 -0
- data/vendor/assets/stylesheets/bundle-radial.css +9 -0
- data/vendor/assets/stylesheets/bundle-treemap.css +14 -0
- data/vendor/assets/stylesheets/button.css +35 -0
- data/vendor/assets/stylesheets/calendar.css +16 -0
- data/vendor/assets/stylesheets/cartogram.css +20 -0
- data/vendor/assets/stylesheets/chord.css +9 -0
- data/vendor/assets/stylesheets/choropleth.css +16 -0
- data/vendor/assets/stylesheets/clock.css +23 -0
- data/vendor/assets/stylesheets/cluster.css +15 -0
- data/vendor/assets/stylesheets/colorbrewer.css +1327 -0
- data/vendor/assets/stylesheets/force.css +9 -0
- data/vendor/assets/stylesheets/horizon.css +9 -0
- data/vendor/assets/stylesheets/kde.css +9 -0
- data/vendor/assets/stylesheets/line.css +22 -0
- metadata +33 -7
data/lib/d3_rails/version.rb
CHANGED
@@ -0,0 +1,32 @@
|
|
1
|
+
/*
|
2
|
+
* This product includes color specifications and designs developed by Cynthia
|
3
|
+
* Brewer (http://colorbrewer.org/).
|
4
|
+
*/
|
5
|
+
var colorbrewer = {
|
6
|
+
YlGn:{3:["rgb(247,252,185)","rgb(173,221,142)","rgb(49,163,84)"],4:["rgb(255,255,204)","rgb(194,230,153)","rgb(120,198,121)","rgb(35,132,67)"],5:["rgb(255,255,204)","rgb(194,230,153)","rgb(120,198,121)","rgb(49,163,84)","rgb(0,104,55)"],6:["rgb(255,255,204)","rgb(217,240,163)","rgb(173,221,142)","rgb(120,198,121)","rgb(49,163,84)","rgb(0,104,55)"],7:["rgb(255,255,204)","rgb(217,240,163)","rgb(173,221,142)","rgb(120,198,121)","rgb(65,171,93)","rgb(35,132,67)","rgb(0,90,50)"],8:["rgb(255,255,229)","rgb(247,252,185)","rgb(217,240,163)","rgb(173,221,142)","rgb(120,198,121)","rgb(65,171,93)","rgb(35,132,67)","rgb(0,90,50)"],9:["rgb(255,255,229)","rgb(247,252,185)","rgb(217,240,163)","rgb(173,221,142)","rgb(120,198,121)","rgb(65,171,93)","rgb(35,132,67)","rgb(0,104,55)","rgb(0,69,41)"]},
|
7
|
+
YlGnBu:{3:["rgb(237,248,177)","rgb(127,205,187)","rgb(44,127,184)"],4:["rgb(255,255,204)","rgb(161,218,180)","rgb(65,182,196)","rgb(34,94,168)"],5:["rgb(255,255,204)","rgb(161,218,180)","rgb(65,182,196)","rgb(44,127,184)","rgb(37,52,148)"],6:["rgb(255,255,204)","rgb(199,233,180)","rgb(127,205,187)","rgb(65,182,196)","rgb(44,127,184)","rgb(37,52,148)"],7:["rgb(255,255,204)","rgb(199,233,180)","rgb(127,205,187)","rgb(65,182,196)","rgb(29,145,192)","rgb(34,94,168)","rgb(12,44,132)"],8:["rgb(255,255,217)","rgb(237,248,177)","rgb(199,233,180)","rgb(127,205,187)","rgb(65,182,196)","rgb(29,145,192)","rgb(34,94,168)","rgb(12,44,132)"],9:["rgb(255,255,217)","rgb(237,248,177)","rgb(199,233,180)","rgb(127,205,187)","rgb(65,182,196)","rgb(29,145,192)","rgb(34,94,168)","rgb(37,52,148)","rgb(8,29,88)"]},
|
8
|
+
GnBu:{3:["rgb(224,243,219)","rgb(168,221,181)","rgb(67,162,202)"],4:["rgb(240,249,232)","rgb(186,228,188)","rgb(123,204,196)","rgb(43,140,190)"],5:["rgb(240,249,232)","rgb(186,228,188)","rgb(123,204,196)","rgb(67,162,202)","rgb(8,104,172)"],6:["rgb(240,249,232)","rgb(204,235,197)","rgb(168,221,181)","rgb(123,204,196)","rgb(67,162,202)","rgb(8,104,172)"],7:["rgb(240,249,232)","rgb(204,235,197)","rgb(168,221,181)","rgb(123,204,196)","rgb(78,179,211)","rgb(43,140,190)","rgb(8,88,158)"],8:["rgb(247,252,240)","rgb(224,243,219)","rgb(204,235,197)","rgb(168,221,181)","rgb(123,204,196)","rgb(78,179,211)","rgb(43,140,190)","rgb(8,88,158)"],9:["rgb(247,252,240)","rgb(224,243,219)","rgb(204,235,197)","rgb(168,221,181)","rgb(123,204,196)","rgb(78,179,211)","rgb(43,140,190)","rgb(8,104,172)","rgb(8,64,129)"]},
|
9
|
+
BuGn:{3:["rgb(229,245,249)","rgb(153,216,201)","rgb(44,162,95)"],4:["rgb(237,248,251)","rgb(178,226,226)","rgb(102,194,164)","rgb(35,139,69)"],5:["rgb(237,248,251)","rgb(178,226,226)","rgb(102,194,164)","rgb(44,162,95)","rgb(0,109,44)"],6:["rgb(237,248,251)","rgb(204,236,230)","rgb(153,216,201)","rgb(102,194,164)","rgb(44,162,95)","rgb(0,109,44)"],7:["rgb(237,248,251)","rgb(204,236,230)","rgb(153,216,201)","rgb(102,194,164)","rgb(65,174,118)","rgb(35,139,69)","rgb(0,88,36)"],8:["rgb(247,252,253)","rgb(229,245,249)","rgb(204,236,230)","rgb(153,216,201)","rgb(102,194,164)","rgb(65,174,118)","rgb(35,139,69)","rgb(0,88,36)"],9:["rgb(247,252,253)","rgb(229,245,249)","rgb(204,236,230)","rgb(153,216,201)","rgb(102,194,164)","rgb(65,174,118)","rgb(35,139,69)","rgb(0,109,44)","rgb(0,68,27)"]},
|
10
|
+
PuBuGn:{3:["rgb(236,226,240)","rgb(166,189,219)","rgb(28,144,153)"],4:["rgb(246,239,247)","rgb(189,201,225)","rgb(103,169,207)","rgb(2,129,138)"],5:["rgb(246,239,247)","rgb(189,201,225)","rgb(103,169,207)","rgb(28,144,153)","rgb(1,108,89)"],6:["rgb(246,239,247)","rgb(208,209,230)","rgb(166,189,219)","rgb(103,169,207)","rgb(28,144,153)","rgb(1,108,89)"],7:["rgb(246,239,247)","rgb(208,209,230)","rgb(166,189,219)","rgb(103,169,207)","rgb(54,144,192)","rgb(2,129,138)","rgb(1,100,80)"],8:["rgb(255,247,251)","rgb(236,226,240)","rgb(208,209,230)","rgb(166,189,219)","rgb(103,169,207)","rgb(54,144,192)","rgb(2,129,138)","rgb(1,100,80)"],9:["rgb(255,247,251)","rgb(236,226,240)","rgb(208,209,230)","rgb(166,189,219)","rgb(103,169,207)","rgb(54,144,192)","rgb(2,129,138)","rgb(1,108,89)","rgb(1,70,54)"]},
|
11
|
+
PuBu:{3:["rgb(236,231,242)","rgb(166,189,219)","rgb(43,140,190)"],4:["rgb(241,238,246)","rgb(189,201,225)","rgb(116,169,207)","rgb(5,112,176)"],5:["rgb(241,238,246)","rgb(189,201,225)","rgb(116,169,207)","rgb(43,140,190)","rgb(4,90,141)"],6:["rgb(241,238,246)","rgb(208,209,230)","rgb(166,189,219)","rgb(116,169,207)","rgb(43,140,190)","rgb(4,90,141)"],7:["rgb(241,238,246)","rgb(208,209,230)","rgb(166,189,219)","rgb(116,169,207)","rgb(54,144,192)","rgb(5,112,176)","rgb(3,78,123)"],8:["rgb(255,247,251)","rgb(236,231,242)","rgb(208,209,230)","rgb(166,189,219)","rgb(116,169,207)","rgb(54,144,192)","rgb(5,112,176)","rgb(3,78,123)"],9:["rgb(255,247,251)","rgb(236,231,242)","rgb(208,209,230)","rgb(166,189,219)","rgb(116,169,207)","rgb(54,144,192)","rgb(5,112,176)","rgb(4,90,141)","rgb(2,56,88)"]},
|
12
|
+
BuPu:{3:["rgb(224,236,244)","rgb(158,188,218)","rgb(136,86,167)"],4:["rgb(237,248,251)","rgb(179,205,227)","rgb(140,150,198)","rgb(136,65,157)"],5:["rgb(237,248,251)","rgb(179,205,227)","rgb(140,150,198)","rgb(136,86,167)","rgb(129,15,124)"],6:["rgb(237,248,251)","rgb(191,211,230)","rgb(158,188,218)","rgb(140,150,198)","rgb(136,86,167)","rgb(129,15,124)"],7:["rgb(237,248,251)","rgb(191,211,230)","rgb(158,188,218)","rgb(140,150,198)","rgb(140,107,177)","rgb(136,65,157)","rgb(110,1,107)"],8:["rgb(247,252,253)","rgb(224,236,244)","rgb(191,211,230)","rgb(158,188,218)","rgb(140,150,198)","rgb(140,107,177)","rgb(136,65,157)","rgb(110,1,107)"],9:["rgb(247,252,253)","rgb(224,236,244)","rgb(191,211,230)","rgb(158,188,218)","rgb(140,150,198)","rgb(140,107,177)","rgb(136,65,157)","rgb(129,15,124)","rgb(77,0,75)"]},
|
13
|
+
RdPu:{3:["rgb(253,224,221)","rgb(250,159,181)","rgb(197,27,138)"],4:["rgb(254,235,226)","rgb(251,180,185)","rgb(247,104,161)","rgb(174,1,126)"],5:["rgb(254,235,226)","rgb(251,180,185)","rgb(247,104,161)","rgb(197,27,138)","rgb(122,1,119)"],6:["rgb(254,235,226)","rgb(252,197,192)","rgb(250,159,181)","rgb(247,104,161)","rgb(197,27,138)","rgb(122,1,119)"],7:["rgb(254,235,226)","rgb(252,197,192)","rgb(250,159,181)","rgb(247,104,161)","rgb(221,52,151)","rgb(174,1,126)","rgb(122,1,119)"],8:["rgb(255,247,243)","rgb(253,224,221)","rgb(252,197,192)","rgb(250,159,181)","rgb(247,104,161)","rgb(221,52,151)","rgb(174,1,126)","rgb(122,1,119)"],9:["rgb(255,247,243)","rgb(253,224,221)","rgb(252,197,192)","rgb(250,159,181)","rgb(247,104,161)","rgb(221,52,151)","rgb(174,1,126)","rgb(122,1,119)","rgb(73,0,106)"]},
|
14
|
+
PuRd:{3:["rgb(231,225,239)","rgb(201,148,199)","rgb(221,28,119)"],4:["rgb(241,238,246)","rgb(215,181,216)","rgb(223,101,176)","rgb(206,18,86)"],5:["rgb(241,238,246)","rgb(215,181,216)","rgb(223,101,176)","rgb(221,28,119)","rgb(152,0,67)"],6:["rgb(241,238,246)","rgb(212,185,218)","rgb(201,148,199)","rgb(223,101,176)","rgb(221,28,119)","rgb(152,0,67)"],7:["rgb(241,238,246)","rgb(212,185,218)","rgb(201,148,199)","rgb(223,101,176)","rgb(231,41,138)","rgb(206,18,86)","rgb(145,0,63)"],8:["rgb(247,244,249)","rgb(231,225,239)","rgb(212,185,218)","rgb(201,148,199)","rgb(223,101,176)","rgb(231,41,138)","rgb(206,18,86)","rgb(145,0,63)"],9:["rgb(247,244,249)","rgb(231,225,239)","rgb(212,185,218)","rgb(201,148,199)","rgb(223,101,176)","rgb(231,41,138)","rgb(206,18,86)","rgb(152,0,67)","rgb(103,0,31)"]},
|
15
|
+
OrRd:{3:["rgb(254,232,200)","rgb(253,187,132)","rgb(227,74,51)"],4:["rgb(254,240,217)","rgb(253,204,138)","rgb(252,141,89)","rgb(215,48,31)"],5:["rgb(254,240,217)","rgb(253,204,138)","rgb(252,141,89)","rgb(227,74,51)","rgb(179,0,0)"],6:["rgb(254,240,217)","rgb(253,212,158)","rgb(253,187,132)","rgb(252,141,89)","rgb(227,74,51)","rgb(179,0,0)"],7:["rgb(254,240,217)","rgb(253,212,158)","rgb(253,187,132)","rgb(252,141,89)","rgb(239,101,72)","rgb(215,48,31)","rgb(153,0,0)"],8:["rgb(255,247,236)","rgb(254,232,200)","rgb(253,212,158)","rgb(253,187,132)","rgb(252,141,89)","rgb(239,101,72)","rgb(215,48,31)","rgb(153,0,0)"],9:["rgb(255,247,236)","rgb(254,232,200)","rgb(253,212,158)","rgb(253,187,132)","rgb(252,141,89)","rgb(239,101,72)","rgb(215,48,31)","rgb(179,0,0)","rgb(127,0,0)"]},
|
16
|
+
YlOrRd:{3:["rgb(255,237,160)","rgb(254,178,76)","rgb(240,59,32)"],4:["rgb(255,255,178)","rgb(254,204,92)","rgb(253,141,60)","rgb(227,26,28)"],5:["rgb(255,255,178)","rgb(254,204,92)","rgb(253,141,60)","rgb(240,59,32)","rgb(189,0,38)"],6:["rgb(255,255,178)","rgb(254,217,118)","rgb(254,178,76)","rgb(253,141,60)","rgb(240,59,32)","rgb(189,0,38)"],7:["rgb(255,255,178)","rgb(254,217,118)","rgb(254,178,76)","rgb(253,141,60)","rgb(252,78,42)","rgb(227,26,28)","rgb(177,0,38)"],8:["rgb(255,255,204)","rgb(255,237,160)","rgb(254,217,118)","rgb(254,178,76)","rgb(253,141,60)","rgb(252,78,42)","rgb(227,26,28)","rgb(177,0,38)"],9:["rgb(255,255,204)","rgb(255,237,160)","rgb(254,217,118)","rgb(254,178,76)","rgb(253,141,60)","rgb(252,78,42)","rgb(227,26,28)","rgb(189,0,38)","rgb(128,0,38)"]},
|
17
|
+
YlOrBr:{3:["rgb(255,247,188)","rgb(254,196,79)","rgb(217,95,14)"],4:["rgb(255,255,212)","rgb(254,217,142)","rgb(254,153,41)","rgb(204,76,2)"],5:["rgb(255,255,212)","rgb(254,217,142)","rgb(254,153,41)","rgb(217,95,14)","rgb(153,52,4)"],6:["rgb(255,255,212)","rgb(254,227,145)","rgb(254,196,79)","rgb(254,153,41)","rgb(217,95,14)","rgb(153,52,4)"],7:["rgb(255,255,212)","rgb(254,227,145)","rgb(254,196,79)","rgb(254,153,41)","rgb(236,112,20)","rgb(204,76,2)","rgb(140,45,4)"],8:["rgb(255,255,229)","rgb(255,247,188)","rgb(254,227,145)","rgb(254,196,79)","rgb(254,153,41)","rgb(236,112,20)","rgb(204,76,2)","rgb(140,45,4)"],9:["rgb(255,255,229)","rgb(255,247,188)","rgb(254,227,145)","rgb(254,196,79)","rgb(254,153,41)","rgb(236,112,20)","rgb(204,76,2)","rgb(153,52,4)","rgb(102,37,6)"]},
|
18
|
+
Purples:{3:["rgb(239,237,245)","rgb(188,189,220)","rgb(117,107,177)"],4:["rgb(242,240,247)","rgb(203,201,226)","rgb(158,154,200)","rgb(106,81,163)"],5:["rgb(242,240,247)","rgb(203,201,226)","rgb(158,154,200)","rgb(117,107,177)","rgb(84,39,143)"],6:["rgb(242,240,247)","rgb(218,218,235)","rgb(188,189,220)","rgb(158,154,200)","rgb(117,107,177)","rgb(84,39,143)"],7:["rgb(242,240,247)","rgb(218,218,235)","rgb(188,189,220)","rgb(158,154,200)","rgb(128,125,186)","rgb(106,81,163)","rgb(74,20,134)"],8:["rgb(252,251,253)","rgb(239,237,245)","rgb(218,218,235)","rgb(188,189,220)","rgb(158,154,200)","rgb(128,125,186)","rgb(106,81,163)","rgb(74,20,134)"],9:["rgb(252,251,253)","rgb(239,237,245)","rgb(218,218,235)","rgb(188,189,220)","rgb(158,154,200)","rgb(128,125,186)","rgb(106,81,163)","rgb(84,39,143)","rgb(63,0,125)"]},
|
19
|
+
Blues:{3:["rgb(222,235,247)","rgb(158,202,225)","rgb(49,130,189)"],4:["rgb(239,243,255)","rgb(189,215,231)","rgb(107,174,214)","rgb(33,113,181)"],5:["rgb(239,243,255)","rgb(189,215,231)","rgb(107,174,214)","rgb(49,130,189)","rgb(8,81,156)"],6:["rgb(239,243,255)","rgb(198,219,239)","rgb(158,202,225)","rgb(107,174,214)","rgb(49,130,189)","rgb(8,81,156)"],7:["rgb(239,243,255)","rgb(198,219,239)","rgb(158,202,225)","rgb(107,174,214)","rgb(66,146,198)","rgb(33,113,181)","rgb(8,69,148)"],8:["rgb(247,251,255)","rgb(222,235,247)","rgb(198,219,239)","rgb(158,202,225)","rgb(107,174,214)","rgb(66,146,198)","rgb(33,113,181)","rgb(8,69,148)"],9:["rgb(247,251,255)","rgb(222,235,247)","rgb(198,219,239)","rgb(158,202,225)","rgb(107,174,214)","rgb(66,146,198)","rgb(33,113,181)","rgb(8,81,156)","rgb(8,48,107)"]},
|
20
|
+
Greens:{3:["rgb(229,245,224)","rgb(161,217,155)","rgb(49,163,84)"],4:["rgb(237,248,233)","rgb(186,228,179)","rgb(116,196,118)","rgb(35,139,69)"],5:["rgb(237,248,233)","rgb(186,228,179)","rgb(116,196,118)","rgb(49,163,84)","rgb(0,109,44)"],6:["rgb(237,248,233)","rgb(199,233,192)","rgb(161,217,155)","rgb(116,196,118)","rgb(49,163,84)","rgb(0,109,44)"],7:["rgb(237,248,233)","rgb(199,233,192)","rgb(161,217,155)","rgb(116,196,118)","rgb(65,171,93)","rgb(35,139,69)","rgb(0,90,50)"],8:["rgb(247,252,245)","rgb(229,245,224)","rgb(199,233,192)","rgb(161,217,155)","rgb(116,196,118)","rgb(65,171,93)","rgb(35,139,69)","rgb(0,90,50)"],9:["rgb(247,252,245)","rgb(229,245,224)","rgb(199,233,192)","rgb(161,217,155)","rgb(116,196,118)","rgb(65,171,93)","rgb(35,139,69)","rgb(0,109,44)","rgb(0,68,27)"]},
|
21
|
+
Oranges:{3:["rgb(254,230,206)","rgb(253,174,107)","rgb(230,85,13)"],4:["rgb(254,237,222)","rgb(253,190,133)","rgb(253,141,60)","rgb(217,71,1)"],5:["rgb(254,237,222)","rgb(253,190,133)","rgb(253,141,60)","rgb(230,85,13)","rgb(166,54,3)"],6:["rgb(254,237,222)","rgb(253,208,162)","rgb(253,174,107)","rgb(253,141,60)","rgb(230,85,13)","rgb(166,54,3)"],7:["rgb(254,237,222)","rgb(253,208,162)","rgb(253,174,107)","rgb(253,141,60)","rgb(241,105,19)","rgb(217,72,1)","rgb(140,45,4)"],8:["rgb(255,245,235)","rgb(254,230,206)","rgb(253,208,162)","rgb(253,174,107)","rgb(253,141,60)","rgb(241,105,19)","rgb(217,72,1)","rgb(140,45,4)"],9:["rgb(255,245,235)","rgb(254,230,206)","rgb(253,208,162)","rgb(253,174,107)","rgb(253,141,60)","rgb(241,105,19)","rgb(217,72,1)","rgb(166,54,3)","rgb(127,39,4)"]},
|
22
|
+
Reds:{3:["rgb(254,224,210)","rgb(252,146,114)","rgb(222,45,38)"],4:["rgb(254,229,217)","rgb(252,174,145)","rgb(251,106,74)","rgb(203,24,29)"],5:["rgb(254,229,217)","rgb(252,174,145)","rgb(251,106,74)","rgb(222,45,38)","rgb(165,15,21)"],6:["rgb(254,229,217)","rgb(252,187,161)","rgb(252,146,114)","rgb(251,106,74)","rgb(222,45,38)","rgb(165,15,21)"],7:["rgb(254,229,217)","rgb(252,187,161)","rgb(252,146,114)","rgb(251,106,74)","rgb(239,59,44)","rgb(203,24,29)","rgb(153,0,13)"],8:["rgb(255,245,240)","rgb(254,224,210)","rgb(252,187,161)","rgb(252,146,114)","rgb(251,106,74)","rgb(239,59,44)","rgb(203,24,29)","rgb(153,0,13)"],9:["rgb(255,245,240)","rgb(254,224,210)","rgb(252,187,161)","rgb(252,146,114)","rgb(251,106,74)","rgb(239,59,44)","rgb(203,24,29)","rgb(165,15,21)","rgb(103,0,13)"]},
|
23
|
+
Greys:{3:["rgb(240,240,240)","rgb(189,189,189)","rgb(99,99,99)"],4:["rgb(247,247,247)","rgb(204,204,204)","rgb(150,150,150)","rgb(82,82,82)"],5:["rgb(247,247,247)","rgb(204,204,204)","rgb(150,150,150)","rgb(99,99,99)","rgb(37,37,37)"],6:["rgb(247,247,247)","rgb(217,217,217)","rgb(189,189,189)","rgb(150,150,150)","rgb(99,99,99)","rgb(37,37,37)"],7:["rgb(247,247,247)","rgb(217,217,217)","rgb(189,189,189)","rgb(150,150,150)","rgb(115,115,115)","rgb(82,82,82)","rgb(37,37,37)"],8:["rgb(255,255,255)","rgb(240,240,240)","rgb(217,217,217)","rgb(189,189,189)","rgb(150,150,150)","rgb(115,115,115)","rgb(82,82,82)","rgb(37,37,37)"],9:["rgb(255,255,255)","rgb(240,240,240)","rgb(217,217,217)","rgb(189,189,189)","rgb(150,150,150)","rgb(115,115,115)","rgb(82,82,82)","rgb(37,37,37)","rgb(0,0,0)"]},
|
24
|
+
PuOr:{3:["rgb(241,163,64)","rgb(247,247,247)","rgb(153,142,195)"],4:["rgb(230,97,1)","rgb(253,184,99)","rgb(178,171,210)","rgb(94,60,153)"],5:["rgb(230,97,1)","rgb(253,184,99)","rgb(247,247,247)","rgb(178,171,210)","rgb(94,60,153)"],6:["rgb(179,88,6)","rgb(241,163,64)","rgb(254,224,182)","rgb(216,218,235)","rgb(153,142,195)","rgb(84,39,136)"],7:["rgb(179,88,6)","rgb(241,163,64)","rgb(254,224,182)","rgb(247,247,247)","rgb(216,218,235)","rgb(153,142,195)","rgb(84,39,136)"],8:["rgb(179,88,6)","rgb(224,130,20)","rgb(253,184,99)","rgb(254,224,182)","rgb(216,218,235)","rgb(178,171,210)","rgb(128,115,172)","rgb(84,39,136)"],9:["rgb(179,88,6)","rgb(224,130,20)","rgb(253,184,99)","rgb(254,224,182)","rgb(247,247,247)","rgb(216,218,235)","rgb(178,171,210)","rgb(128,115,172)","rgb(84,39,136)"],10:["rgb(127,59,8)","rgb(179,88,6)","rgb(224,130,20)","rgb(253,184,99)","rgb(254,224,182)","rgb(216,218,235)","rgb(178,171,210)","rgb(128,115,172)","rgb(84,39,136)","rgb(45,0,75)"],11:["rgb(127,59,8)","rgb(179,88,6)","rgb(224,130,20)","rgb(253,184,99)","rgb(254,224,182)","rgb(247,247,247)","rgb(216,218,235)","rgb(178,171,210)","rgb(128,115,172)","rgb(84,39,136)","rgb(45,0,75)"]},
|
25
|
+
BrBG:{3:["rgb(216,179,101)","rgb(245,245,245)","rgb(90,180,172)"],4:["rgb(166,97,26)","rgb(223,194,125)","rgb(128,205,193)","rgb(1,133,113)"],5:["rgb(166,97,26)","rgb(223,194,125)","rgb(245,245,245)","rgb(128,205,193)","rgb(1,133,113)"],6:["rgb(140,81,10)","rgb(216,179,101)","rgb(246,232,195)","rgb(199,234,229)","rgb(90,180,172)","rgb(1,102,94)"],7:["rgb(140,81,10)","rgb(216,179,101)","rgb(246,232,195)","rgb(245,245,245)","rgb(199,234,229)","rgb(90,180,172)","rgb(1,102,94)"],8:["rgb(140,81,10)","rgb(191,129,45)","rgb(223,194,125)","rgb(246,232,195)","rgb(199,234,229)","rgb(128,205,193)","rgb(53,151,143)","rgb(1,102,94)"],9:["rgb(140,81,10)","rgb(191,129,45)","rgb(223,194,125)","rgb(246,232,195)","rgb(245,245,245)","rgb(199,234,229)","rgb(128,205,193)","rgb(53,151,143)","rgb(1,102,94)"],10:["rgb(84,48,5)","rgb(140,81,10)","rgb(191,129,45)","rgb(223,194,125)","rgb(246,232,195)","rgb(199,234,229)","rgb(128,205,193)","rgb(53,151,143)","rgb(1,102,94)","rgb(0,60,48)"],11:["rgb(84,48,5)","rgb(140,81,10)","rgb(191,129,45)","rgb(223,194,125)","rgb(246,232,195)","rgb(245,245,245)","rgb(199,234,229)","rgb(128,205,193)","rgb(53,151,143)","rgb(1,102,94)","rgb(0,60,48)"]},
|
26
|
+
PRGn:{3:["rgb(175,141,195)","rgb(247,247,247)","rgb(127,191,123)"],4:["rgb(123,50,148)","rgb(194,165,207)","rgb(166,219,160)","rgb(0,136,55)"],5:["rgb(123,50,148)","rgb(194,165,207)","rgb(247,247,247)","rgb(166,219,160)","rgb(0,136,55)"],6:["rgb(118,42,131)","rgb(175,141,195)","rgb(231,212,232)","rgb(217,240,211)","rgb(127,191,123)","rgb(27,120,55)"],7:["rgb(118,42,131)","rgb(175,141,195)","rgb(231,212,232)","rgb(247,247,247)","rgb(217,240,211)","rgb(127,191,123)","rgb(27,120,55)"],8:["rgb(118,42,131)","rgb(153,112,171)","rgb(194,165,207)","rgb(231,212,232)","rgb(217,240,211)","rgb(166,219,160)","rgb(90,174,97)","rgb(27,120,55)"],9:["rgb(118,42,131)","rgb(153,112,171)","rgb(194,165,207)","rgb(231,212,232)","rgb(247,247,247)","rgb(217,240,211)","rgb(166,219,160)","rgb(90,174,97)","rgb(27,120,55)"],10:["rgb(64,0,75)","rgb(118,42,131)","rgb(153,112,171)","rgb(194,165,207)","rgb(231,212,232)","rgb(217,240,211)","rgb(166,219,160)","rgb(90,174,97)","rgb(27,120,55)","rgb(0,68,27)"],11:["rgb(64,0,75)","rgb(118,42,131)","rgb(153,112,171)","rgb(194,165,207)","rgb(231,212,232)","rgb(247,247,247)","rgb(217,240,211)","rgb(166,219,160)","rgb(90,174,97)","rgb(27,120,55)","rgb(0,68,27)"]},
|
27
|
+
PiYG:{3:["rgb(233,163,201)","rgb(247,247,247)","rgb(161,215,106)"],4:["rgb(208,28,139)","rgb(241,182,218)","rgb(184,225,134)","rgb(77,172,38)"],5:["rgb(208,28,139)","rgb(241,182,218)","rgb(247,247,247)","rgb(184,225,134)","rgb(77,172,38)"],6:["rgb(197,27,125)","rgb(233,163,201)","rgb(253,224,239)","rgb(230,245,208)","rgb(161,215,106)","rgb(77,146,33)"],7:["rgb(197,27,125)","rgb(233,163,201)","rgb(253,224,239)","rgb(247,247,247)","rgb(230,245,208)","rgb(161,215,106)","rgb(77,146,33)"],8:["rgb(197,27,125)","rgb(222,119,174)","rgb(241,182,218)","rgb(253,224,239)","rgb(230,245,208)","rgb(184,225,134)","rgb(127,188,65)","rgb(77,146,33)"],9:["rgb(197,27,125)","rgb(222,119,174)","rgb(241,182,218)","rgb(253,224,239)","rgb(247,247,247)","rgb(230,245,208)","rgb(184,225,134)","rgb(127,188,65)","rgb(77,146,33)"],10:["rgb(142,1,82)","rgb(197,27,125)","rgb(222,119,174)","rgb(241,182,218)","rgb(253,224,239)","rgb(230,245,208)","rgb(184,225,134)","rgb(127,188,65)","rgb(77,146,33)","rgb(39,100,25)"],11:["rgb(142,1,82)","rgb(197,27,125)","rgb(222,119,174)","rgb(241,182,218)","rgb(253,224,239)","rgb(247,247,247)","rgb(230,245,208)","rgb(184,225,134)","rgb(127,188,65)","rgb(77,146,33)","rgb(39,100,25)"]},
|
28
|
+
RdBu:{3:["rgb(239,138,98)","rgb(247,247,247)","rgb(103,169,207)"],4:["rgb(202,0,32)","rgb(244,165,130)","rgb(146,197,222)","rgb(5,113,176)"],5:["rgb(202,0,32)","rgb(244,165,130)","rgb(247,247,247)","rgb(146,197,222)","rgb(5,113,176)"],6:["rgb(178,24,43)","rgb(239,138,98)","rgb(253,219,199)","rgb(209,229,240)","rgb(103,169,207)","rgb(33,102,172)"],7:["rgb(178,24,43)","rgb(239,138,98)","rgb(253,219,199)","rgb(247,247,247)","rgb(209,229,240)","rgb(103,169,207)","rgb(33,102,172)"],8:["rgb(178,24,43)","rgb(214,96,77)","rgb(244,165,130)","rgb(253,219,199)","rgb(209,229,240)","rgb(146,197,222)","rgb(67,147,195)","rgb(33,102,172)"],9:["rgb(178,24,43)","rgb(214,96,77)","rgb(244,165,130)","rgb(253,219,199)","rgb(247,247,247)","rgb(209,229,240)","rgb(146,197,222)","rgb(67,147,195)","rgb(33,102,172)"],10:["rgb(103,0,31)","rgb(178,24,43)","rgb(214,96,77)","rgb(244,165,130)","rgb(253,219,199)","rgb(209,229,240)","rgb(146,197,222)","rgb(67,147,195)","rgb(33,102,172)","rgb(5,48,97)"],11:["rgb(103,0,31)","rgb(178,24,43)","rgb(214,96,77)","rgb(244,165,130)","rgb(253,219,199)","rgb(247,247,247)","rgb(209,229,240)","rgb(146,197,222)","rgb(67,147,195)","rgb(33,102,172)","rgb(5,48,97)"]},
|
29
|
+
RdGy:{3:["rgb(239,138,98)","rgb(255,255,255)","rgb(153,153,153)"],4:["rgb(202,0,32)","rgb(244,165,130)","rgb(186,186,186)","rgb(64,64,64)"],5:["rgb(202,0,32)","rgb(244,165,130)","rgb(255,255,255)","rgb(186,186,186)","rgb(64,64,64)"],6:["rgb(178,24,43)","rgb(239,138,98)","rgb(253,219,199)","rgb(224,224,224)","rgb(153,153,153)","rgb(77,77,77)"],7:["rgb(178,24,43)","rgb(239,138,98)","rgb(253,219,199)","rgb(255,255,255)","rgb(224,224,224)","rgb(153,153,153)","rgb(77,77,77)"],8:["rgb(178,24,43)","rgb(214,96,77)","rgb(244,165,130)","rgb(253,219,199)","rgb(224,224,224)","rgb(186,186,186)","rgb(135,135,135)","rgb(77,77,77)"],9:["rgb(178,24,43)","rgb(214,96,77)","rgb(244,165,130)","rgb(253,219,199)","rgb(255,255,255)","rgb(224,224,224)","rgb(186,186,186)","rgb(135,135,135)","rgb(77,77,77)"],10:["rgb(103,0,31)","rgb(178,24,43)","rgb(214,96,77)","rgb(244,165,130)","rgb(253,219,199)","rgb(224,224,224)","rgb(186,186,186)","rgb(135,135,135)","rgb(77,77,77)","rgb(26,26,26)"],11:["rgb(103,0,31)","rgb(178,24,43)","rgb(214,96,77)","rgb(244,165,130)","rgb(253,219,199)","rgb(255,255,255)","rgb(224,224,224)","rgb(186,186,186)","rgb(135,135,135)","rgb(77,77,77)","rgb(26,26,26)"]},
|
30
|
+
RdYlBu:{3:["rgb(252,141,89)","rgb(255,255,191)","rgb(145,191,219)"],4:["rgb(215,25,28)","rgb(253,174,97)","rgb(171,217,233)","rgb(44,123,182)"],5:["rgb(215,25,28)","rgb(253,174,97)","rgb(255,255,191)","rgb(171,217,233)","rgb(44,123,182)"],6:["rgb(215,48,39)","rgb(252,141,89)","rgb(254,224,144)","rgb(224,243,248)","rgb(145,191,219)","rgb(69,117,180)"],7:["rgb(215,48,39)","rgb(252,141,89)","rgb(254,224,144)","rgb(255,255,191)","rgb(224,243,248)","rgb(145,191,219)","rgb(69,117,180)"],8:["rgb(215,48,39)","rgb(244,109,67)","rgb(253,174,97)","rgb(254,224,144)","rgb(224,243,248)","rgb(171,217,233)","rgb(116,173,209)","rgb(69,117,180)"],9:["rgb(215,48,39)","rgb(244,109,67)","rgb(253,174,97)","rgb(254,224,144)","rgb(255,255,191)","rgb(224,243,248)","rgb(171,217,233)","rgb(116,173,209)","rgb(69,117,180)"],10:["rgb(165,0,38)","rgb(215,48,39)","rgb(244,109,67)","rgb(253,174,97)","rgb(254,224,144)","rgb(224,243,248)","rgb(171,217,233)","rgb(116,173,209)","rgb(69,117,180)","rgb(49,54,149)"],11:["rgb(165,0,38)","rgb(215,48,39)","rgb(244,109,67)","rgb(253,174,97)","rgb(254,224,144)","rgb(255,255,191)","rgb(224,243,248)","rgb(171,217,233)","rgb(116,173,209)","rgb(69,117,180)","rgb(49,54,149)"]},
|
31
|
+
Spectral:{3:["rgb(252,141,89)","rgb(255,255,191)","rgb(153,213,148)"],4:["rgb(215,25,28)","rgb(253,174,97)","rgb(171,221,164)","rgb(43,131,186)"],5:["rgb(215,25,28)","rgb(253,174,97)","rgb(255,255,191)","rgb(171,221,164)","rgb(43,131,186)"],6:["rgb(213,62,79)","rgb(252,141,89)","rgb(254,224,139)","rgb(230,245,152)","rgb(153,213,148)","rgb(50,136,189)"],7:["rgb(213,62,79)","rgb(252,141,89)","rgb(254,224,139)","rgb(255,255,191)","rgb(230,245,152)","rgb(153,213,148)","rgb(50,136,189)"],8:["rgb(213,62,79)","rgb(244,109,67)","rgb(253,174,97)","rgb(254,224,139)","rgb(230,245,152)","rgb(171,221,164)","rgb(102,194,165)","rgb(50,136,189)"],9:["rgb(213,62,79)","rgb(244,109,67)","rgb(253,174,97)","rgb(254,224,139)","rgb(255,255,191)","rgb(230,245,152)","rgb(171,221,164)","rgb(102,194,165)","rgb(50,136,189)"],10:["rgb(158,1,66)","rgb(213,62,79)","rgb(244,109,67)","rgb(253,174,97)","rgb(254,224,139)","rgb(230,245,152)","rgb(171,221,164)","rgb(102,194,165)","rgb(50,136,189)","rgb(94,79,162)"],11:["rgb(158,1,66)","rgb(213,62,79)","rgb(244,109,67)","rgb(253,174,97)","rgb(254,224,139)","rgb(255,255,191)","rgb(230,245,152)","rgb(171,221,164)","rgb(102,194,165)","rgb(50,136,189)","rgb(94,79,162)"]},
|
32
|
+
RdYlGn:{3:["rgb(252,141,89)","rgb(255,255,191)","rgb(145,207,96)"],4:["rgb(215,25,28)","rgb(253,174,97)","rgb(166,217,106)","rgb(26,150,65)"],5:["rgb(215,25,28)","rgb(253,174,97)","rgb(255,255,191)","rgb(166,217,106)","rgb(26,150,65)"],6:["rgb(215,48,39)","rgb(252,141,89)","rgb(254,224,139)","rgb(217,239,139)","rgb(145,207,96)","rgb(26,152,80)"],7:["rgb(215,48,39)","rgb(252,141,89)","rgb(254,224,139)","rgb(255,255,191)","rgb(217,239,139)","rgb(145,207,96)","rgb(26,152,80)"],8:["rgb(215,48,39)","rgb(244,109,67)","rgb(253,174,97)","rgb(254,224,139)","rgb(217,239,139)","rgb(166,217,106)","rgb(102,189,99)","rgb(26,152,80)"],9:["rgb(215,48,39)","rgb(244,109,67)","rgb(253,174,97)","rgb(254,224,139)","rgb(255,255,191)","rgb(217,239,139)","rgb(166,217,106)","rgb(102,189,99)","rgb(26,152,80)"],10:["rgb(165,0,38)","rgb(215,48,39)","rgb(244,109,67)","rgb(253,174,97)","rgb(254,224,139)","rgb(217,239,139)","rgb(166,217,106)","rgb(102,189,99)","rgb(26,152,80)","rgb(0,104,55)"],11:["rgb(165,0,38)","rgb(215,48,39)","rgb(244,109,67)","rgb(253,174,97)","rgb(254,224,139)","rgb(255,255,191)","rgb(217,239,139)","rgb(166,217,106)","rgb(102,189,99)","rgb(26,152,80)","rgb(0,104,55)"]}};
|
@@ -0,0 +1,225 @@
|
|
1
|
+
(function(){science = {version: "1.7.0"}; // semver
|
2
|
+
science.ascending = function(a, b) {
|
3
|
+
return a - b;
|
4
|
+
};
|
5
|
+
// Euler's constant.
|
6
|
+
science.EULER = .5772156649015329;
|
7
|
+
// Compute exp(x) - 1 accurately for small x.
|
8
|
+
science.expm1 = function(x) {
|
9
|
+
return (x < 1e-5 && x > -1e-5) ? x + .5 * x * x : Math.exp(x) - 1;
|
10
|
+
};
|
11
|
+
science.functor = function(v) {
|
12
|
+
return typeof v === "function" ? v : function() { return v; };
|
13
|
+
};
|
14
|
+
// Based on:
|
15
|
+
// http://www.johndcook.com/blog/2010/06/02/whats-so-hard-about-finding-a-hypotenuse/
|
16
|
+
science.hypot = function(x, y) {
|
17
|
+
x = Math.abs(x);
|
18
|
+
y = Math.abs(y);
|
19
|
+
var max,
|
20
|
+
min;
|
21
|
+
if (x > y) { max = x; min = y; }
|
22
|
+
else { max = y; min = x; }
|
23
|
+
var r = min / max;
|
24
|
+
return max * Math.sqrt(1 + r * r);
|
25
|
+
};
|
26
|
+
science.quadratic = function() {
|
27
|
+
var complex = false;
|
28
|
+
|
29
|
+
function quadratic(a, b, c) {
|
30
|
+
var d = b * b - 4 * a * c;
|
31
|
+
if (d > 0) {
|
32
|
+
d = Math.sqrt(d) / (2 * a);
|
33
|
+
return complex
|
34
|
+
? [{r: -b - d, i: 0}, {r: -b + d, i: 0}]
|
35
|
+
: [-b - d, -b + d];
|
36
|
+
} else if (d === 0) {
|
37
|
+
d = -b / (2 * a);
|
38
|
+
return complex ? [{r: d, i: 0}] : [d];
|
39
|
+
} else {
|
40
|
+
if (complex) {
|
41
|
+
d = Math.sqrt(-d) / (2 * a);
|
42
|
+
return [
|
43
|
+
{r: -b, i: -d},
|
44
|
+
{r: -b, i: d}
|
45
|
+
];
|
46
|
+
}
|
47
|
+
return [];
|
48
|
+
}
|
49
|
+
}
|
50
|
+
|
51
|
+
quadratic.complex = function(x) {
|
52
|
+
if (!arguments.length) return complex;
|
53
|
+
complex = x;
|
54
|
+
return quadratic;
|
55
|
+
};
|
56
|
+
|
57
|
+
return quadratic;
|
58
|
+
};
|
59
|
+
// Constructs a multi-dimensional array filled with zeroes.
|
60
|
+
science.zeroes = function(n) {
|
61
|
+
var i = -1,
|
62
|
+
a = [];
|
63
|
+
if (arguments.length === 1)
|
64
|
+
while (++i < n)
|
65
|
+
a[i] = 0;
|
66
|
+
else
|
67
|
+
while (++i < n)
|
68
|
+
a[i] = science.zeroes.apply(
|
69
|
+
this, Array.prototype.slice.call(arguments, 1));
|
70
|
+
return a;
|
71
|
+
};
|
72
|
+
science.vector = {};
|
73
|
+
science.vector.cross = function(a, b) {
|
74
|
+
// TODO how to handle non-3D vectors?
|
75
|
+
// TODO handle 7D vectors?
|
76
|
+
return [
|
77
|
+
a[1] * b[2] - a[2] * b[1],
|
78
|
+
a[2] * b[0] - a[0] * b[2],
|
79
|
+
a[0] * b[1] - a[1] * b[0]
|
80
|
+
];
|
81
|
+
};
|
82
|
+
science.vector.dot = function(a, b) {
|
83
|
+
var s = 0,
|
84
|
+
i = -1,
|
85
|
+
n = Math.min(a.length, b.length);
|
86
|
+
while (++i < n) s += a[i] * b[i];
|
87
|
+
return s;
|
88
|
+
};
|
89
|
+
science.vector.length = function(p) {
|
90
|
+
return Math.sqrt(science.vector.dot(p, p));
|
91
|
+
};
|
92
|
+
science.vector.normalize = function(p) {
|
93
|
+
var length = science.vector.length(p);
|
94
|
+
return p.map(function(d) { return d / length; });
|
95
|
+
};
|
96
|
+
// 4x4 matrix determinant.
|
97
|
+
science.vector.determinant = function(matrix) {
|
98
|
+
var m = matrix[0].concat(matrix[1]).concat(matrix[2]).concat(matrix[3]);
|
99
|
+
return (
|
100
|
+
m[12] * m[9] * m[6] * m[3] - m[8] * m[13] * m[6] * m[3] -
|
101
|
+
m[12] * m[5] * m[10] * m[3] + m[4] * m[13] * m[10] * m[3] +
|
102
|
+
m[8] * m[5] * m[14] * m[3] - m[4] * m[9] * m[14] * m[3] -
|
103
|
+
m[12] * m[9] * m[2] * m[7] + m[8] * m[13] * m[2] * m[7] +
|
104
|
+
m[12] * m[1] * m[10] * m[7] - m[0] * m[13] * m[10] * m[7] -
|
105
|
+
m[8] * m[1] * m[14] * m[7] + m[0] * m[9] * m[14] * m[7] +
|
106
|
+
m[12] * m[5] * m[2] * m[11] - m[4] * m[13] * m[2] * m[11] -
|
107
|
+
m[12] * m[1] * m[6] * m[11] + m[0] * m[13] * m[6] * m[11] +
|
108
|
+
m[4] * m[1] * m[14] * m[11] - m[0] * m[5] * m[14] * m[11] -
|
109
|
+
m[8] * m[5] * m[2] * m[15] + m[4] * m[9] * m[2] * m[15] +
|
110
|
+
m[8] * m[1] * m[6] * m[15] - m[0] * m[9] * m[6] * m[15] -
|
111
|
+
m[4] * m[1] * m[10] * m[15] + m[0] * m[5] * m[10] * m[15]);
|
112
|
+
};
|
113
|
+
// Performs in-place Gauss-Jordan elimination.
|
114
|
+
//
|
115
|
+
// Based on Jarno Elonen's Python version (public domain):
|
116
|
+
// http://elonen.iki.fi/code/misc-notes/python-gaussj/index.html
|
117
|
+
science.vector.gaussjordan = function(m, eps) {
|
118
|
+
if (!eps) eps = 1e-10;
|
119
|
+
|
120
|
+
var h = m.length,
|
121
|
+
w = m[0].length,
|
122
|
+
y = -1,
|
123
|
+
y2,
|
124
|
+
x;
|
125
|
+
|
126
|
+
while (++y < h) {
|
127
|
+
var maxrow = y;
|
128
|
+
|
129
|
+
// Find max pivot.
|
130
|
+
y2 = y; while (++y2 < h) {
|
131
|
+
if (Math.abs(m[y2][y]) > Math.abs(m[maxrow][y]))
|
132
|
+
maxrow = y2;
|
133
|
+
}
|
134
|
+
|
135
|
+
// Swap.
|
136
|
+
var tmp = m[y];
|
137
|
+
m[y] = m[maxrow];
|
138
|
+
m[maxrow] = tmp;
|
139
|
+
|
140
|
+
// Singular?
|
141
|
+
if (Math.abs(m[y][y]) <= eps) return false;
|
142
|
+
|
143
|
+
// Eliminate column y.
|
144
|
+
y2 = y; while (++y2 < h) {
|
145
|
+
var c = m[y2][y] / m[y][y];
|
146
|
+
x = y - 1; while (++x < w) {
|
147
|
+
m[y2][x] -= m[y][x] * c;
|
148
|
+
}
|
149
|
+
}
|
150
|
+
}
|
151
|
+
|
152
|
+
// Backsubstitute.
|
153
|
+
y = h; while (--y >= 0) {
|
154
|
+
var c = m[y][y];
|
155
|
+
y2 = -1; while (++y2 < y) {
|
156
|
+
x = w; while (--x >= y) {
|
157
|
+
m[y2][x] -= m[y][x] * m[y2][y] / c;
|
158
|
+
}
|
159
|
+
}
|
160
|
+
m[y][y] /= c;
|
161
|
+
// Normalize row y.
|
162
|
+
x = h - 1; while (++x < w) {
|
163
|
+
m[y][x] /= c;
|
164
|
+
}
|
165
|
+
}
|
166
|
+
return true;
|
167
|
+
};
|
168
|
+
// Find matrix inverse using Gauss-Jordan.
|
169
|
+
science.vector.inverse = function(m) {
|
170
|
+
var n = m.length
|
171
|
+
i = -1;
|
172
|
+
|
173
|
+
// Check if the matrix is square.
|
174
|
+
if (n !== m[0].length) return;
|
175
|
+
|
176
|
+
// Augment with identity matrix I to get AI.
|
177
|
+
m = m.map(function(row, i) {
|
178
|
+
var identity = new Array(n),
|
179
|
+
j = -1;
|
180
|
+
while (++j < n) identity[j] = i === j ? 1 : 0;
|
181
|
+
return row.concat(identity);
|
182
|
+
});
|
183
|
+
|
184
|
+
// Compute IA^-1.
|
185
|
+
science.vector.gaussjordan(m);
|
186
|
+
|
187
|
+
// Remove identity matrix I to get A^-1.
|
188
|
+
while (++i < n) {
|
189
|
+
m[i] = m[i].slice(n);
|
190
|
+
}
|
191
|
+
|
192
|
+
return m;
|
193
|
+
};
|
194
|
+
science.vector.multiply = function(a, b) {
|
195
|
+
var m = a.length,
|
196
|
+
n = b[0].length,
|
197
|
+
p = b.length,
|
198
|
+
i = -1,
|
199
|
+
j,
|
200
|
+
k;
|
201
|
+
if (p !== a[0].length) throw {"error": "columns(a) != rows(b); " + a[0].length + " != " + p};
|
202
|
+
var ab = new Array(m);
|
203
|
+
while (++i < m) {
|
204
|
+
ab[i] = new Array(n);
|
205
|
+
j = -1; while(++j < n) {
|
206
|
+
var s = 0;
|
207
|
+
k = -1; while (++k < p) s += a[i][k] * b[k][j];
|
208
|
+
ab[i][j] = s;
|
209
|
+
}
|
210
|
+
}
|
211
|
+
return ab;
|
212
|
+
};
|
213
|
+
science.vector.transpose = function(a) {
|
214
|
+
var m = a.length,
|
215
|
+
n = a[0].length,
|
216
|
+
i = -1,
|
217
|
+
j,
|
218
|
+
b = new Array(n);
|
219
|
+
while (++i < n) {
|
220
|
+
b[i] = new Array(m);
|
221
|
+
j = -1; while (++j < m) b[i][j] = a[j][i];
|
222
|
+
}
|
223
|
+
return b;
|
224
|
+
};
|
225
|
+
})()
|
@@ -0,0 +1,27 @@
|
|
1
|
+
(function(){science.lin = {};
|
2
|
+
/**
|
3
|
+
* Solves tridiagonal systems of linear equations.
|
4
|
+
*
|
5
|
+
* Source: http://en.wikipedia.org/wiki/Tridiagonal_matrix_algorithm
|
6
|
+
*
|
7
|
+
* @param {number[]} a
|
8
|
+
* @param {number[]} b
|
9
|
+
* @param {number[]} c
|
10
|
+
* @param {number[]} d
|
11
|
+
* @param {number[]} x
|
12
|
+
* @param {number} n
|
13
|
+
*/
|
14
|
+
science.lin.tridag = function(a, b, c, d, x, n) {
|
15
|
+
var i,
|
16
|
+
m;
|
17
|
+
for (i = 1; i < n; i++) {
|
18
|
+
m = a[i] / b[i - 1];
|
19
|
+
b[i] -= m * c[i - 1];
|
20
|
+
d[i] -= m * d[i - 1];
|
21
|
+
}
|
22
|
+
x[n - 1] = d[n - 1] / b[n - 1];
|
23
|
+
for (i = n - 2; i >= 0; i--) {
|
24
|
+
x[i] = (d[i] - c[i] * x[i + 1]) / b[i];
|
25
|
+
}
|
26
|
+
};
|
27
|
+
})()
|
@@ -0,0 +1 @@
|
|
1
|
+
(function(){science.lin={},science.lin.tridag=function(a,b,c,d,e,f){var g,h;for(g=1;g<f;g++)h=a[g]/b[g-1],b[g]-=h*c[g-1],d[g]-=h*d[g-1];e[f-1]=d[f-1]/b[f-1];for(g=f-2;g>=0;g--)e[g]=(d[g]-c[g]*e[g+1])/b[g]}})()
|
@@ -0,0 +1 @@
|
|
1
|
+
(function(){science={version:"1.7.0"},science.ascending=function(a,b){return a-b},science.EULER=.5772156649015329,science.expm1=function(a){return a<1e-5&&a>-0.00001?a+.5*a*a:Math.exp(a)-1},science.functor=function(a){return typeof a=="function"?a:function(){return a}},science.hypot=function(a,b){a=Math.abs(a),b=Math.abs(b);var c,d;a>b?(c=a,d=b):(c=b,d=a);var e=d/c;return c*Math.sqrt(1+e*e)},science.quadratic=function(){function b(b,c,d){var e=c*c-4*b*d;if(e>0){e=Math.sqrt(e)/(2*b);return a?[{r:-c-e,i:0},{r:-c+e,i:0}]:[-c-e,-c+e]}if(e===0){e=-c/(2*b);return a?[{r:e,i:0}]:[e]}if(a){e=Math.sqrt(-e)/(2*b);return[{r:-c,i:-e},{r:-c,i:e}]}return[]}var a=!1;b.complex=function(c){if(!arguments.length)return a;a=c;return b};return b},science.zeroes=function(a){var b=-1,c=[];if(arguments.length===1)while(++b<a)c[b]=0;else while(++b<a)c[b]=science.zeroes.apply(this,Array.prototype.slice.call(arguments,1));return c},science.vector={},science.vector.cross=function(a,b){return[a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]]},science.vector.dot=function(a,b){var c=0,d=-1,e=Math.min(a.length,b.length);while(++d<e)c+=a[d]*b[d];return c},science.vector.length=function(a){return Math.sqrt(science.vector.dot(a,a))},science.vector.normalize=function(a){var b=science.vector.length(a);return a.map(function(a){return a/b})},science.vector.determinant=function(a){var b=a[0].concat(a[1]).concat(a[2]).concat(a[3]);return b[12]*b[9]*b[6]*b[3]-b[8]*b[13]*b[6]*b[3]-b[12]*b[5]*b[10]*b[3]+b[4]*b[13]*b[10]*b[3]+b[8]*b[5]*b[14]*b[3]-b[4]*b[9]*b[14]*b[3]-b[12]*b[9]*b[2]*b[7]+b[8]*b[13]*b[2]*b[7]+b[12]*b[1]*b[10]*b[7]-b[0]*b[13]*b[10]*b[7]-b[8]*b[1]*b[14]*b[7]+b[0]*b[9]*b[14]*b[7]+b[12]*b[5]*b[2]*b[11]-b[4]*b[13]*b[2]*b[11]-b[12]*b[1]*b[6]*b[11]+b[0]*b[13]*b[6]*b[11]+b[4]*b[1]*b[14]*b[11]-b[0]*b[5]*b[14]*b[11]-b[8]*b[5]*b[2]*b[15]+b[4]*b[9]*b[2]*b[15]+b[8]*b[1]*b[6]*b[15]-b[0]*b[9]*b[6]*b[15]-b[4]*b[1]*b[10]*b[15]+b[0]*b[5]*b[10]*b[15]},science.vector.gaussjordan=function(a,b){b||(b=1e-10);var c=a.length,d=a[0].length,e=-1,f,g;while(++e<c){var h=e;f=e;while(++f<c)Math.abs(a[f][e])>Math.abs(a[h][e])&&(h=f);var i=a[e];a[e]=a[h],a[h]=i;if(Math.abs(a[e][e])<=b)return!1;f=e;while(++f<c){var j=a[f][e]/a[e][e];g=e-1;while(++g<d)a[f][g]-=a[e][g]*j}}e=c;while(--e>=0){var j=a[e][e];f=-1;while(++f<e){g=d;while(--g>=e)a[f][g]-=a[e][g]*a[f][e]/j}a[e][e]/=j,g=c-1;while(++g<d)a[e][g]/=j}return!0},science.vector.inverse=function(a){var b=a.length;i=-1;if(b===a[0].length){a=a.map(function(a,c){var d=Array(b),e=-1;while(++e<b)d[e]=c===e?1:0;return a.concat(d)}),science.vector.gaussjordan(a);while(++i<b)a[i]=a[i].slice(b);return a}},science.vector.multiply=function(a,b){var c=a.length,d=b[0].length,e=b.length,f=-1,g,h;if(e!==a[0].length)throw{error:"columns(a) != rows(b); "+a[0].length+" != "+e};var i=Array(c);while(++f<c){i[f]=Array(d),g=-1;while(++g<d){var j=0;h=-1;while(++h<e)j+=a[f][h]*b[h][g];i[f][g]=j}}return i},science.vector.transpose=function(a){var b=a.length,c=a[0].length,d=-1,e,f=Array(c);while(++d<c){f[d]=Array(b),e=-1;while(++e<b)f[d][e]=a[e][d]}return f}})()
|
@@ -0,0 +1,720 @@
|
|
1
|
+
(function(){science.stats = {};
|
2
|
+
// Bandwidth selectors for Gaussian kernels.
|
3
|
+
// Based on R's implementations in `stats.bw`.
|
4
|
+
science.stats.bandwidth = {
|
5
|
+
|
6
|
+
// Silverman, B. W. (1986) Density Estimation. London: Chapman and Hall.
|
7
|
+
nrd0: function(x) {
|
8
|
+
var hi = Math.sqrt(science.stats.variance(x));
|
9
|
+
if (!(lo = Math.min(hi, science.stats.iqr(x) / 1.34)))
|
10
|
+
(lo = hi) || (lo = Math.abs(x[1])) || (lo = 1);
|
11
|
+
return .9 * lo * Math.pow(x.length, -.2);
|
12
|
+
},
|
13
|
+
|
14
|
+
// Scott, D. W. (1992) Multivariate Density Estimation: Theory, Practice, and
|
15
|
+
// Visualization. Wiley.
|
16
|
+
nrd: function(x) {
|
17
|
+
var h = science.stats.iqr(x) / 1.34;
|
18
|
+
return 1.06 * Math.min(Math.sqrt(science.stats.variance(x)), h)
|
19
|
+
* Math.pow(x.length, -1/5);
|
20
|
+
}
|
21
|
+
};
|
22
|
+
science.stats.distance = {
|
23
|
+
euclidean: function(a, b) {
|
24
|
+
var n = a.length,
|
25
|
+
i = -1,
|
26
|
+
s = 0,
|
27
|
+
x;
|
28
|
+
while (++i < n) {
|
29
|
+
x = a[i] - b[i];
|
30
|
+
s += x * x;
|
31
|
+
}
|
32
|
+
return Math.sqrt(s);
|
33
|
+
},
|
34
|
+
manhattan: function(a, b) {
|
35
|
+
var n = a.length,
|
36
|
+
i = -1,
|
37
|
+
s = 0;
|
38
|
+
while (++i < n) s += Math.abs(a[i] - b[i]);
|
39
|
+
return s;
|
40
|
+
},
|
41
|
+
minkowski: function(p) {
|
42
|
+
return function(a, b) {
|
43
|
+
var n = a.length,
|
44
|
+
i = -1,
|
45
|
+
s = 0;
|
46
|
+
while (++i < n) s += Math.pow(Math.abs(a[i] - b[i]), p);
|
47
|
+
return Math.pow(s, 1 / p);
|
48
|
+
};
|
49
|
+
},
|
50
|
+
chebyshev: function(a, b) {
|
51
|
+
var n = a.length,
|
52
|
+
i = -1,
|
53
|
+
max = 0,
|
54
|
+
x;
|
55
|
+
while (++i < n) {
|
56
|
+
x = Math.abs(a[i] - b[i]);
|
57
|
+
if (x > max) max = x;
|
58
|
+
}
|
59
|
+
return max;
|
60
|
+
},
|
61
|
+
hamming: function(a, b) {
|
62
|
+
var n = a.length,
|
63
|
+
i = -1,
|
64
|
+
d = 0;
|
65
|
+
while (++i < n) if (a[i] !== b[i]) d++;
|
66
|
+
return d;
|
67
|
+
},
|
68
|
+
jaccard: function(a, b) {
|
69
|
+
var n = a.length,
|
70
|
+
i = -1,
|
71
|
+
s = 0;
|
72
|
+
while (++i < n) if (a[i] === b[i]) s++;
|
73
|
+
return s / n;
|
74
|
+
},
|
75
|
+
braycurtis: function(a, b) {
|
76
|
+
var n = a.length,
|
77
|
+
i = -1,
|
78
|
+
s0 = 0,
|
79
|
+
s1 = 0,
|
80
|
+
ai,
|
81
|
+
bi;
|
82
|
+
while (++i < n) {
|
83
|
+
ai = a[i];
|
84
|
+
bi = b[i];
|
85
|
+
s0 += Math.abs(ai - bi);
|
86
|
+
s1 += Math.abs(ai + bi);
|
87
|
+
}
|
88
|
+
return s0 / s1;
|
89
|
+
}
|
90
|
+
};
|
91
|
+
// Based on implementation in http://picomath.org/.
|
92
|
+
science.stats.erf = function(x) {
|
93
|
+
var a1 = 0.254829592,
|
94
|
+
a2 = -0.284496736,
|
95
|
+
a3 = 1.421413741,
|
96
|
+
a4 = -1.453152027,
|
97
|
+
a5 = 1.061405429,
|
98
|
+
p = 0.3275911;
|
99
|
+
|
100
|
+
// Save the sign of x
|
101
|
+
var sign = x < 0 ? -1 : 1;
|
102
|
+
if (x < 0) {
|
103
|
+
sign = -1;
|
104
|
+
x = -x;
|
105
|
+
}
|
106
|
+
|
107
|
+
// A&S formula 7.1.26
|
108
|
+
var t = 1 / (1 + p * x);
|
109
|
+
return sign * (
|
110
|
+
1 - (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1)
|
111
|
+
* t * Math.exp(-x * x));
|
112
|
+
};
|
113
|
+
science.stats.phi = function(x) {
|
114
|
+
return .5 * (1 + science.stats.erf(x / Math.SQRT2));
|
115
|
+
};
|
116
|
+
// See <http://en.wikipedia.org/wiki/Kernel_(statistics)>.
|
117
|
+
science.stats.kernel = {
|
118
|
+
uniform: function(u) {
|
119
|
+
if (u <= 1 && u >= -1) return .5;
|
120
|
+
return 0;
|
121
|
+
},
|
122
|
+
triangular: function(u) {
|
123
|
+
if (u <= 1 && u >= -1) return 1 - Math.abs(u);
|
124
|
+
return 0;
|
125
|
+
},
|
126
|
+
epanechnikov: function(u) {
|
127
|
+
if (u <= 1 && u >= -1) return .75 * (1 - u * u);
|
128
|
+
return 0;
|
129
|
+
},
|
130
|
+
quartic: function(u) {
|
131
|
+
if (u <= 1 && u >= -1) {
|
132
|
+
var tmp = 1 - u * u;
|
133
|
+
return (15 / 16) * tmp * tmp;
|
134
|
+
}
|
135
|
+
return 0;
|
136
|
+
},
|
137
|
+
triweight: function(u) {
|
138
|
+
if (u <= 1 && u >= -1) {
|
139
|
+
var tmp = 1 - u * u;
|
140
|
+
return (35 / 32) * tmp * tmp * tmp;
|
141
|
+
}
|
142
|
+
return 0;
|
143
|
+
},
|
144
|
+
gaussian: function(u) {
|
145
|
+
return 1 / Math.sqrt(2 * Math.PI) * Math.exp(-.5 * u * u);
|
146
|
+
},
|
147
|
+
cosine: function(u) {
|
148
|
+
if (u <= 1 && u >= -1) return Math.PI / 4 * Math.cos(Math.PI / 2 * u);
|
149
|
+
return 0;
|
150
|
+
}
|
151
|
+
};
|
152
|
+
// http://exploringdata.net/den_trac.htm
|
153
|
+
science.stats.kde = function() {
|
154
|
+
var kernel = science.stats.kernel.gaussian,
|
155
|
+
sample = [],
|
156
|
+
bandwidth = science.stats.bandwidth.nrd;
|
157
|
+
|
158
|
+
function kde(points, i) {
|
159
|
+
var bw = bandwidth.call(this, sample);
|
160
|
+
return points.map(function(x) {
|
161
|
+
var i = -1,
|
162
|
+
y = 0,
|
163
|
+
n = sample.length;
|
164
|
+
while (++i < n) {
|
165
|
+
y += kernel((x - sample[i]) / bw);
|
166
|
+
}
|
167
|
+
return [x, y / bw / n];
|
168
|
+
});
|
169
|
+
}
|
170
|
+
|
171
|
+
kde.kernel = function(x) {
|
172
|
+
if (!arguments.length) return kernel;
|
173
|
+
kernel = x;
|
174
|
+
return kde;
|
175
|
+
};
|
176
|
+
|
177
|
+
kde.sample = function(x) {
|
178
|
+
if (!arguments.length) return sample;
|
179
|
+
sample = x;
|
180
|
+
return kde;
|
181
|
+
};
|
182
|
+
|
183
|
+
kde.bandwidth = function(x) {
|
184
|
+
if (!arguments.length) return bandwidth;
|
185
|
+
bandwidth = science.functor(x);
|
186
|
+
return kde;
|
187
|
+
};
|
188
|
+
|
189
|
+
return kde;
|
190
|
+
};
|
191
|
+
// Based on figue implementation by Jean-Yves Delort.
|
192
|
+
// http://code.google.com/p/figue/
|
193
|
+
science.stats.kmeans = function() {
|
194
|
+
var distance = science.stats.distance.euclidean,
|
195
|
+
maxIterations = 1000,
|
196
|
+
k = 1;
|
197
|
+
|
198
|
+
function kmeans(vectors) {
|
199
|
+
var n = vectors.length,
|
200
|
+
assignments = [],
|
201
|
+
clusterSizes = [],
|
202
|
+
repeat = 1,
|
203
|
+
iterations = 0,
|
204
|
+
centroids = science_stats_kmeansRandom(k, vectors),
|
205
|
+
newCentroids,
|
206
|
+
i,
|
207
|
+
j,
|
208
|
+
x,
|
209
|
+
d,
|
210
|
+
min,
|
211
|
+
best;
|
212
|
+
|
213
|
+
while (repeat && iterations < maxIterations) {
|
214
|
+
// Assignment step.
|
215
|
+
j = -1; while (++j < k) {
|
216
|
+
clusterSizes[j] = 0;
|
217
|
+
}
|
218
|
+
|
219
|
+
i = -1; while (++i < n) {
|
220
|
+
x = vectors[i];
|
221
|
+
min = Infinity;
|
222
|
+
j = -1; while (++j < k) {
|
223
|
+
d = distance.call(this, centroids[j], x);
|
224
|
+
if (d < min) {
|
225
|
+
min = d;
|
226
|
+
best = j;
|
227
|
+
}
|
228
|
+
}
|
229
|
+
clusterSizes[assignments[i] = best]++;
|
230
|
+
}
|
231
|
+
|
232
|
+
// Update centroids step.
|
233
|
+
newCentroids = [];
|
234
|
+
i = -1; while (++i < n) {
|
235
|
+
x = assignments[i];
|
236
|
+
d = newCentroids[x];
|
237
|
+
if (d == null) newCentroids[x] = vectors[i].slice();
|
238
|
+
else {
|
239
|
+
j = -1; while (++j < d.length) {
|
240
|
+
d[j] += vectors[i][j];
|
241
|
+
}
|
242
|
+
}
|
243
|
+
}
|
244
|
+
j = -1; while (++j < k) {
|
245
|
+
x = newCentroids[j];
|
246
|
+
d = 1 / clusterSizes[j];
|
247
|
+
i = -1; while (++i < x.length) x[i] *= d;
|
248
|
+
}
|
249
|
+
|
250
|
+
// Check convergence.
|
251
|
+
repeat = 0;
|
252
|
+
j = -1; while (++j < k) {
|
253
|
+
if (!science_stats_kmeansCompare(newCentroids[j], centroids[j])) {
|
254
|
+
repeat = 1;
|
255
|
+
break;
|
256
|
+
}
|
257
|
+
}
|
258
|
+
centroids = newCentroids;
|
259
|
+
iterations++;
|
260
|
+
}
|
261
|
+
return {assignments: assignments, centroids: centroids};
|
262
|
+
}
|
263
|
+
|
264
|
+
kmeans.k = function(x) {
|
265
|
+
if (!arguments.length) return k;
|
266
|
+
k = x;
|
267
|
+
return kmeans;
|
268
|
+
};
|
269
|
+
|
270
|
+
kmeans.distance = function(x) {
|
271
|
+
if (!arguments.length) return distance;
|
272
|
+
distance = x;
|
273
|
+
return kmeans;
|
274
|
+
};
|
275
|
+
|
276
|
+
return kmeans;
|
277
|
+
};
|
278
|
+
|
279
|
+
function science_stats_kmeansCompare(a, b) {
|
280
|
+
if (!a || !b || a.length !== b.length) return false;
|
281
|
+
var n = a.length,
|
282
|
+
i = -1;
|
283
|
+
while (++i < n) if (a[i] !== b[i]) return false;
|
284
|
+
return true;
|
285
|
+
}
|
286
|
+
|
287
|
+
// Returns an array of k distinct vectors randomly selected from the input
|
288
|
+
// array of vectors. Returns null if k > n or if there are less than k distinct
|
289
|
+
// objects in vectors.
|
290
|
+
function science_stats_kmeansRandom(k, vectors) {
|
291
|
+
var n = vectors.length;
|
292
|
+
if (k > n) return null;
|
293
|
+
|
294
|
+
var selected_vectors = [];
|
295
|
+
var selected_indices = [];
|
296
|
+
var tested_indices = {};
|
297
|
+
var tested = 0;
|
298
|
+
var selected = 0;
|
299
|
+
var i,
|
300
|
+
vector,
|
301
|
+
select;
|
302
|
+
|
303
|
+
while (selected < k) {
|
304
|
+
if (tested === n) return null;
|
305
|
+
|
306
|
+
var random_index = Math.floor(Math.random() * n);
|
307
|
+
if (random_index in tested_indices) continue;
|
308
|
+
|
309
|
+
tested_indices[random_index] = 1;
|
310
|
+
tested++;
|
311
|
+
vector = vectors[random_index];
|
312
|
+
select = true;
|
313
|
+
for (i = 0; i < selected; i++) {
|
314
|
+
if (science_stats_kmeansCompare(vector, selected_vectors[i])) {
|
315
|
+
select = false;
|
316
|
+
break;
|
317
|
+
}
|
318
|
+
}
|
319
|
+
if (select) {
|
320
|
+
selected_vectors[selected] = vector;
|
321
|
+
selected_indices[selected] = random_index;
|
322
|
+
selected++;
|
323
|
+
}
|
324
|
+
}
|
325
|
+
return selected_vectors;
|
326
|
+
}
|
327
|
+
science.stats.hcluster = function() {
|
328
|
+
var distance = science.stats.distance.euclidean,
|
329
|
+
linkage = "simple"; // simple, complete or average
|
330
|
+
|
331
|
+
function hcluster(vectors) {
|
332
|
+
var n = vectors.length,
|
333
|
+
dMin = [],
|
334
|
+
cSize = [],
|
335
|
+
distMatrix = [],
|
336
|
+
clusters = [],
|
337
|
+
c1,
|
338
|
+
c2,
|
339
|
+
c1Cluster,
|
340
|
+
c2Cluster,
|
341
|
+
p,
|
342
|
+
root,
|
343
|
+
i,
|
344
|
+
j;
|
345
|
+
|
346
|
+
// Initialise distance matrix and vector of closest clusters.
|
347
|
+
i = -1; while (++i < n) {
|
348
|
+
dMin[i] = 0;
|
349
|
+
distMatrix[i] = [];
|
350
|
+
j = -1; while (++j < n) {
|
351
|
+
distMatrix[i][j] = i === j ? Infinity : distance(vectors[i] , vectors[j]);
|
352
|
+
if (distMatrix[i][dMin[i]] > distMatrix[i][j]) dMin[i] = j;
|
353
|
+
}
|
354
|
+
}
|
355
|
+
|
356
|
+
// create leaves of the tree
|
357
|
+
i = -1; while (++i < n) {
|
358
|
+
clusters[i] = [];
|
359
|
+
clusters[i][0] = {
|
360
|
+
left: null,
|
361
|
+
right: null,
|
362
|
+
dist: 0,
|
363
|
+
centroid: vectors[i],
|
364
|
+
size: 1,
|
365
|
+
depth: 0
|
366
|
+
};
|
367
|
+
cSize[i] = 1;
|
368
|
+
}
|
369
|
+
|
370
|
+
// Main loop
|
371
|
+
for (p = 0; p < n-1; p++) {
|
372
|
+
// find the closest pair of clusters
|
373
|
+
c1 = 0;
|
374
|
+
for (i = 0; i < n; i++) {
|
375
|
+
if (distMatrix[i][dMin[i]] < distMatrix[c1][dMin[c1]]) c1 = i;
|
376
|
+
}
|
377
|
+
c2 = dMin[c1];
|
378
|
+
|
379
|
+
// create node to store cluster info
|
380
|
+
c1Cluster = clusters[c1][0];
|
381
|
+
c2Cluster = clusters[c2][0];
|
382
|
+
|
383
|
+
newCluster = {
|
384
|
+
left: c1Cluster,
|
385
|
+
right: c2Cluster,
|
386
|
+
dist: distMatrix[c1][c2],
|
387
|
+
centroid: calculateCentroid(c1Cluster.size, c1Cluster.centroid,
|
388
|
+
c2Cluster.size, c2Cluster.centroid),
|
389
|
+
size: c1Cluster.size + c2Cluster.size,
|
390
|
+
depth: 1 + Math.max(c1Cluster.depth, c2Cluster.depth)
|
391
|
+
};
|
392
|
+
clusters[c1].splice(0, 0, newCluster);
|
393
|
+
cSize[c1] += cSize[c2];
|
394
|
+
|
395
|
+
// overwrite row c1 with respect to the linkage type
|
396
|
+
for (j = 0; j < n; j++) {
|
397
|
+
switch (linkage) {
|
398
|
+
case "single":
|
399
|
+
if (distMatrix[c1][j] > distMatrix[c2][j])
|
400
|
+
distMatrix[j][c1] = distMatrix[c1][j] = distMatrix[c2][j];
|
401
|
+
break;
|
402
|
+
case "complete":
|
403
|
+
if (distMatrix[c1][j] < distMatrix[c2][j])
|
404
|
+
distMatrix[j][c1] = distMatrix[c1][j] = distMatrix[c2][j];
|
405
|
+
break;
|
406
|
+
case "average":
|
407
|
+
distMatrix[j][c1] = distMatrix[c1][j] = (cSize[c1] * distMatrix[c1][j] + cSize[c2] * distMatrix[c2][j]) / (cSize[c1] + cSize[j]);
|
408
|
+
break;
|
409
|
+
}
|
410
|
+
}
|
411
|
+
distMatrix[c1][c1] = Infinity;
|
412
|
+
|
413
|
+
// infinity out old row c2 and column c2
|
414
|
+
for (i = 0; i < n; i++)
|
415
|
+
distMatrix[i][c2] = distMatrix[c2][i] = Infinity;
|
416
|
+
|
417
|
+
// update dmin and replace ones that previous pointed to c2 to point to c1
|
418
|
+
for (j = 0; j < n; j++) {
|
419
|
+
if (dMin[j] == c2) dMin[j] = c1;
|
420
|
+
if (distMatrix[c1][j] < distMatrix[c1][dMin[c1]]) dMin[c1] = j;
|
421
|
+
}
|
422
|
+
|
423
|
+
// keep track of the last added cluster
|
424
|
+
root = newCluster;
|
425
|
+
}
|
426
|
+
|
427
|
+
return root;
|
428
|
+
}
|
429
|
+
|
430
|
+
hcluster.distance = function(x) {
|
431
|
+
if (!arguments.length) return distance;
|
432
|
+
distance = x;
|
433
|
+
return hcluster;
|
434
|
+
};
|
435
|
+
|
436
|
+
return hcluster;
|
437
|
+
};
|
438
|
+
|
439
|
+
function calculateCentroid(c1Size, c1Centroid, c2Size, c2Centroid) {
|
440
|
+
var newCentroid = [],
|
441
|
+
newSize = c1Size + c2Size,
|
442
|
+
n = c1Centroid.length,
|
443
|
+
i = -1;
|
444
|
+
while (++i < n) {
|
445
|
+
newCentroid[i] = (c1Size * c1Centroid[i] + c2Size * c2Centroid[i]) / newSize;
|
446
|
+
}
|
447
|
+
return newCentroid;
|
448
|
+
}
|
449
|
+
science.stats.iqr = function(x) {
|
450
|
+
var quartiles = science.stats.quantiles(x, [.25, .75]);
|
451
|
+
return quartiles[1] - quartiles[0];
|
452
|
+
};
|
453
|
+
// Based on org.apache.commons.math.analysis.interpolation.LoessInterpolator
|
454
|
+
// from http://commons.apache.org/math/
|
455
|
+
science.stats.loess = function() {
|
456
|
+
var bandwidth = .3,
|
457
|
+
robustnessIters = 2,
|
458
|
+
accuracy = 1e-12;
|
459
|
+
|
460
|
+
function smooth(xval, yval, weights) {
|
461
|
+
var n = xval.length,
|
462
|
+
i;
|
463
|
+
|
464
|
+
if (n !== yval.length) throw {error: "Mismatched array lengths"};
|
465
|
+
if (n == 0) throw {error: "At least one point required."};
|
466
|
+
|
467
|
+
if (arguments.length < 3) {
|
468
|
+
weights = [];
|
469
|
+
i = -1; while (++i < n) weights[i] = 1;
|
470
|
+
}
|
471
|
+
|
472
|
+
science_stats_loessFiniteReal(xval);
|
473
|
+
science_stats_loessFiniteReal(yval);
|
474
|
+
science_stats_loessFiniteReal(weights);
|
475
|
+
science_stats_loessStrictlyIncreasing(xval);
|
476
|
+
|
477
|
+
if (n == 1) return [yval[0]];
|
478
|
+
if (n == 2) return [yval[0], yval[1]];
|
479
|
+
|
480
|
+
var bandwidthInPoints = Math.floor(bandwidth * n);
|
481
|
+
|
482
|
+
if (bandwidthInPoints < 2) throw {error: "Bandwidth too small."};
|
483
|
+
|
484
|
+
var res = [],
|
485
|
+
residuals = [],
|
486
|
+
robustnessWeights = [];
|
487
|
+
|
488
|
+
// Do an initial fit and 'robustnessIters' robustness iterations.
|
489
|
+
// This is equivalent to doing 'robustnessIters+1' robustness iterations
|
490
|
+
// starting with all robustness weights set to 1.
|
491
|
+
i = -1; while (++i < n) {
|
492
|
+
res[i] = 0;
|
493
|
+
residuals[i] = 0;
|
494
|
+
robustnessWeights[i] = 1;
|
495
|
+
}
|
496
|
+
|
497
|
+
var iter = -1;
|
498
|
+
while (++iter <= robustnessIters) {
|
499
|
+
var bandwidthInterval = [0, bandwidthInPoints - 1];
|
500
|
+
// At each x, compute a local weighted linear regression
|
501
|
+
var x;
|
502
|
+
i = -1; while (++i < n) {
|
503
|
+
x = xval[i];
|
504
|
+
|
505
|
+
// Find out the interval of source points on which
|
506
|
+
// a regression is to be made.
|
507
|
+
if (i > 0) {
|
508
|
+
science_stats_loessUpdateBandwidthInterval(xval, weights, i, bandwidthInterval);
|
509
|
+
}
|
510
|
+
|
511
|
+
var ileft = bandwidthInterval[0],
|
512
|
+
iright = bandwidthInterval[1];
|
513
|
+
|
514
|
+
// Compute the point of the bandwidth interval that is
|
515
|
+
// farthest from x
|
516
|
+
var edge = (xval[i] - xval[ileft]) > (xval[iright] - xval[i]) ? ileft : iright;
|
517
|
+
|
518
|
+
// Compute a least-squares linear fit weighted by
|
519
|
+
// the product of robustness weights and the tricube
|
520
|
+
// weight function.
|
521
|
+
// See http://en.wikipedia.org/wiki/Linear_regression
|
522
|
+
// (section "Univariate linear case")
|
523
|
+
// and http://en.wikipedia.org/wiki/Weighted_least_squares
|
524
|
+
// (section "Weighted least squares")
|
525
|
+
var sumWeights = 0,
|
526
|
+
sumX = 0,
|
527
|
+
sumXSquared = 0,
|
528
|
+
sumY = 0,
|
529
|
+
sumXY = 0,
|
530
|
+
denom = Math.abs(1 / (xval[edge] - x));
|
531
|
+
|
532
|
+
for (var k = ileft; k <= iright; ++k) {
|
533
|
+
var xk = xval[k],
|
534
|
+
yk = yval[k],
|
535
|
+
dist = k < i ? x - xk : xk - x,
|
536
|
+
w = science_stats_loessTricube(dist * denom) * robustnessWeights[k] * weights[k],
|
537
|
+
xkw = xk * w;
|
538
|
+
sumWeights += w;
|
539
|
+
sumX += xkw;
|
540
|
+
sumXSquared += xk * xkw;
|
541
|
+
sumY += yk * w;
|
542
|
+
sumXY += yk * xkw;
|
543
|
+
}
|
544
|
+
|
545
|
+
var meanX = sumX / sumWeights,
|
546
|
+
meanY = sumY / sumWeights,
|
547
|
+
meanXY = sumXY / sumWeights,
|
548
|
+
meanXSquared = sumXSquared / sumWeights;
|
549
|
+
|
550
|
+
var beta = (Math.sqrt(Math.abs(meanXSquared - meanX * meanX)) < accuracy)
|
551
|
+
? 0 : ((meanXY - meanX * meanY) / (meanXSquared - meanX * meanX));
|
552
|
+
|
553
|
+
var alpha = meanY - beta * meanX;
|
554
|
+
|
555
|
+
res[i] = beta * x + alpha;
|
556
|
+
residuals[i] = Math.abs(yval[i] - res[i]);
|
557
|
+
}
|
558
|
+
|
559
|
+
// No need to recompute the robustness weights at the last
|
560
|
+
// iteration, they won't be needed anymore
|
561
|
+
if (iter === robustnessIters) {
|
562
|
+
break;
|
563
|
+
}
|
564
|
+
|
565
|
+
// Recompute the robustness weights.
|
566
|
+
|
567
|
+
// Find the median residual.
|
568
|
+
var sortedResiduals = residuals.slice();
|
569
|
+
sortedResiduals.sort();
|
570
|
+
var medianResidual = sortedResiduals[Math.floor(n / 2)];
|
571
|
+
|
572
|
+
if (Math.abs(medianResidual) < accuracy)
|
573
|
+
break;
|
574
|
+
|
575
|
+
var arg,
|
576
|
+
w;
|
577
|
+
i = -1; while (++i < n) {
|
578
|
+
arg = residuals[i] / (6 * medianResidual);
|
579
|
+
robustnessWeights[i] = (arg >= 1) ? 0 : ((w = 1 - arg * arg) * w);
|
580
|
+
}
|
581
|
+
}
|
582
|
+
|
583
|
+
return res;
|
584
|
+
}
|
585
|
+
|
586
|
+
smooth.bandwidth = function(x) {
|
587
|
+
if (!arguments.length) return x;
|
588
|
+
bandwidth = x;
|
589
|
+
return smooth;
|
590
|
+
};
|
591
|
+
|
592
|
+
smooth.robustnessIterations = function(x) {
|
593
|
+
if (!arguments.length) return x;
|
594
|
+
robustnessIters = x;
|
595
|
+
return smooth;
|
596
|
+
};
|
597
|
+
|
598
|
+
smooth.accuracy = function(x) {
|
599
|
+
if (!arguments.length) return x;
|
600
|
+
accuracy = x;
|
601
|
+
return smooth;
|
602
|
+
};
|
603
|
+
|
604
|
+
return smooth;
|
605
|
+
};
|
606
|
+
|
607
|
+
function science_stats_loessFiniteReal(values) {
|
608
|
+
var n = values.length,
|
609
|
+
i = -1;
|
610
|
+
|
611
|
+
while (++i < n) if (!isFinite(values[i])) return false;
|
612
|
+
|
613
|
+
return true;
|
614
|
+
}
|
615
|
+
|
616
|
+
function science_stats_loessStrictlyIncreasing(xval) {
|
617
|
+
var n = xval.length,
|
618
|
+
i = 0;
|
619
|
+
|
620
|
+
while (++i < n) if (xval[i - 1] >= xval[i]) return false;
|
621
|
+
|
622
|
+
return true;
|
623
|
+
}
|
624
|
+
|
625
|
+
// Compute the tricube weight function.
|
626
|
+
// http://en.wikipedia.org/wiki/Local_regression#Weight_function
|
627
|
+
function science_stats_loessTricube(x) {
|
628
|
+
return (x = 1 - x * x * x) * x * x;
|
629
|
+
}
|
630
|
+
|
631
|
+
// Given an index interval into xval that embraces a certain number of
|
632
|
+
// points closest to xval[i-1], update the interval so that it embraces
|
633
|
+
// the same number of points closest to xval[i], ignoring zero weights.
|
634
|
+
function science_stats_loessUpdateBandwidthInterval(
|
635
|
+
xval, weights, i, bandwidthInterval) {
|
636
|
+
|
637
|
+
var left = bandwidthInterval[0],
|
638
|
+
right = bandwidthInterval[1];
|
639
|
+
|
640
|
+
// The right edge should be adjusted if the next point to the right
|
641
|
+
// is closer to xval[i] than the leftmost point of the current interval
|
642
|
+
var nextRight = science_stats_loessNextNonzero(weights, right);
|
643
|
+
if ((nextRight < xval.length) && (xval[nextRight] - xval[i]) < (xval[i] - xval[left])) {
|
644
|
+
var nextLeft = science_stats_loessNextNonzero(weights, left);
|
645
|
+
bandwidthInterval[0] = nextLeft;
|
646
|
+
bandwidthInterval[1] = nextRight;
|
647
|
+
}
|
648
|
+
}
|
649
|
+
|
650
|
+
function science_stats_loessNextNonzero(weights, i) {
|
651
|
+
var j = i + 1;
|
652
|
+
while (j < weights.length && weights[j] === 0) j++;
|
653
|
+
return j;
|
654
|
+
}
|
655
|
+
// Welford's algorithm.
|
656
|
+
science.stats.mean = function(x) {
|
657
|
+
var n = x.length;
|
658
|
+
if (n === 0) return NaN;
|
659
|
+
var m = 0,
|
660
|
+
i = -1;
|
661
|
+
while (++i < n) m += (x[i] - m) / (i + 1);
|
662
|
+
return m;
|
663
|
+
};
|
664
|
+
science.stats.median = function(x) {
|
665
|
+
return science.stats.quantiles(x, [.5])[0];
|
666
|
+
};
|
667
|
+
science.stats.mode = function(x) {
|
668
|
+
x = x.slice().sort(science.ascending);
|
669
|
+
var mode,
|
670
|
+
n = x.length,
|
671
|
+
i = -1,
|
672
|
+
l = i,
|
673
|
+
last = null,
|
674
|
+
max = 0,
|
675
|
+
tmp,
|
676
|
+
v;
|
677
|
+
while (++i < n) {
|
678
|
+
if ((v = x[i]) !== last) {
|
679
|
+
if ((tmp = i - l) > max) {
|
680
|
+
max = tmp;
|
681
|
+
mode = last;
|
682
|
+
}
|
683
|
+
last = v;
|
684
|
+
l = i;
|
685
|
+
}
|
686
|
+
}
|
687
|
+
return mode;
|
688
|
+
};
|
689
|
+
// Uses R's quantile algorithm type=7.
|
690
|
+
science.stats.quantiles = function(d, quantiles) {
|
691
|
+
d = d.slice().sort(science.ascending);
|
692
|
+
var n_1 = d.length - 1;
|
693
|
+
return quantiles.map(function(q) {
|
694
|
+
if (q === 0) return d[0];
|
695
|
+
else if (q === 1) return d[n_1];
|
696
|
+
|
697
|
+
var index = 1 + q * n_1,
|
698
|
+
lo = Math.floor(index),
|
699
|
+
h = index - lo,
|
700
|
+
a = d[lo - 1];
|
701
|
+
|
702
|
+
return h === 0 ? a : a + h * (d[lo] - a);
|
703
|
+
});
|
704
|
+
};
|
705
|
+
// Unbiased estimate of a sample's variance.
|
706
|
+
// Also known as the sample variance, where the denominator is n - 1.
|
707
|
+
science.stats.variance = function(x) {
|
708
|
+
var n = x.length;
|
709
|
+
if (n < 1) return NaN;
|
710
|
+
if (n === 1) return 0;
|
711
|
+
var mean = science.stats.mean(x),
|
712
|
+
i = -1,
|
713
|
+
s = 0;
|
714
|
+
while (++i < n) {
|
715
|
+
var v = x[i] - mean;
|
716
|
+
s += v * v;
|
717
|
+
}
|
718
|
+
return s / (n - 1);
|
719
|
+
};
|
720
|
+
})()
|