def stageWise(self, xArr, yArr, eps=0.01, numIt=5000): xMat = xArr yMat = yArr #预测的变量的转置 yMean = mat.mean(yMat, 0) yMat = mat.lasso_sub(yMat, yMean) xMat = mat.regularize(xMat) m, n = mat.shape(xMat) print xMat, yMat ws = mat.create_one_mn(n, 1) # tempws = copy.deepcopy(ws) # lowestError = float("inf") # float("inf") #初始化当前迭代的最小误差表示为正无穷大 for a_weight in ws: lowestError = float("inf") #mat.assign(tempws, ws) forward = 1 old_rssE = mat.rssError(yMat, mat.multiply(xMat, ws)) a_weight[0] = a_weight[0] + eps * forward rssE = mat.rssError(yMat, mat.multiply(xMat, ws)) if rssE > old_rssE: forward = -1 for time in range(numIt): a_weight[0] = a_weight[0] + eps * forward new_error = mat.rssError(yMat, mat.multiply(xMat, ws)) if new_error > old_rssE: break old_rssE = new_error print "ws: \n", ws return ws for i in range(numIt): ##每一次迭代 for j in range(n): a1 = tempws[j][0] a2 = a1 # 遍历每一个特征 for sign in [-1, 1]: # 两次循环,计算增加或者减少该特征对误差的影响 tempws[j][0] = a1 b = float(eps * sign) tempws = mat.list_add(tempws, j, 0, b) yTest = mat.multiply(xMat, tempws) rssE = mat.rssError(yMat, yTest) # 平方误差,将矩阵转换成为数组Array if rssE < lowestError: lowestError = rssE a2 = tempws[j][0] mat.assign(ws, tempws) if a2 != a1: tempws[j][0] = a2 else: tempws[j][0] = a1
def kernal_ridge_train(self, X, y, alpha): m, n = mat.shape(X) B = mat.create_by_mn(m, 1, 1.0) X = mat.extend(X, B) X_K = self.Kernal(X) # 核函数映射,低维映射到高维 X_T = mat.transpose(X_K) X_T_X = mat.multiply(X_T, X_K) m, n = mat.shape(X_T_X) I = mat.eye(m) alp_I = mat.n_mat(alpha, I) _inverse = mat.inverse(mat.add(X_T_X, alp_I)) if _inverse == 0: self.isError = True print("逆矩阵不可求") return 0, 0 _w = mat.multiply(mat.multiply(_inverse, X_T), y) return _w, X
def predict_kernal_ridge(self, _new_X): if self.isError == True: return 0 _new_X = mat.create(_new_X) _new_X = mat.extend(_new_X, [[1.0]]) del self.old_X[0] # 删除第一条 self.old_X.append(_new_X[0]) # add a new one #print "self.old_X: ",self.old_X _X_K = self.Kernal(self.old_X) predict_y = mat.multiply(_X_K, self.w) #print "predict_y: ",predict_y return [predict_y[-1]]
def ridge_train(self, X, y, alpha): """ :param X: 输入的特征矩阵 :param y: 输入的标签 :param alpha: a complexity parameter that controls the amount of shrinkage :return: 模型的权重系数 w = (X.T*X+alpha*I).I*X.T*y """ m, n = mat.shape(X) B = mat.create_by_mn(m, 1, 1.0) X = mat.extend(X, B) # 将偏bias系数合并 X_T = mat.transpose(X) X_T_X = mat.multiply(X_T, X) m, n = mat.shape(X_T_X) I = mat.eye(m) alp_I = mat.n_mat(alpha, I) _inverse = mat.inverse(mat.add(X_T_X, alp_I)) if _inverse == 0: self.isError = True print("逆矩阵不可求") return 0 _w = mat.multiply(mat.multiply(_inverse, X_T), y) return _w
def predict_ridge(self, _new_X): if self.isError == True: return 0 _new_X = mat.create(_new_X) _new_X = mat.extend(_new_X, [[1.0]]) return mat.multiply(_new_X, self.w)
def lasso_predict(self, _new_X): _new_X = mat.create(_new_X) return mat.multiply(_new_X, self.w)