-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathweek11.py
More file actions
94 lines (75 loc) · 2.7 KB
/
Copy pathweek11.py
File metadata and controls
94 lines (75 loc) · 2.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import math
import matplotlib.pyplot as plot
import numpy as np
def loadData(filename):
lines = open(filename + '.txt').read().split('\n')
x = []
y = []
for line in lines:
record = line.split(' ')
x.append(float(record[0]))
y.append(float(record[1]))
return np.array(x, dtype=float), np.array(y, dtype=float)
def generateData(n, a, b, variance):
x = np.arange(n)
delta = np.random.uniform(-variance, variance, size=(n,))
# delta = np.random.normal(0, variance, size=(n,))
y = a * x + b + delta
return x, y
def getLineFromFormula(x, y):
sumXX, sumXY, sumX, sumY = 0, 0, 0, 0
n = len(x)
for i in range(n):
sumXX += x[i] ** 2
sumXY += x[i] * y[i]
sumX += x[i]
sumY += y[i]
a = (n * sumXY - sumX * sumY) / (n * sumXX - sumX ** 2)
b = (sumY - a * sumX) / n
return a, b
def analyse(filename):
x, y = loadData(filename)
# x, y = generateData(100, 1/5, 20, 10)
a, b = getLineFromFormula(x, y)
plot.scatter(x, y)
plot.plot(x, a * x + b, color="red")
plot.title(str(a) + 'x + ' + str(b))
plot.show()
def getDistance(x1, y1, x2, y2):
return math.sqrt(((x1 - x2) ** 2 + (y1 - y2) ** 2))
def kMeans(filename, n):
x, y = loadData(filename)
means = {}
cm = plot.get_cmap('gist_rainbow')
minX, maxX, minY, maxY = min(x), max(x), min(y), max(y)
for i in range(n):
means[i] = {'x': np.random.randint(minX, maxX),
'y': np.random.randint(minY, maxY),
'pointsX': [],
'pointsY': [],
'color': cm(1. * i / n)}
for i in range(20):
for mean in means.values():
mean['pointsX'].clear()
mean['pointsY'].clear()
# assigning points to mean
for j in range(len(x)):
shortestDistance = max(maxX, maxY)
for k in range(len(means.values())):
centreX, centreY = means[k]['x'], means[k]['y']
distance = math.sqrt((x[j] - centreX) ** 2 + (y[j] - centreY) ** 2)
if distance < shortestDistance:
shortestDistance = distance
mean = means[k]
mean['pointsX'].append(x[j])
mean['pointsY'].append(y[j])
# finding new mean of cluster
for mean in means.values():
mean['x'] = sum(mean['pointsX']) / len(mean['pointsX'])
mean['y'] = sum(mean['pointsY']) / len(mean['pointsY'])
for mean in means.values():
plot.scatter(mean['pointsX'], mean['pointsY'], color=mean['color'])
plot.scatter(mean['x'], mean['y'], color=(0, 0, 0))
plot.show()
# analyse('faithful')
kMeans('faithful', 4)