def fastICAall(data,g,dg,resize = True): nIC = data.shape[1] data = center(data) data = mix.whiten(data) w = np.array([random_w(nIC) for i in range(nIC)]) epsilon = 0 w_temp = np.zeros_like(w) while(not converge(epsilon,1e-5)): print("Epsilon is currently ", epsilon) for i in range(nIC): w_temp[i] = newton_step(w[i],data,g,dg) w_temp[i] /= np.linalg.norm(w_temp[i]) W = sym_decorrelation(w_temp) epsilon = max(abs(np.diag(np.dot(W, w.T)))) w = np.copy(W) # recover unmixed signals dataest = np.array([np.dot(data,w[i]) for i in range(nIC)]) if resize: dataest = dataest.T*(256- 127)/np.max(np.abs(dataest), axis = 1) return (dataest + 127).T else: return dataest
def fastICA(data,g,dg): data = center(data) data = mix.whiten(data) w = random_w(data.shape[1]) # epsilon is used to know if w converges epsilon = 0 nbsteps = 0 # max nb of steps. Used to test different functons ( used because # the algorithm might diverge) MAX = 100 while(not converge(epsilon,1e-20) and nbsteps <= MAX): w_temp = newton_step(w,data,g,dg) w_temp /= np.linalg.norm(w_temp) epsilon = np.dot(w,w_temp) w = w_temp nbsteps += 1 # if algorithm diverged , the nbsteps is negative if nbsteps > MAX: nbsteps = -1 return np.dot(data,w),np.dot(data,np.array([w[1],-w[0]])),nbsteps