예제 #1
0
    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
예제 #2
0
 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
예제 #3
0
 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]]
예제 #4
0
 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
예제 #5
0
 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)
예제 #6
0
 def lasso_predict(self, _new_X):
     _new_X = mat.create(_new_X)
     return mat.multiply(_new_X, self.w)