Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def neighbour_joining(self):
- D = self.arr.copy()
- n = len(D)
- if n == 2:
- return UnrootedTree((0, 1, D[0][1]))
- if n < 2:
- return UnrootedTree()
- edges = []
- labels = [i for i in range(n)]
- nextlabel = n
- while n > 2:
- # neighbour-joining matrix constructed from the distance matrix D, Q1
- sum = np.sum(D, axis=0)
- Q = np.transpose(np.transpose(D * (n - 2) - sum) - sum)
- np.fill_diagonal(Q, 0)
- # obtain row and col index of minimum element
- (rowi, coli) = np.unravel_index(Q.argmin(), Q.shape)
- if rowi > coli:
- (rowi, coli) = (coli, rowi)
- val = D[rowi, coli]
- joininglength1 = 0.5 * val + (1 / (2 * (n - 2))) * (np.sum(D[rowi]) - np.sum(D[coli]))
- edges.append((labels[rowi], nextlabel, joininglength1)) # joininglength1
- edges.append((labels[coli], nextlabel, val - joininglength1)) # val - joininglength1 = joininglength2
- # updaten van D matrix
- D[rowi, :] = (D[rowi, :] + D[coli, :] - val) / 2
- D[:, rowi] = D[rowi, :]
- labels[rowi] = nextlabel
- del labels[coli]
- D = np.delete(np.delete(D, coli, 0), coli, 1)
- nextlabel += 1
- n -= 1
- (label1, label2) = (labels[0], labels[1])
- if label1 > label2:
- (label1, label2) = (label2, label1)
- edges.append((label1, label2, D[0, 1]))
- return UnrootedTree(*edges)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement