everyday-cli-utils 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ec3b8b4933935c4c8f32696a300d9e03b10aeb0a
4
- data.tar.gz: 6af1473a8f38fabec5097d9666a6972cd728834f
3
+ metadata.gz: 5027d77ef68c7d0aff222110d71d71100b7f0aab
4
+ data.tar.gz: a66077fff89ce842c5805719343d311cc87c9173
5
5
  SHA512:
6
- metadata.gz: a56b940fd967714110f57b70e47b1178ce069685cf03fba4d55cc9859e23d0f284fab303c5d0eb6d6f22926e2ede774f04fc317d21a45277743b8dfa40628290
7
- data.tar.gz: b52ad9d742d1cc507cde63bbb7ae6bd270a268f999ccdeaa022d7d5505fe0a8a052580d3e7a87502039f97c525857d48ed0c73a90e9baf58045c8156fb76c4a2
6
+ metadata.gz: 536936fbe11f8c7a8af96a0ad9f283db2812221f37663ff1f8e69939fe8b72369439ede6c4d98ebaaa5ac4a34f3631e9f5749ef6a3397bfbe72d8294b797f115
7
+ data.tar.gz: 00f8f63bdc70ebdfaedc5295ab8d9bfb8d7afbb66821f5cf76a670b5d21e67d0d641023efe4dedc4238cfca734284edbd06c67f67386cb3688fe74e44c557df6
@@ -1,7 +1,7 @@
1
1
  require_relative 'maputil'
2
2
 
3
3
  module EverydayCliUtils
4
- module Kmeans
4
+ module KmeansUtil
5
5
  def self.normal(x, avg, std)
6
6
  exp = -(((x - avg) / std) ** 2.0) / 2.0
7
7
  ((Math.exp(exp) / (std * Math.sqrt(2.0 * Math::PI))))
@@ -22,16 +22,15 @@ module EverydayCliUtils
22
22
 
23
23
  def self.f_test_uv(clusters, cnt, cnt2, means)
24
24
  uv = 0.0
25
- (0...means.count).each { |i|
26
- unless clusters[i].empty?
27
- (0...clusters[i].count).each { |j|
28
- uv += (clusters[i][j] - means[i]) * (clusters[i][j] - means[i])
29
- }
30
- end
31
- }
25
+ (0...means.count).each { |i| uv = f_test_uvi(clusters, i, means, uv) }
32
26
  uv / (cnt - cnt2)
33
27
  end
34
28
 
29
+ def self.f_test_uvi(clusters, i, means, uv)
30
+ (0...clusters[i].count).each { |j| uv += (clusters[i][j] - means[i]) * (clusters[i][j] - means[i]) } unless clusters[i].empty?
31
+ uv
32
+ end
33
+
35
34
  def self.f_test2(clusters, means, cnt)
36
35
  uv = 0.0
37
36
  cnt2 = clusters.count { |i| !i.empty? }
@@ -41,13 +40,36 @@ module EverydayCliUtils
41
40
 
42
41
  def self.f_test2_calc(clusters, i, means, uv)
43
42
  tmp = 0.0
44
- (0...clusters[i].count).each { |j|
45
- tmp += (clusters[i][j] - means[i]) ** 2.0
46
- }
43
+ (0...clusters[i].count).each { |j| tmp += (clusters[i][j] - means[i]) ** 2.0 }
47
44
  tmp /= clusters[i].count
48
45
  Math.sqrt(tmp)
49
46
  end
50
47
 
