def testDigits(kTrup=('rbf', 10)): trainingDigits = 'F:\\panrui\\我的桌面\\learning file\\machinelearninginaction\\Ch06\\trainingDigits' dataArr, labelArr = loadImages(trainingDigits) b, alphas = smoP(dataArr, labelArr, 200, 0.0001, 10000, kTrup) datMat = mat(dataArr) labelMat = mat(labelArr).transpose() svInd = nonzero(alphas.A > 0)[0] sVs = datMat[svInd] labelSV = labelMat[svInd] print("there are %d Support Vectors " % shape(sVs)[0]) m, n = shape(datMat) errorCount = 0 for i in range(m): kernelEval = kernelTrans(sVs, datMat[i, :], kTrup) predict = kernelEval.T * multiply(labelSV, alphas[svInd]) + b if sign(predict) != sign(labelArr[i]): errorCount += 1 print("the training error is: %f" % (float(errorCount) / m)) dataArr, labelArr = loadImages('testDigits') errorCount = 0 datMat = mat(dataArr) labelMat = mat(labelArr).transpose() m, n = shape(datMat) for i in range(m): kernelEval = kernelTrans(sVs, datMat[i, :], kTrup) predict = kernelEval.T * multiply(labelSV, alphas[svInd]) + b if sign(predict) != sign(labelArr[i]): errorCount += 1 print("the training error is: %f" % (float(errorCount) / m))
def kernelTrans(X, A, kTup): m, n = shape(X) K = mat(zeros((m, 1))) if kTup[0] == 'lin': K = X * A.T elif kTup[0] == 'rbf': for j in range(m): deltaRow = X[j, :] - A K[j] = deltaRow * deltaRow.T K = exp(K / (-1 * kTup[1]**2)) else: raise NameError('that Kernel is not recognized') return K
def haar_inverse(image, dim=2): ''' Apply haar inverse transformation. :param image: square matrix :param dim: dimension :return: None ''' P = permutation_matrix(dim) T = haar_matrix(dim) image[0:dim, 0:dim] = T.T * P.T * M.asmatrix(image[0:dim, 0:dim]) * P * T if dim == M.shape(image)[0]: return haar_inverse(image, dim * 2)
def haar_forward(image, dim=None, recursive=True): ''' Apply haar transformation to image. :param image: square matrix :param dim: dimension :param recursive: apply recursively :return: None ''' if dim is None: dim = M.shape(image)[0] if dim == 1: # base case return P = permutation_matrix(dim) T = haar_matrix(dim) image[0:dim, 0:dim] = P * T * M.asmatrix(image[0:dim, 0:dim]) * T.T * P.T if recursive: haar_forward(image, dim / 2)
def QuadProg(H, c, Ae, be, Ai, bi, x0): epsilon = 1e-9 err = 1e-6 k = 0 x = x0 n = len(x) kmax = 1e2 ne = len(be) ni = len(bi) index = mat.ones((ni, 1)) for i in range(0, ni): if Ai[i, :] * x > bi[i] + epsilon: index[i] = 0 while k <= kmax: Aee = [] #if ne > 0: # Aee = Ae AeeList = [] if ne > 0: AeeList.append(Ae) for j in range(0, ni): if index[j] > 0: AeeList.append(Ai[j, :]) #Aee = mat.vstack((Aee, Ai[j,:])) if len(AeeList) == 0: Aee = [] else: Aee = mat.vstack(AeeList) m1, n1 = mat.shape(Aee) gk = H * x + c dk, lamk = qsubp(H, gk, Aee, mat.zeros((m1, 1))) if np.linalg.norm(dk) <= err: y = 0.0 if len(lamk) > ne: jk = np.argmin(lamk[ne:len(lamk)]) y = lamk[jk] if y >= 0: exitflag = 0 else: exitflag = 1 for i in range(0, ni): if index[i] and (ne + sum(index[0:i])) == jk: index[i] = 0 break #k += 1 else: exitflag = 1 alpha = 1.0 tm = 1.0 for i in range(0, ni): if index[i] == 0 and Ai[i, :] * dk < 0: tmm = (bi[i] - Ai[i, :] * x) / (Ai[i, :] * dk) tm1 = abs(tmm[0, 0]) if tm1 < tm: tm = tm1 ti = i alpha = min(alpha, abs(tm)) x = x + alpha * dk if tm < 1: index[ti] = 1 if exitflag == 0: break k += 1 print k return x
def QuadProg(H, c, Ae, be, Ai, bi, x0): epsilon = 1e-9 err = 1e-6 k = 0 x = x0 n = len(x) kmax = 1e2 ne = len(be) ni = len(bi) index = mat.ones((ni, 1)) for i in range(0, ni): if Ai[i,:] * x > bi[i] + epsilon: index[i] = 0 while k <= kmax: Aee = [] #if ne > 0: # Aee = Ae AeeList = [] if ne > 0: AeeList.append(Ae) for j in range(0, ni): if index[j] > 0: AeeList.append(Ai[j, :]) #Aee = mat.vstack((Aee, Ai[j,:])) if len(AeeList) == 0: Aee = [] else: Aee = mat.vstack(AeeList) m1, n1 = mat.shape(Aee) gk = H * x + c dk, lamk = qsubp(H, gk, Aee, mat.zeros((m1, 1))) if np.linalg.norm(dk) <= err: y = 0.0 if len(lamk) > ne: jk = np.argmin(lamk[ne:len(lamk)]) y = lamk[jk] if y >= 0: exitflag = 0 else: exitflag = 1 for i in range(0, ni): if index[i] and (ne + sum(index[0:i])) == jk: index[i] = 0; break; #k += 1 else: exitflag = 1 alpha = 1.0 tm = 1.0 for i in range(0, ni): if index[i] == 0 and Ai[i, :] * dk < 0: tmm = (bi[i] - Ai[i, :] * x) / (Ai[i, :] * dk) tm1 = abs(tmm[0,0]) if tm1 < tm: tm = tm1; ti = i; alpha = min(alpha, abs(tm)) x = x + alpha * dk if tm < 1: index[ti] = 1 if exitflag == 0: break k += 1 print k return x