| 68 | |
| 69 | # hard labels |
| 70 | def DBI2(X, R): |
| 71 | N, D = X.shape |
| 72 | _, K = R.shape |
| 73 | |
| 74 | # get sigmas, means first |
| 75 | sigma = np.zeros(K) |
| 76 | M = np.zeros((K, D)) |
| 77 | assignments = np.argmax(R, axis=1) |
| 78 | for k in range(K): |
| 79 | Xk = X[assignments == k] |
| 80 | M[k] = Xk.mean(axis=0) |
| 81 | # assert(Xk.mean(axis=0).shape == (D,)) |
| 82 | n = len(Xk) |
| 83 | diffs = Xk - M[k] |
| 84 | sq_diffs = diffs * diffs |
| 85 | sigma[k] = np.sqrt( sq_diffs.sum() / n ) |
| 86 | |
| 87 | |
| 88 | # calculate Davies-Bouldin Index |
| 89 | dbi = 0 |
| 90 | for k in range(K): |
| 91 | max_ratio = 0 |
| 92 | for j in range(K): |
| 93 | if k != j: |
| 94 | numerator = sigma[k] + sigma[j] |
| 95 | denominator = np.linalg.norm(M[k] - M[j]) |
| 96 | ratio = numerator / denominator |
| 97 | if ratio > max_ratio: |
| 98 | max_ratio = ratio |
| 99 | dbi += max_ratio |
| 100 | return dbi / K |
| 101 | |
| 102 | |
| 103 | |