48
+ def self.get_clusters(collection, means)
49
+ clusters = Array.new(means.count) { Array.new }
50
+ collection.each { |item|
51
+ cluster = false
52
+ distance = false
53
+ (0...means.count).each { |i|
54
+ diff = (means[i] - item).abs
55
+ if distance == false || diff < distance
56
+ cluster = i
57
+ distance = diff
58
+ end
59
+ }
60
+ clusters[cluster] << item
61
+ }
62
+ clusters
63
+ end
64
+
65
+ def self.find_outliers(avg, cs, i, sensitivity)
66
+ csi = cs[i]
67
+ std = EverydayCliUtils::MapUtil.std_dev(csi)
68
+ cnt = csi.count
69
+ csi.select { |c| (normal(c, avg, std) * cnt) < sensitivity }
70
+ end
71
+ end
72
+ module Kmeans
51
73
  def self.nmeans_setup_1(collection)
52
74
  su = EverydayCliUtils::MapUtil.sum(collection)
53
75
  cnt = collection.count
@@ -57,12 +79,12 @@ module EverydayCliUtils
57
79
  end
58
80
 
59
81
  def self.nmeans_setup_2(collection, avg, cnt, ks1)
60
- cso = get_clusters(collection, ks1)
61
- ft1 = f_test2(cso, ks1, cnt)
82
+ cso = EverydayCliUtils::KmeansUtil.get_clusters(collection, ks1)
83
+ ft1 = EverydayCliUtils::KmeansUtil.f_test2(cso, ks1, cnt)
62
84
  ks = kmeans(collection, 2)
63
- cs = get_clusters(collection, ks)
64
- ft = f_test(cs, ks, cnt, avg)
65
- ft2 = f_test2(cs, ks, cnt)
85
+ cs = EverydayCliUtils::KmeansUtil.get_clusters(collection, ks)
86
+ ft = EverydayCliUtils::KmeansUtil.f_test(cs, ks, cnt, avg)
87
+ ft2 = EverydayCliUtils::KmeansUtil.f_test2(cs, ks, cnt)
66
88
  return ft, ft1, ft2, ks
67
89
  end
68
90
 
@@ -71,9 +93,9 @@ module EverydayCliUtils
71
93
  fto = ft
72
94
  fto2 = ft2
73
95
  ks = kmeans(collection, k)
74
- cs = get_clusters(collection, ks)
75
- ft = f_test(cs, ks, cnt, avg)
76
- ft2 = f_test2(cs, ks, cnt)
96
+ cs = EverydayCliUtils::KmeansUtil.get_clusters(collection, ks)
97
+ ft = EverydayCliUtils::KmeansUtil.f_test(cs, ks, cnt, avg)
98
+ ft2 = EverydayCliUtils::KmeansUtil.f_test2(cs, ks, cnt)
77
99
  return ft, ft2, fto, fto2, ks, kso
78
100
  end
79
101
 
@@ -87,30 +109,13 @@ module EverydayCliUtils
87
109
 
88
110
  def self.run_kmean(collection, ks)
89
111
  kso = ks
90
- clusters = get_clusters(collection, kso)
112
+ clusters = EverydayCliUtils::KmeansUtil.get_clusters(collection, kso)
91
113
  ks = []
92
114
  clusters.each_with_index { |val, key| ks[key] = (val.count <= 0) ? kso[key] : (val.sum / val.count) }
93
115
  ks.sort
94
116
  return kso, ks
95
117
  end
96
118
 
97
- def self.get_clusters(collection, means)
98
- clusters = Array.new(means.count) { Array.new }
99
- collection.each { |item|
100
- cluster = false
101
- distance = false
102
- (0...means.count).each { |i|
103
- diff = (means[i] - item).abs
104
- if distance == false || diff < distance
105
- cluster = i
106
- distance = diff
107
- end
108
- }
109
- clusters[cluster] << item
110
- }
111
- clusters
112
- end
113
-
114
119
  def self.kmeans(collection, k)
115
120
  mi = collection.min
116
121
  ma = collection.max
@@ -132,20 +137,13 @@ module EverydayCliUtils
132
137
  run_nmeans(avg, cnt, collection, ft, ft1, ft2, ks, ks1, max_k, threshold)
133
138
  end
134
139
 
