def fit(self, epoch=10): A = self.Mat data = A.data X = self.X while epoch: m = absmax(X) X = [i / m for i in X] X = GaussEq(A, X) epoch -= 1 AX = [sum([A_i[j] * X_j for j, X_j in enumerate(X)]) for A_i in data] m1 = sum(dot_vec(AX, X)) / sum(dot_vec(X, X)) self.X = X return m1
def fit(self, B): if isinstance(B, matrix): B = B.c(range(B.size[0]), 0) n = len(B) L = self.L U = self.U y = [0 for i in xrange(n)] x = [0 for i in xrange(n)] for i in xrange(n): rang = range(i) y[i] = B[i] - sum(dot_vec(L.c([i], rang), y[:i])) for i in xrange(n - 1, -1, -1): rang = range(i + 1, n) x[i] = (y[i] - sum(dot_vec(U.c([i], rang), x[(i + 1):]))) / U.data[i][i] return x
def GaussEq(A, B): if isinstance(B, matrix): B = B.c(range(B.size[0]), 0) B = copy.deepcopy(B) size = A.size data = copy.deepcopy(A.data) row_arg = range(size[0]) if size[0] != size[1]: print('error\n') return ValueError size = size[0] for i in row_arg[:-1]: vec = matrix(data).c(range(i, size), i) max_index = i + argabsmax(vec) data[max_index], data[i] = data[i], data[max_index] B[max_index], B[i] = B[i], B[max_index] for index in range(i + 1, size): try: param = data[index][i] / data[i][i] data[index] = add_vec(data[index], data[i], -param) B[index] += B[i] * (-param) except: print('error: a singular matrix') return ValueError row_arg.reverse() x = [0 for i in range(size)] for i in row_arg: x[i] = (B[i] - sum(dot_vec(x[i:], data[i][i:]))) / data[i][i] return x
def fit(self, epoch=10): data = self.Mat.data X = self.X while epoch: m = absmax(X) X = [i / m for i in X] X = [ sum([A_i[j] * X_j for j, X_j in enumerate(X)]) for A_i in data ] epoch -= 1 #get rayleigh div AX = [sum([A_i[j] * X_j for j, X_j in enumerate(X)]) for A_i in data] m1 = sum(dot_vec(AX, X)) / sum(dot_vec(X, X)) #m2=absmax(X) self.X = X return m1 #,m2
def LU(A): size = A.size if size[0] != size[1]: return ValueError L = matrix(size, eye=True) U = matrix(size, eye=False) size = size[0] aij = A.data for i in range(0, size): rang = range(0, i) for r in range(i, size): U.data[i][r] = aij[i][r] - sum( dot_vec(L.c([i], rang), U.c(rang, [r]))) for r in range(i + 1, size): L.data[r][i] = (aij[r][i] - sum( dot_vec(L.c([r], rang), U.c(rang, [i])))) / U.data[i][i] return L.data, U.data
def Chol(A): size = A.size if size[0] != size[1]: return ValueError if not check_symmetrical(A): print 'Not symmetrical!\n' return ValueError aij = A.data L = matrix(size, eye=False) size = size[0] for j in range(size): try: L[j][j] = math.sqrt(aij[j][j] - sum(dot_vec(L[j][:j], L[j][:j]))) except: print 'error:Not positive!\n' for i in range(j + 1, size): try: L[i][j] = (aij[i][j] - sum(dot_vec(L[i][:j], L[j][:j]))) / L[j][j] except: print 'error:Not positive!\n' return L
def vecmean(vecs): summa = reduce(add_vec, vecs) n = len(vecs) ret = dot_vec(1 / n, summa) return ret