def debug(folders, n_components, r = None, max_dimension = 1): X,y = load_dataset(folders) p = Preprocess(n_components) X = p.fit_transform(X) if r is None: distances = PairwiseDistances(X.tolist()) distances = ExplicitDistances(distances) n_samples = len(X) r_candidates = sorted(set(np.array(distances.distances).flatten())) for r2 in r_candidates: print r2 cx = vietoris_rips(X.tolist(), max_dimension, r2) cords = mds_plot(X, y) lines_plot(cx, cords) plt.show() else: cx = vietoris_rips(X.tolist(), max_dimension, r) actual_max_dimension = len(max(cx, key=len)) - 1 for d in range(actual_max_dimension, 2, -1): sx_d = filter_simplices(cx, d) print "dimension", d, ":", len(sx_d), "simplices" for i, sx in enumerate(sx_d): print i, "..." cords = mds_plot(X, y) edges = list(combinations(sx, 2)) lines_plot(edges, cords, color=np.random.rand(3,)) plt.show()
def prepare_data(dataset, pca_n): global n_classes, X, y, pp, X_tr, X_inv n_classes = len(dataset) X, y = load_dataset(dataset) pp = Preprocess(pca_n) X_tr = pp.fit_transform(X) X_inv = pp.inverse_transform(X_tr)
ax = plt.axes([0., 0., 1., 1.]) color_set = 'bgrcmykw' colors = [color_set[int(t)] for t in target] plt.scatter(coords[:, 0], coords[:, 1], marker='o', s=200, c=colors) return coords def lines_plot(lines, cords, color='r'): lines = [line for line in lines if len(line) == 2] for line in lines: if len(line) != 2: continue [p1,p2] = line plt.plot([cords[p1, 0], cords[p2, 0]], [cords[p1, 1], cords[p2, 1]], color=color) if __name__ == '__main__': from dataset import load_dataset from preprocess import Preprocess, NoScaler from sklearn.preprocessing import StandardScaler X,Y = load_dataset(['../data/cup', '../data/paper', '../data/pen']) cords = mds_plot(X, Y) plt.savefig('./mds_no_preprocessing.png') p = Preprocess(0.75)#, NoScaler()) X = p.fit_transform(X) cords = mds_plot(X, Y, fig=2) plt.savefig('./mds_preprocessing.png') #lines = [[1,2],[2,3],[3,1]] #lines_plot(lines, cords) #plt.show()
from preprocess import Preprocess def vietoris_rips(points, skeleton, max, distances = None): """ Generate the Vietoris-Rips complex on the given set of points in 2D. Only simplexes up to dimension skeleton are computed. The max parameter denotes the distance cut-off value. The distances parameter can be used to precompute distances. """ if distances is None: distances = PairwiseDistances(points) rips = Rips(distances) simplices = Filtration() rips.generate(skeleton, max, simplices.append) return [list(simplex.vertices) for simplex in simplices] if __name__ == '__main__': from dataset import load_dataset x,y = load_dataset(['../data/tea_cup', '../data/spoon', '../data/apple']) p = Preprocess(0.7) x = p.fit_transform(x) # vietoris_rips expect a python list. x = x.tolist() s = vietoris_rips(x, 4, 500) print s