@@ -73,7 +73,8 @@ return /******/ (function(modules) { // webpackBootstrap
73
73
74
74
var __WEBPACK_AMD_DEFINE_RESULT__ ; ! ( __WEBPACK_AMD_DEFINE_RESULT__ = function ( require ) {
75
75
76
- var dataPreprocess = __webpack_require__ ( 2 ) ;
76
+ var dataProcess = __webpack_require__ ( 2 ) ;
77
+ var dataPreprocess = dataProcess . dataPreprocess ;
77
78
var array = __webpack_require__ ( 3 ) ;
78
79
var arraySize = array . size ;
79
80
var sumOfColumn = array . sumOfColumn ;
@@ -164,12 +165,14 @@ return /******/ (function(modules) { // webpackBootstrap
164
165
/**
165
166
* The combine of hierarchical clustering and k-means.
166
167
* @param {Array } data two-dimension array.
167
- * @param {[type] } k the number of clusters in a dataset
168
+ * @param {[type] } k the number of clusters in a dataset. It has to be greater than 1.
168
169
* @param {boolean } stepByStep
169
170
* @return { }
170
171
*/
171
172
function hierarchicalKMeans ( data , k , stepByStep ) {
172
-
173
+ if ( k < 2 ) {
174
+ return ;
175
+ }
173
176
var dataSet = dataPreprocess ( data ) ;
174
177
var size = arraySize ( dataSet ) ;
175
178
var clusterAssment = zeros ( size [ 0 ] , 2 ) ;
@@ -397,7 +400,22 @@ return /******/ (function(modules) { // webpackBootstrap
397
400
return predata ;
398
401
}
399
402
400
- return dataPreprocess ;
403
+ /**
404
+ * @param {string|number } val
405
+ * @return {number }
406
+ */
407
+ function getPrecision ( val ) {
408
+ var str = val . toString ( ) ;
409
+ // scientific notation is not considered
410
+ var dotIndex = str . indexOf ( '.' ) ;
411
+ return dotIndex < 0 ? 0 : str . length - 1 - dotIndex ;
412
+ }
413
+
414
+ return {
415
+ dataPreprocess : dataPreprocess ,
416
+ getPrecision : getPrecision
417
+ } ;
418
+
401
419
} . call ( exports , __webpack_require__ , exports , module ) , __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && ( module . exports = __WEBPACK_AMD_DEFINE_RESULT__ ) ) ;
402
420
403
421
/***/ } ) ,
@@ -569,7 +587,7 @@ return /******/ (function(modules) { // webpackBootstrap
569
587
*/
570
588
function isNumber ( value ) {
571
589
572
- value = ( value === null ? NaN : + value ) ;
590
+ value = value === null ? NaN : + value ;
573
591
return typeof value === 'number' && ! isNaN ( value ) ;
574
592
}
575
593
@@ -595,7 +613,8 @@ return /******/ (function(modules) { // webpackBootstrap
595
613
596
614
var __WEBPACK_AMD_DEFINE_RESULT__ ; ! ( __WEBPACK_AMD_DEFINE_RESULT__ = function ( require ) {
597
615
598
- var dataPreprocess = __webpack_require__ ( 2 ) ;
616
+ var dataProcess = __webpack_require__ ( 2 ) ;
617
+ var dataPreprocess = dataProcess . dataPreprocess ;
599
618
600
619
var regreMethods = {
601
620
@@ -908,8 +927,8 @@ return /******/ (function(modules) { // webpackBootstrap
908
927
statistics . mean = __webpack_require__ ( 10 ) ;
909
928
statistics . median = __webpack_require__ ( 12 ) ;
910
929
statistics . min = __webpack_require__ ( 14 ) ;
911
- statistics . max = __webpack_require__ ( 13 ) ;
912
- statistics . max = __webpack_require__ ( 9 ) ;
930
+ statistics . quantile = __webpack_require__ ( 13 ) ;
931
+ statistics . sampleVariance = __webpack_require__ ( 9 ) ;
913
932
statistics . sum = __webpack_require__ ( 11 ) ;
914
933
915
934
return statistics ;
@@ -1000,14 +1019,15 @@ return /******/ (function(modules) { // webpackBootstrap
1000
1019
sum += temple * temple ;
1001
1020
}
1002
1021
}
1003
- return sum / data . length - 1 ;
1022
+ return sum / ( data . length - 1 ) ;
1004
1023
}
1005
1024
}
1006
1025
1007
1026
return sampleVariance ;
1008
1027
1009
1028
} . call ( exports , __webpack_require__ , exports , module ) , __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && ( module . exports = __WEBPACK_AMD_DEFINE_RESULT__ ) ) ;
1010
1029
1030
+
1011
1031
/***/ } ) ,
1012
1032
/* 10 */
1013
1033
/***/ ( function ( module , exports , __webpack_require__ ) {
@@ -1172,7 +1192,9 @@ return /******/ (function(modules) { // webpackBootstrap
1172
1192
var min = __webpack_require__ ( 14 ) ;
1173
1193
var quantile = __webpack_require__ ( 13 ) ;
1174
1194
var deviation = __webpack_require__ ( 8 ) ;
1175
- var dataPreprocess = __webpack_require__ ( 2 ) ;
1195
+ var dataProcess = __webpack_require__ ( 2 ) ;
1196
+ var dataPreprocess = dataProcess . dataPreprocess ;
1197
+ var getPrecision = dataProcess . getPrecision ;
1176
1198
var array = __webpack_require__ ( 3 ) ;
1177
1199
var ascending = array . ascending ;
1178
1200
var map = array . map ;
@@ -1189,25 +1211,26 @@ return /******/ (function(modules) { // webpackBootstrap
1189
1211
function computeBins ( data , threshold ) {
1190
1212
1191
1213
if ( threshold == null ) {
1192
-
1193
1214
threshold = thresholdMethod . squareRoot ;
1194
-
1195
1215
}
1196
1216
else {
1197
-
1198
1217
threshold = thresholdMethod [ threshold ] ;
1199
-
1200
1218
}
1201
1219
var values = dataPreprocess ( data ) ;
1202
1220
var maxValue = max ( values ) ;
1203
1221
var minValue = min ( values ) ;
1204
-
1205
1222
var binsNumber = threshold ( values , minValue , maxValue ) ;
1206
-
1207
1223
var step = tickStep ( minValue , maxValue , binsNumber ) ;
1208
-
1224
+ var precision = - Math . floor ( Math . log ( Math . abs ( maxValue - minValue ) / binsNumber ) / Math . LN10 ) ;
1225
+
1209
1226
// return the xAxis coordinate for each bins, except the end point of the value
1210
- var rangeArray = range ( Math . ceil ( minValue / step ) * step , Math . floor ( maxValue / step ) * step , step ) ;
1227
+ var rangeArray = range (
1228
+ // use function toFixed() to avoid data like '0.700000001'
1229
+ + ( ( Math . ceil ( minValue / step ) * step ) . toFixed ( precision ) ) ,
1230
+ + ( ( Math . floor ( maxValue / step ) * step ) . toFixed ( precision ) ) ,
1231
+ step ,
1232
+ precision
1233
+ ) ;
1211
1234
1212
1235
var len = rangeArray . length ;
1213
1236
@@ -1216,7 +1239,7 @@ return /******/ (function(modules) { // webpackBootstrap
1216
1239
for ( var i = 0 ; i <= len ; i ++ ) {
1217
1240
bins [ i ] = { } ;
1218
1241
bins [ i ] . sample = [ ] ;
1219
- bins [ i ] . x0 = i > 0 // 不要数组直接挂属性,改成Object
1242
+ bins [ i ] . x0 = i > 0
1220
1243
? rangeArray [ i - 1 ]
1221
1244
: ( rangeArray [ i ] - minValue ) === step
1222
1245
? minValue
@@ -1235,16 +1258,21 @@ return /******/ (function(modules) { // webpackBootstrap
1235
1258
}
1236
1259
1237
1260
var data = map ( bins , function ( bin ) {
1238
- return [ ( bin . x0 + bin . x1 ) / 2 , bin . sample . length ] ;
1261
+ // use function toFixed() to avoid data like '6.5666638489'
1262
+ return [ + ( ( bin . x0 + bin . x1 ) / 2 ) . toFixed ( precision ) , bin . sample . length ] ;
1263
+ } ) ;
1264
+
1265
+ var customData = map ( bins , function ( bin ) {
1266
+ return [ bin . x0 , bin . x1 , bin . sample . length ] ;
1239
1267
} ) ;
1240
1268
1241
1269
return {
1242
1270
bins : bins ,
1243
- data : data
1271
+ data : data ,
1272
+ customData : customData
1244
1273
} ;
1245
1274
}
1246
1275
1247
-
1248
1276
/**
1249
1277
* Four kinds of threshold methods used to
1250
1278
* compute how much bins the histogram should be divided
@@ -1291,34 +1319,42 @@ return /******/ (function(modules) { // webpackBootstrap
1291
1319
1292
1320
var __WEBPACK_AMD_DEFINE_RESULT__ ; ! ( __WEBPACK_AMD_DEFINE_RESULT__ = function ( require ) {
1293
1321
1322
+ var dataProcess = __webpack_require__ ( 2 ) ;
1323
+ var getPrecision = dataProcess . getPrecision ;
1324
+
1294
1325
/**
1295
- * Computing range array
1326
+ * Computing range array.
1327
+ * Adding param precision to fix range value, avoiding range[i] = 0.7000000001.
1296
1328
* @param {number } start
1297
- * @param {number } stop
1329
+ * @param {number } end
1298
1330
* @param {number } step
1331
+ * @param {number } precision
1299
1332
* @return {Array.<number> }
1300
1333
*/
1301
- return function ( start , stop , step ) {
1334
+ return function ( start , end , step , precision ) {
1302
1335
1303
1336
var len = arguments . length ;
1304
1337
1305
1338
if ( len < 2 ) {
1306
- stop = start ;
1339
+ end = start ;
1307
1340
start = 0 ;
1308
1341
step = 1 ;
1309
1342
}
1310
1343
else if ( len < 3 ) {
1311
1344
step = 1 ;
1312
1345
}
1313
- else {
1346
+ else if ( len < 4 ) {
1314
1347
step = + step ;
1348
+ precision = getPrecision ( step ) ;
1349
+ }
1350
+ else {
1351
+ precision = + precision ;
1315
1352
}
1316
1353
1317
- var n = Math . ceil ( ( stop - start ) / step ) ;
1354
+ var n = Math . ceil ( ( ( end - start ) / step ) . toFixed ( precision ) ) ;
1318
1355
var range = new Array ( n + 1 ) ;
1319
-
1320
1356
for ( var i = 0 ; i < n + 1 ; i ++ ) {
1321
- range [ i ] = start + i * step ;
1357
+ range [ i ] = + ( start + i * step ) . toFixed ( precision ) ;
1322
1358
}
1323
1359
return range ;
1324
1360
} ;
@@ -1341,7 +1377,8 @@ return /******/ (function(modules) { // webpackBootstrap
1341
1377
return function ( start , stop , count ) {
1342
1378
1343
1379
var step0 = Math . abs ( stop - start ) / count ;
1344
- var step1 = Math . pow ( 10 , Math . floor ( Math . log ( step0 ) / Math . LN10 ) ) ;
1380
+ var precision = Math . floor ( Math . log ( step0 ) / Math . LN10 ) ;
1381
+ var step1 = Math . pow ( 10 , precision ) ;
1345
1382
var error = step0 / step1 ;
1346
1383
1347
1384
if ( error >= Math . sqrt ( 50 ) ) {
@@ -1353,7 +1390,7 @@ return /******/ (function(modules) { // webpackBootstrap
1353
1390
else if ( error >= Math . sqrt ( 2 ) ) {
1354
1391
step1 *= 2 ;
1355
1392
}
1356
- return stop >= start ? step1 : - step1 ;
1393
+ return + ( ( stop >= start ? step1 : - step1 ) . toFixed ( - precision ) ) ;
1357
1394
1358
1395
} ;
1359
1396
0 commit comments