nt_kmeans 0.0.1

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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/kmeans.rb +87 -0
  3. metadata +44 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 573007bfd7b624d0da1143cf1a95d2f8957cd1f26fdf7ffe82b8e762679a738b
4
+ data.tar.gz: f95b9d25c1a89be72a4ddf334bee83fa0bd1433d359c317165be9f9c6d623473
5
+ SHA512:
6
+ metadata.gz: 0b58ed7e34ef55b61c657b644d38c698b7d99d6609ed3833da0c8b25908984bacfab902dae707830c70d65eac9d628b0e22f21b8ef8d312b6da4e5cbdc6141f0
7
+ data.tar.gz: a25a87418aa7e0b7d0ac16eec10bc2d0b3d4199fa3cf5123231aa72ccd9d43b97eb3fb8a4e2c509c9bbe5c74574a47b979013ce8742f9b12dc8815e547748f1f
@@ -0,0 +1,87 @@
1
+ class Kmeans
2
+ require 'json'
3
+
4
+ def self.hi
5
+ puts "K-means clustering ruby!"
6
+ end
7
+
8
+ def self.run k, data
9
+ # random first centers
10
+ centers = data.sample(k)
11
+ y = []
12
+ (0..(k-1)).each do |i|
13
+ y[i] = []
14
+ end
15
+ while true
16
+ # save pre-loop groups
17
+ y_old = y
18
+ # grouping
19
+ y = group_data(data, centers)
20
+ # break while loop if groups are not changed
21
+ if y === y_old
22
+ break
23
+ end
24
+ # update centers
25
+ centers = []
26
+ y.each do |ct|
27
+ centers.push(getCenter ct)
28
+ end
29
+ end
30
+ return centers, y
31
+ end
32
+
33
+ def self.group_data data, centers
34
+ y = []
35
+ (0..(centers.length-1)).each do |i|
36
+ y[i] = []
37
+ end
38
+ list = []
39
+ data.each do |x|
40
+ centers.each do |center|
41
+ list.push(euclidean_distance(x, center))
42
+ end
43
+ min = argmin(list)
44
+ y[min].push(x)
45
+ list = []
46
+ end
47
+ return y
48
+ end
49
+
50
+ # cosine
51
+ def self.euclidean_distance p1, p2
52
+ sum_1 = 0
53
+ sum_2 = 0
54
+ sum_12 = 0
55
+ p1.each_with_index do |p, i|
56
+ sum_1 = sum_1 + p**2
57
+ sum_12 = sum_12 + (p1[i].to_f * p2[i].to_f)
58
+ end
59
+ p2.each_with_index do |p|
60
+ sum_2 = sum_2 + p**2
61
+ end
62
+ return 1 - sum_12 / (Math.sqrt(sum_1) * Math.sqrt(sum_2))
63
+ end
64
+
65
+ def self.getCenter ps
66
+ p = []
67
+ ps.each do |p1|
68
+ p1.each_with_index do |p2, i|
69
+ p[i] = p[i].to_f+ p2.to_f
70
+ end
71
+ end
72
+ p.each_with_index do |p3, i|
73
+ p[i] = p[i]/ps.count
74
+ end
75
+ return p
76
+ end
77
+
78
+ def self.argmin arr
79
+ i = 0
80
+ (1..(arr.length-1)).each do |index|
81
+ if arr[i] >= arr[index]
82
+ i = index
83
+ end
84
+ end
85
+ return i
86
+ end
87
+ end
metadata ADDED
@@ -0,0 +1,44 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nt_kmeans
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Ngoc Tuan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-10-30 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: K-means clustering ruby
14
+ email: tuansaker1412@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/kmeans.rb
20
+ homepage: https://rubygems.org/gems/nt_kmeans
21
+ licenses:
22
+ - MIT
23
+ metadata: {}
24
+ post_install_message:
25
+ rdoc_options: []
26
+ require_paths:
27
+ - lib
28
+ required_ruby_version: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ required_rubygems_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ requirements: []
39
+ rubyforge_project:
40
+ rubygems_version: 2.7.8
41
+ signing_key:
42
+ specification_version: 4
43
+ summary: K-means clustering ruby
44
+ test_files: []