Advertisement
Guest User

Untitled

a guest
Oct 18th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.63 KB | None | 0 0
  1. from cvxopt.solvers import qp
  2. from cvxopt.base import matrix
  3. import numpy as np, pylab, random, math
  4.  
  5.  
  6. #kernel function
  7. def linear_kernel(x, y):
  8.     return np.dot(x,y) + 1
  9.  
  10. def radial_kernel(x, y):
  11.     sigma=3
  12.     return math.exp(-np.linalg.norm(((x[0] - y[0]), x[1] - y[1])) ** 2 / math.pow(2 * sigma, 2))
  13.  
  14. def polynomial_kernel(x, y):
  15.     p = 5;
  16.     return math.pow(np.dot(x, y) + 1, p)
  17.  
  18. def indicator(point, alpha, t, x, kernel):
  19.     result = 0;
  20.     for i in range(len(alpha)):
  21.         result += alpha[i] * t[i] * kernel(x[i], point)
  22.     return result
  23.  
  24. def createP(t, x, kernel):
  25.     P = np.zeros( shape=(len(t), len(t)) )
  26.     for i, ti in enumerate(t):
  27.         for j, tj in enumerate(t):
  28.             P[i][j] = ti * tj * kernel(x[i], x[j])
  29.  
  30.     return P
  31.  
  32. #create random dataset and store it in data
  33. np.random.seed(100)
  34. classA = [(random.normalvariate(-1.5, 1), random.normalvariate(0.5, 1), 1.0)
  35.           for i in range(5)] + [(random.normalvariate(1.5, 1),
  36.                                  random.normalvariate(0.5, 1), 1.0) for i in range(5)]
  37. classB = [(random.normalvariate(0.0, 0.5),
  38.            random.normalvariate(-1.5, 0.5), -1.0) for i in range(10)]
  39. data = classA + classB
  40. random.shuffle(data)
  41.  
  42. #plot dataset
  43. pylab.hold(True)
  44. pylab.plot([p[0] for p in classA], [p[1] for p in classA], 'bo')
  45. pylab.plot([p[0] for p in classB], [p[1] for p in classB], 'ro')
  46. pylab.show()
  47.  
  48. #calculate alpha for given dataset using given kernel
  49. def find_alpha(data, kernel):
  50.     tt = []
  51.     Xx = []
  52.     for d in data:
  53.         tt.append(d[2])
  54.         Xx.append((d[0], d[1]))
  55.  
  56.     N = len(data)
  57.  
  58.     q = np.full(N, -1)
  59.     h = np.zeros(N)
  60.     G = np.zeros((N, N))
  61.     np.fill_diagonal(G, -1)
  62.     P = createP(tt, Xx, kernel)
  63.     q = q.astype(np.double)
  64.  
  65.     r = qp(matrix(P), matrix(q), matrix(G), matrix(h))
  66.     tmp = list(r['x'])
  67.  
  68.     alpha = []
  69.     t = []
  70.     x = []
  71.     for i in range(len(tmp)):
  72.         x.append(Xx[i])
  73.         t.append(tt[i])
  74.         if tmp[i] < 0.00001:
  75.             alpha.append(0)
  76.         else:
  77.             alpha.append(tmp[i])
  78.  
  79.     return (x, t, alpha)
  80.  
  81. (x, t, alpha) = find_alpha(data, linear_kernel)
  82.  
  83. #plot dataset with classifier
  84. xrange = np.arange(-4, 4, 0.05)
  85. yrange = np.arange(-4, 4, 0.05)
  86. grid = matrix([[indicator([xd, yd], alpha, t, x, linear_kernel)
  87.               for yd in yrange]
  88.               for xd in xrange])
  89. pylab.contour(xrange, yrange, grid,
  90.               (-1.0, 0.0, 1.0),
  91.               colors=('red', 'black', 'blue'),
  92.               linewidths=(1, 3, 1))
  93. pylab.plot([p[0] for p in classA], [p[1] for p in classA], 'bo')
  94. pylab.plot([p[0] for p in classB], [p[1] for p in classB], 'ro')
  95. pylab.show()
  96.  
  97. (x, t, alpha) = find_alpha(data, radial_kernel)
  98.  
  99. xrange = np.arange(-4, 4, 0.05)
  100. yrange = np.arange(-4, 4, 0.05)
  101. grid = matrix([[indicator([xd, yd], alpha, t, x, radial_kernel)
  102.               for yd in yrange]
  103.               for xd in xrange])
  104. pylab.contour(xrange, yrange, grid,
  105.               (-1.0, 0.0, 1.0),
  106.               colors=('red', 'black', 'blue'),
  107.               linewidths=(1, 3, 1))
  108. pylab.plot([p[0] for p in classA], [p[1] for p in classA], 'bo')
  109. pylab.plot([p[0] for p in classB], [p[1] for p in classB], 'ro')
  110. pylab.show()
  111.  
  112. #calculate alpha with slack for given dataset using given kernel
  113. def find_alpha_with_slack(data, kernel, C):
  114.     tt = []
  115.     Xx = []
  116.     for d in data:
  117.         tt.append(d[2])
  118.         Xx.append((d[0], d[1]))
  119.  
  120.     N = len(data)
  121.  
  122.     q = np.full(N, -1)
  123.     q = q.astype(np.double)
  124.  
  125.     h = np.concatenate((np.zeros(N), np.full(N, C)))
  126.     G1 = np.zeros((N,N))
  127.     G2 = np.zeros((N,N))
  128.     np.fill_diagonal(G1, -1)
  129.     np.fill_diagonal(G2, 1)
  130.     G = np.concatenate((G1, G2))
  131.  
  132.     P = createP(tt, Xx, kernel)
  133.  
  134.  
  135.     r = qp(matrix(P), matrix(q), matrix(G), matrix(h))
  136.     tmp = list(r['x'])
  137.  
  138.     alpha = []
  139.     t = []
  140.     x = []
  141.     for i in range(len(tmp)):
  142.         x.append(Xx[i])
  143.         t.append(tt[i])
  144.         if tmp[i] < 0.00001 or tmp[i] > C:
  145.             alpha.append(0)
  146.         else:
  147.             alpha.append(tmp[i])
  148.  
  149.     return (x, t, alpha)
  150.  
  151. (x, t, alpha) = find_alpha_with_slack(data, polynomial_kernel, 2)
  152.  
  153. xrange = np.arange(-4, 4, 0.05)
  154. yrange = np.arange(-4, 4, 0.05)
  155. grid = matrix([[indicator([xd, yd], alpha, t, x, polynomial_kernel)
  156.               for yd in yrange]
  157.               for xd in xrange])
  158. pylab.contour(xrange, yrange, grid,
  159.               (-1.0, 0.0, 1.0),
  160.               colors=('red', 'black', 'blue'),
  161.               linewidths=(1, 3, 1))
  162. pylab.plot([p[0] for p in classA], [p[1] for p in classA], 'bo')
  163. pylab.plot([p[0] for p in classB], [p[1] for p in classB], 'ro')
  164. pylab.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement