Guest User

Untitled

a guest
Apr 30th, 2021
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.11 KB | None | 0 0
  1. import numpy as np
  2. import math
  3.  
  4. # Matrix functions
  5.  
  6. def matrix(xs, ker):
  7.     '''Given vectors xs = (x_1, ..., x_n) and a symmetric kernel function ker
  8.    that satisfies ker(x, x) = 1, return the matrix (ker(x_j, x_k)).'''
  9.     n = len(xs)
  10.     g = np.zeros((n, n))
  11.     for i in range(n):
  12.         g[i,i] = 1
  13.         for j in range(i):
  14.             g[i,j] = ker(xs[i], xs[j])
  15.             g[j,i] = g[i,j]
  16.  
  17.     return g
  18.  
  19. def is_semipos(g):
  20.     '''Return True if the symmetric matrix g is semipositive.'''
  21.     return all((v >= 0 for v in np.linalg.eigvalsh(g)))
  22.  
  23. # Kernel functions
  24.  
  25. def symmetric(xs, ys):
  26.     '''"Kernel" that yields a random symmetric matrix with 1s on the diagonal
  27.    and whose entries satisfy 0 \leq b_{jk} \leq 1.'''
  28.     return np.random.rand()
  29.  
  30. # If 0 \leq xs \leq 1 and ys = (1, ..., 1) then K(xs, ys) = avg(xs).
  31. # If xs \leq ys, then K(xs, ys) = avg(xs) / avg(ys)
  32. def K(xs, ys):
  33.     '''(xs, ys) -> (sum min(x, y)) / (sum max(x, y))'''
  34.     a = 0
  35.     b = 0
  36.     for x, y in zip(xs, ys):
  37.         a += min(x, y)
  38.         b += max(x, y)
  39.     return a / b
  40.  
  41. # Linear-algebraic upper bound on the kernel K.
  42. def Kbound(xs, ys):
  43.     '''(x, y) -> 1 - |x-y|/|x+y|'''
  44.     a = 0
  45.     b = 0
  46.     for x, y in zip(xs, ys):
  47.         a += (x - y)**2
  48.         b += (x + y)**2
  49.  
  50.     return (math.sqrt(b) - math.sqrt(a)) / math.sqrt(b)
  51.  
  52. # Upper bound on Kbound
  53. def InnerProd(xs, ys):
  54.     '''(x, y) -> 2 \sqrt{<x, y>} / |x + y|'''
  55.     a = 0
  56.     b = 0
  57.     for x, y in zip(xs, ys):
  58.         a += x * y
  59.         b += (x + y)**2
  60.  
  61.     return 2 * math.sqrt(a) / math.sqrt(b)
  62.  
  63. if __name__ == '__main__':
  64.     n = 4
  65.     weight = 100
  66.  
  67.     #ker = symmetric
  68.     ker = K
  69.     #ker = Kbound
  70.     #ker = InnerProd
  71.  
  72.     pos = 0
  73.     neg = 0
  74.     i = 1
  75.     while True:
  76.         xs = weight * np.random.rand(n,n)
  77.         g = matrix(xs, ker)
  78.  
  79.         if not is_semipos(g):
  80.             neg += 1
  81.         else:
  82.             pos += 1
  83.  
  84.         if i % 500 == 0:
  85.             print("""
  86. ====
  87. Tried {} matrices
  88. - {} positive,
  89. - {} negative
  90. - P(positive) = {:.06f}
  91. """.strip().format(i, pos, neg, pos / i))
  92.  
  93.         i += 1
Advertisement
Add Comment
Please, Sign In to add comment