Advertisement
Guest User

Untitled

a guest
Mar 29th, 2020
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.59 KB | None | 0 0
  1.     def neighbour_joining(self):
  2.         D = self.arr.copy()
  3.         n = len(D)
  4.  
  5.         if n == 2:
  6.             return UnrootedTree((0, 1, D[0][1]))
  7.         if n < 2:
  8.             return UnrootedTree()
  9.  
  10.         edges = []
  11.         labels = [i for i in range(n)]
  12.         nextlabel = n
  13.  
  14.         while n > 2:
  15.             # neighbour-joining matrix constructed from the distance matrix D, Q1
  16.             sum = np.sum(D, axis=0)
  17.             Q = np.transpose(np.transpose(D * (n - 2) - sum) - sum)
  18.             np.fill_diagonal(Q, 0)
  19.  
  20.             # obtain row and col index of minimum element
  21.             (rowi, coli) = np.unravel_index(Q.argmin(), Q.shape)
  22.             if rowi > coli:
  23.                 (rowi, coli) = (coli, rowi)
  24.  
  25.             val = D[rowi, coli]
  26.  
  27.             joininglength1 = 0.5 * val + (1 / (2 * (n - 2))) * (np.sum(D[rowi]) - np.sum(D[coli]))
  28.             edges.append((labels[rowi], nextlabel, joininglength1))         # joininglength1
  29.             edges.append((labels[coli], nextlabel, val - joininglength1))   # val - joininglength1 = joininglength2
  30.  
  31.             # updaten van D matrix
  32.             D[rowi, :] = (D[rowi, :] + D[coli, :] - val) / 2
  33.             D[:, rowi] = D[rowi, :]
  34.  
  35.             labels[rowi] = nextlabel
  36.             del labels[coli]
  37.             D = np.delete(np.delete(D, coli, 0), coli, 1)
  38.  
  39.             nextlabel += 1
  40.             n -= 1
  41.  
  42.         (label1, label2) = (labels[0], labels[1])
  43.         if label1 > label2:
  44.             (label1, label2) = (label2, label1)
  45.         edges.append((label1, label2, D[0, 1]))
  46.  
  47.         return UnrootedTree(*edges)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement