def __init__(self):
     '''to copy the samples and make normalization'''
     Linear_Regression.__init__(self)
     #to copy the samples
     self.tempX = copy.copy(self.dataX)
     self.tempY = copy.copy(self.dataY)
     #normalization
     self.tempX[1] = nm.min_max_normalization(self.tempX[1], self.xMin,
                                              self.xMax)
     self.tempY = nm.min_max_normalization(self.tempY, self.yMin, self.yMax)
Beispiel #2
0
 def __init__(self, fileX, fileY):
     """
     初始化
     1_读取 training data,并处理数据。
     2_初始化参数
     :param trainDataFile: 训练数据文件名
     :param testDataFile:  测试数据文件名
     """
     # 1_读取 training data,并处理
     # 1.1_读取
     self.dataNum, self.dataX, dataY = self.load_dataFile(fileX, fileY)
     self.inputNum = self.dataX.shape[1]
     self.outputNum = int(np.max(dataY) + 1)
     self.hiddenNode_num = 5
     # 1.2_处理
     self.xMin = self.dataX.min(axis=0)
     self.xMax = self.dataX.max(axis=0)
     self.dataX = nm.min_max_normalization(self.dataX, self.xMin, self.xMax)
     self.dataX = self.dataX.T
     self.dataY = np.zeros((self.outputNum, self.dataNum))
     for i in range(dataY.size):
         self.dataY[int(dataY[i]), i] = 1
     # 2_初始化参数 -> 默认 hidden 层有 5 个神经元
     self.w_ih = np.random.random((self.inputNum, self.hiddenNode_num))
     self.b_h = np.random.random((self.hiddenNode_num, ))
     self.w_ho = np.random.random((self.hiddenNode_num, self.outputNum))
     self.t_o = np.random.random((self.outputNum, ))  #theta_output
    def gd_process_and_show(self):
        #init paraments & picture
        itrNum = 50  #iterator num
        lr = 0.01  # lr is learning rate
        #plt.ion()
        plt.ioff()
        lossY = []
        stepX = []

        #process
        for i in range(itrNum):
            self.thetas = self.thetas - lr * self.error_feature()
            plt.cla()
            #绘制 loss 图
            plt.subplot(121)
            stepX.append(i)
            lossY.append(self.cost_function(self.tempX, self.tempY))
            plt.plot(stepX, lossY)
            #绘制拟合图
            plt.subplot(122)
            plt.xlim(self.xMin, self.xMax + 1)
            plt.ylim(self.yMin, self.yMax)
            plt.plot(
                self.dataX[1],
                nm.reverse_mm_normalization(self.tempY[:, 0], self.yMin,
                                            self.yMax), 'ro')
            plt.plot(
                self.dataX[1],
                nm.reverse_mm_normalization(
                    self.hypothesis(self.tempX.T)[:, 0], self.yMin, self.yMax))
            plt.pause(0.001)
        plt.ioff()
        plt.show()

        #get ans
        print('gradient descent 的答案为:')
        print('最后得到的参数为:', self.thetas[:, 0])
        tempX = 14 / 13
        ans = self.hypothesis(np.array([1, tempX]))[0]
        ans = nm.reverse_mm_normalization(ans, self.yMin, self.yMax)
        print('2014年的预测结果为:', ans)
Beispiel #4
0
 def plot_testResult(self, testXFile, testYFile=''):
     """绘制分类图,由数据点和分类线构成。
     注意:
         1_在画图之前先对数据预处理
         2_数据点用红蓝两色来区分不同的分类
     :param testXFile: 测试数据 input 的文件名
     :param testYFile: 测试数据 output 的文件名
     :return: 无
     """
     if testYFile != '':
         # 预处理
         dataNum, dataX, tempDataY = self.load_dataFile(
             testXFile, testYFile)
         dataX = nm.min_max_normalization(dataX, self.xMin, self.xMax)
         dataX = dataX.T
         dataY = np.zeros((self.outputNum, dataNum))
         for i in range(tempDataY.size):
             dataY[int(tempDataY[i]), i] = 1
         xL = 0
         xR = 1  # 分别代表散点图 x 轴的左右范围
         yL = 0
         yH = 1  # 分别代表散点图 y 轴的下上范围
         mk = ['+', '^', 'o']
         cs = ['b', 'r', 'k']  # 分别代表散点标记、散点颜色的取值可能
         plt.title('ann test')
         plt.xlabel("x1")
         plt.ylabel("x2")
         # 1_绘图
         # 1.1_绘制背景
         tempRange = 100  # 代表要将 x、y 轴分为多少段
         meshX, meshY = np.meshgrid(np.linspace(xL, xR, tempRange),
                                    np.linspace(yL, yH, tempRange))
         # 注意 meshX、meshY 都是二维的
         meshData = np.vstack((meshX.flatten(), meshY.flatten()))
         meshPredic = self.calculateY(meshData)[1]
         meshClass = self.get_preClass(meshPredic)[0]
         plt.contourf(meshX, meshY, meshClass.reshape(meshX.shape))
         # 1.2_绘制散点
         pltTool = np.argmax(dataY, axis=0)
         for j in range(dataNum):
             plt.scatter(dataX[0, j],
                         dataX[1, j],
                         marker=mk[pltTool[j]],
                         c=cs[pltTool[j]])
         plt.show()
         # 2_计算准确率
         yPre = self.calculateY(dataX)[1]
         accuracy = self.get_accuracy(yPre, dataY)
         return accuracy
 def plot_testResult(self, testXFile, testYFile=''):
     """绘制分类图,由数据点和分类线构成。
     注意:
         1_在画图之前先对数据预处理
         2_数据点用红蓝两色来区分不同的分类
     :param testXFile: 测试数据 input 的文件名
     :param testYFile: 测试数据 output 的文件名
     :return: 无
     """
     # 初始化画图所用参数
     mk = ['+', '^', 'o']
     cs = ['k', 'r', 'b']  # 分别代表背景颜色、散点标记、散点颜色的取值可能
     xL = 0
     xR = 1  # 分类图 x 轴的左右边界
     yL = 0
     yH = 1  # 分类图 y 轴的下上边界
     partNum = 100  # 将分类图的每个轴分多少部分
     if testYFile != '':
         dataNum, dataX, dataY = self.load_dataFile(testXFile, testYFile)
         dataX = nm.min_max_normalization(dataX, self.xMin, self.xMax)
         add = np.ones((dataNum, 1))
         dataX = np.hstack([add, dataX]).T
         # 绘制分类图
         plt.title('muti-perceptron test')
         plt.xlabel('x1')
         plt.ylabel('x2')
         # 1_绘制背景
         meshX, meshY = np.meshgrid(np.linspace(xL, xR, partNum),
                                    np.linspace(yL, yH, partNum))
         add = np.ones((meshX.size, ))
         meshData = np.vstack((add, meshX.flatten()))
         meshData = np.vstack((meshData, meshY.flatten()))
         meshPrdic = self.hypothesis(meshData)[1]
         plt.contourf(meshX, meshY, meshPrdic.reshape(meshX.shape))
         # 2_绘制散点 & 打印准确率
         for i in range(dataNum):
             tempC = int(dataY[i])
             plt.scatter(dataX[1, i],
                         dataX[2, i],
                         marker=mk[tempC],
                         c=cs[tempC])
         plt.show()
         # 3_计算准确率
         classAns = self.hypothesis(dataX)[1]
         return self.get_accuracy(classAns, dataY)
Beispiel #6
0
 def __init__(self, fileX, fileY):
     """初始化
     1_读取 training data,并处理数据。
     2_初始化参数
     :param trainDataFile: 训练数据文件名
     :param testDataFile:  测试数据文件名
     :param clfNum: classfication num
     """
     # 1_读取 training data,并处理
     # 1.1_读取
     self.dataNum, self.dataX, self.dataY = self.load_dataFile(fileX, fileY)
     # 1.2_处理
     self.xMin = self.dataX.min(axis=0)
     self.xMax = self.dataX.max(axis=0)
     self.dataX = nm.min_max_normalization(self.dataX, self.xMin, self.xMax)
     addDataX = np.ones((self.dataNum, 1))
     self.dataX = np.hstack((addDataX, self.dataX)).T
     # 2_初始化参数
     self.thetas = np.zeros((self.dataX.shape[0], ))
Beispiel #7
0
 def __init__(self, fileX, fileY):
     """导入数据并做处理;创建参数向量并设初值;创建相关参数
     :param fileName: traning data 所在目录(不包含文件名)
     """
     #导入数据并做处理
     #导入数据: 样本个数,input 数据,label 数据
     self.dataNum, self.dataX, self.dataY = self.load_data(fileX, fileY)
     self.xMin = self.dataX.min(axis=0)
     self.xMax = self.dataX.max(axis=0)
     #处理
     #1.1_归一化
     self.dataX = nm.min_max_normalization(self.dataX, self.xMin, self.xMax)
     #1.2_为每个 input 增加一个值为 1 的元素,方便之后与 参数做内积。并得到参数维度
     self.dataX = commonTools.join_biasTerm(self.dataNum, self.dataX)
     #1.3_转换 xData,使其中的每个 input 向量均为列向量
     self.dataX = self.dataX.T
     #2.3_转换 yData,使其变成列向量。
     #因为 yData 是一维的,无法转置,所以先要更改其维度再进行转置操作。
     self.dataY = np.atleast_2d(self.dataY).T
     #初始化参数
     self.thetas = np.zeros((self.dataX.shape[0], 1))
 def plot_testResult(self,testFileX,testFileY = ''):
     """绘制与打印预测结果(包括一个分类图和一个准确率)
     注意:
         分情况讨论是否给出 testY 的两种情况。
     :param testX: 预测数据 input 的文件名
     :param testY: 预测数据 output 的文件名
     :return: 无
     """
     #初始化画图所用参数
     mk = ['+', '^', 'o']; cs = ['k', 'r', 'b']
                                 # 分别代表背景颜色、散点标记、散点颜色的取值可能
     xL = 0; xR = 1              #分类图 x 轴的左右边界
     yL = 0; yH = 1              #分类图 y 轴的下上边界
     partNum = 100               #将分类图的每个轴分多少部分
     if testFileY != '':
         dataNum,dataX,dataY = self.load_dataFile(testFileX,testFileY)
         dataX = nm.min_max_normalization(dataX,self.xMin,self.xMax)
         add = np.ones((dataNum,1))
         dataX = np.hstack([add,dataX]).T
         dataY = np.atleast_2d(dataY).T
         #绘制分类图
         plt.title('softmax test')
         plt.xlabel('x1'); plt.ylabel('x2')
         #1_绘制背景
         meshX,meshY = np.meshgrid(np.linspace(xL,xR,partNum),
                                   np.linspace(yL,yH,partNum))
         add = np.ones((meshX.size,))
         meshData = np.vstack((add,meshX.flatten()))
         meshData = np.vstack((meshData,meshY.flatten()))
         meshPrdic = self.get_classResult(meshData)
         plt.contourf(meshX,meshY,meshPrdic.reshape(meshX.shape))
         #2_绘制散点 & 打印准确率
         for i in range(dataNum):
             tempC = int(dataY[i,0])
             plt.scatter(dataX[1,i],dataX[2,i],
                         marker = mk[tempC],c = cs[tempC])
         hAns = self.get_classResult(dataX)
         plt.show()
         return self.get_accuracy(hAns,dataY)
