| import numpy as np | |
| import scipy | |
| def grassmann_distance(U, V): | |
| """ Compute geodesic distance for grassmann manifold | |
| Args: | |
| U, V: A matrix of bases of a linear subspace | |
| Return: | |
| grassmann distance | |
| See Also: | |
| scipy.linalg.subspace_angles | |
| Example: | |
| >>> U = np.array([[1,0,0], [1,1,1]]) | |
| >>> V = np.array([[0,1,0], [1,1,1]]) | |
| >>> grassmann_distance(U, V) | |
| """ | |
| # compute the canonical angles | |
| s = scipy.linalg.subspace_angles(U.T, V.T) | |
| # grassmann distance | |
| return sum(s * s) | |
| def grassmann_similarity(x, y): | |
| return -grassmann_distance(x, y) |