-
Notifications
You must be signed in to change notification settings - Fork 0
/
svm2.py
93 lines (58 loc) · 1.95 KB
/
svm2.py
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
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import style
style.use('ggplot')
data_dict ={1 : np.array[[1,6],[2,5],[7,8]] , 2 : np.array[[-1,7],[3,8],[8,4]]}
class svm:
def __init__(self, visualization = True):
self.visualization = visualization
self.colors = {1 : 'r', 2 : 'b'}
if visualization:
self.fig = plt.figure()
self.ax = self.fig.add_subplot(1,1,1)
def fit(self, data):
self.data = data
opt_dict = {}
all_data = []
for i in self.data:
for j in data[i]:
for k in j:
all_data.append(k)
self.max_value = max(all_data)
self.min_value = min(all_data)
all_data = none
step_sizes = [self.max_value*0.1, self.max_value*0.01, self.max_value*0.001]
latest_optimum = self.max_value*10
b_range_multiple = 5
b_range = 5
for i in step_sizes:
w = np.array(latest_optimum, latest_optimum)
optimized = False
while not optimized:
for b in np.arange(-1(self.max_value*b_range_multiple),(self.max_value*b_range_multiple), step = b_range):
for t in transform:
w_t = t*w
found_option = True
for a in self.data:
for c in self.data[a]:
yi =a
if not (yi*(np.dot(w_t,c) + self.b)):
found_option = False
if found_option:
opt_dict[np.linalg.norm(w_t)] = [w_t, b]
if w[0] < 0:
optimized = True
print('Optimized a step.')
else:
w = w - step
norms = sorted([n for n in opt_dict])
#||w|| : [w,b]
opt_choice = opt_dict[norms[0]]
self.w = opt_choice[0]
self.b = opt_choice[1]
latest_optimum = opt_choice[0][0]+step*2
def predict(self, features):
self.features = features
classifier = (np.sign(np.dot(np.array(features), self.w) + self.b))
return classifier