Beispiel #9
0
 def plot_testResult(self, testXFile, testYFile=''):
     """绘制分类图,由数据点和分类线构成。
     注意:
         1_在画图之前先对数据预处理
         2_数据点用红蓝两色来区分不同的分类
     :param testXFile: 测试数据 input 的文件名
     :param testYFile: 测试数据 output 的文件名
     :return: 无
     """
     if testYFile != '':
         #预处理
         dataNum, dataX, dataY = self.load_data(testXFile, testYFile)
         dataX = nm.min_max_normalization(dataX, self.xMin, self.xMax)
         add = np.ones((dataX.shape[0], 1))
         dataX = np.hstack((add, dataX)).T
         dataY = np.atleast_2d(dataY).T
         # 1_绘制数据点
         plt.title('logistic test')
         plt.xlabel("x1")
         plt.ylabel("x2")
         for j in range(dataX.shape[1]):
             if dataY[j, 0] == 1:
                 plt.plot(dataX[1, j], dataX[2, j], 'ro')
             else:
                 plt.plot(dataX[1, j], dataX[2, j], 'bo')
         # 2_绘制分类线
         # 思路:
         # 因为模型的预测结果是通过比较sigmoid函数的输出与0.5得到的。
         # 而当sigmoid函数output为0.5时,w0 + w1*x1 + w2*x2 = 0。
         # 又因为图像的x、y轴分别为参数 x1、x2。
         # 所以,分类线可以表示成 x2 = -(w0 + w1*x1)/w2
         x = np.linspace(-0.5, 1.2, 50)
         y = -(self.thetas[0][0] +
               self.thetas[1][0] * x) / self.thetas[2][0]
         plt.plot(x, y, 'k')
         # 3_计算准确率
         hAns = self.hypothesis(dataX)
         plt.show()
         return self.get_accuracy(hAns, dataY)
Beispiel #10
0
 def plot_testResult(self, testXFile, testYFile=''):
     """绘制分类图,由数据点和分类线构成。
     注意:
         1_在画图之前先对数据预处理
         2_数据点用红蓝两色来区分不同的分类
     :param testXFile: 测试数据 input 的文件名
     :param testYFile: 测试数据 output 的文件名
     :return: 无
     """
     if testYFile != '':
         # 预处理
         dataNum, dataX, dataY = self.load_dataFile(testXFile, testYFile)
         dataX = nm.min_max_normalization(dataX, self.xMin, self.xMax)
         add = np.ones((dataX.shape[0], 1))
         dataX = np.hstack((add, dataX)).T
         # 1_绘制数据点
         plt.title('perceptron test')
         plt.xlabel("x1")
         plt.ylabel("x2")
         for j in range(dataX.shape[1]):
             if dataY[j] == 1:
                 plt.plot(dataX[1, j], dataX[2, j], 'ro')
             else:
                 plt.plot(dataX[1, j], dataX[2, j], 'bo')
         # 2_绘制分类线
         # 思路:
         # 超平面函数,w0 + w1*x1 + w2*x2 = 0。
         # 又因为图像的x、y轴分别为参数 x1、x2。
         # 所以,分类线可以表示成 x2 = -(w0 + w1*x1)/w2
         x = np.linspace(0, 1, 50)
         y = -(self.thetas[0] + self.thetas[1] * x) / self.thetas[2]
         plt.plot(x, y, 'k')
         # 3_计算准确率
         classAns = self.hypothesis(dataX)
         plt.show()
         return self.get_accuracy(classAns, dataY)