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.
- checksums.yaml +7 -0
- data/lib/kmeans.rb +87 -0
- metadata +44 -0
checksums.yaml
ADDED
|
@@ -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
|
data/lib/kmeans.rb
ADDED
|
@@ -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: []
|