135
- def self.find_outliers(avg, cs, i, sensitivity)
136
- csi = cs[i]
137
- std = EverydayCliUtils::MapUtil.std_dev(csi)
138
- cnt = csi.count
139
- csi.select { |c| (normal(c, avg, std) * cnt) < sensitivity }
140
- end
141
-
142
140
  def self.outliers(collection, sensitivity = 0.5, k = nil)
143
141
  ks = k.nil? ? nmeans(collection) : kmeans(collection, k)
144
- cs = get_clusters(collection, ks)
142
+ cs = EverydayCliUtils::KmeansUtil.get_clusters(collection, ks)
145
143
 
146
144
  outliers = []
147
145
 
148
- ks.each_with_index { |avg, i| outliers += find_outliers(avg, cs, i, sensitivity) }
146
+ ks.each_with_index { |avg, i| outliers += EverydayCliUtils::KmeansUtil.find_outliers(avg, cs, i, sensitivity) }
149
147
  outliers
150
148
  end
151
149
  end
@@ -1,3 +1,3 @@
1
1
  module EverydayCliUtils
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -1,5 +1,36 @@
1
1
  require_relative 'everyday-cli-utils/version'
2
2
 
3
3
  module EverydayCliUtils
4
- # Your code goes here...
4
+ AVAILABLE_MODULES = [:ask, :format, :format_safe, :histogram, :histogram_safe, :kmeans, :kmeans_safe, :maputil, :maputil_safe, :mycurses, :option]
5
+
6
+ def self.import(*names)
7
+ names.each { |name|
8
+ case (name)
9
+ when :ask
10
+ require_relative 'everyday-cli-utils/ask'
11
+ when :format
12
+ require_relative 'everyday-cli-utils/format'
13
+ when :format_safe
14
+ require_relative 'everyday-cli-utils/safe/format'
15
+ when :histogram
16
+ require_relative 'everyday-cli-utils/histogram'
17
+ when :histogram_safe
18
+ require_relative 'everyday-cli-utils/safe/histogram'
19
+ when :kmeans
20
+ require_relative 'everyday-cli-utils/kmeans'
21
+ when :kmeans_safe
22
+ require_relative 'everyday-cli-utils/safe/kmeans'
23
+ when :maputil
24
+ require_relative 'everyday-cli-utils/maputil'
25
+ when :maputil_safe
26
+ require_relative 'everyday-cli-utils/safe/maputil'
27
+ when :mycurses
28
+ require_relative 'everyday-cli-utils/mycurses'
29
+ when :option
30
+ require_relative 'everyday-cli-utils/option'
31
+ else
32
+ raise "#{name.to_s} not found!"
33
+ end
34
+ }
35
+ end
5
36
  end
@@ -1,4 +1,5 @@
1
- require_relative '../../lib/everyday-cli-utils/format'
1
+ require_relative '../../lib/everyday-cli-utils'
2
+ EverydayCliUtils::import :format
2
3
 
3
4
  def extract_format(text)
4
5
  (text.scan(/#{"\e"}\[(.+?)m([^#{"\e"}]+?)#{"\e"}\[0m|([^#{"\e"}]+)/))[0][0]
@@ -1,4 +1,5 @@
1
- require_relative '../../lib/everyday-cli-utils/kmeans'
1
+ require_relative '../../lib/everyday-cli-utils'
2
+ EverydayCliUtils.import :kmeans
2
3
 
3
4
  describe EverydayCliUtils::Kmeans do
4
5
  it 'finds the right clusters in simple data' do
@@ -1,4 +1,5 @@
1
- require_relative '../../lib/everyday-cli-utils/maputil'
1
+ require_relative '../../lib/everyday-cli-utils'
2
+ EverydayCliUtils.import :maputil
2
3
 
3
4
  describe 'maputil' do
4
5
  it 'provides a shortcut for removing false values from a list' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: everyday-cli-utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Henderson