Exemple #1
0
    def test_predictTheAgeOfAnAbalone(self):
        """
        预测鲍鱼(abalone)的年龄
        abalone 数据集:0-99训练集,100-199测试集
        :return:
        """
        ab_x, ab_y = regression.loadDataSet('data/abalone.txt')
        y_hat01 = regression.lwlrTest(ab_x[0:99], ab_x[0:99], ab_y[0:99], 0.1)
        y_hat1 = regression.lwlrTest(ab_x[0:99], ab_x[0:99], ab_y[0:99], 1)
        y_hat10 = regression.lwlrTest(ab_x[0:99], ab_x[0:99], ab_y[0:99], 10)

        # 为了分析预测误差的大小,使用 rssError() 计算出这一指标
        print(regression.rssError(ab_y[0:99], y_hat01.T))
        print(regression.rssError(ab_y[0:99], y_hat1.T))
        print(regression.rssError(ab_y[0:99], y_hat10.T))
        # 根据以上输出可以发现较小的核将得到较低的误差,但使用过小的核会造成过拟合,对新数据不一定能达到最好的预测效果

        # 测试在新数据上的表现
        y_hat01 = regression.lwlrTest(ab_x[100:199], ab_x[0:99], ab_y[0:99],
                                      0.1)
        print(regression.rssError(ab_y[0:99], y_hat01.T))
        y_hat1 = regression.lwlrTest(ab_x[100:199], ab_x[0:99], ab_y[0:99], 1)
        print(regression.rssError(ab_y[0:99], y_hat1.T))
        y_hat10 = regression.lwlrTest(ab_x[100:199], ab_x[0:99], ab_y[0:99],
                                      10)
        print(regression.rssError(ab_y[0:99], y_hat10.T))
        # 根据以上输出会发现和大小等于10时的测试误差最小,但在训练集上的误差确实最大的

        # 接下来再与简单的线性回归做个比较
        ws = regression.standRegress(ab_x[0:99], ab_y[0:99])
        y_hat = np.mat(ab_x[100:199]) * ws
        print(regression.rssError(ab_y[100:199], y_hat.T.A))
Exemple #2
0
    def test_RidgeRegress(self):
        ab_x, ab_y = regression.loadDataSet('data/abalone.txt')
        ridge_weights = regression.ridgeTest(ab_x, ab_y)

        # 对岭回归的回归系数变化可视化
        # λ非常小时,系数与普通回归一样;λ非常大时,所有回归系数缩减为 0。
        # 可以在中间某处找到使得预测的结果最好的 λ 值
        fig = plt.figure()
        ax = fig.add_subplot(111)
        ax.plot(ridge_weights)
        plt.show()
Exemple #3
0
    def test_drawRegression(self):
        import matplotlib.pyplot as plt
        x_arr, y_arr = regression.loadDataSet('data/ex0.txt')
        ws = regression.standRegress(x_arr, y_arr)
        x_mat = np.mat(x_arr)
        y_mat = np.mat(y_arr)
        fig = plt.figure()
        ax = fig.add_subplot(111)
        ax.scatter(x_mat[:, 1].flatten().A[0], y_mat.T[:, 0].flatten().A[0])

        x_copy = x_mat.copy()
        x_copy.sort(0)
        y_hat = x_copy * ws
        ax.plot(x_copy[:, 1], y_hat)
        plt.show()
Exemple #4
0
    def test_lwlr(self):
        x_arr, y_arr = regression.loadDataSet('data/ex0.txt')
        # 对单点进行估计
        print(regression.lwlr(x_arr[0], x_arr, y_arr, 1.0))
        print(regression.lwlr(x_arr[0], x_arr, y_arr, 0.001))

        # 对所有点进行估计(依据不同 k 值),并查看对应 y_hat 的拟合效果
        x_mat = np.mat(x_arr)
        srt_ind = x_mat[:, 1].argsort(0)
        x_sort = x_mat[srt_ind][:, 0, :]

        fig = plt.figure()
        ax = fig.add_subplot(221)
        # k=1.0,拟合效果与最小二乘的拟合效果差不多
        y_hat = regression.lwlrTest(x_arr, x_arr, y_arr, 1.0)
        ax.plot(x_sort[:, 1], y_hat[srt_ind])
        ax.scatter(x_mat[:, 1].flatten().A[0],
                   np.mat(y_arr).T.flatten().A[0],
                   s=2,
                   c='red')

        ax = fig.add_subplot(222)
        # k=0.01,根据拟合效果可以挖出数据的潜在规律
        y_hat = regression.lwlrTest(x_arr, x_arr, y_arr, 0.01)
        ax.plot(x_sort[:, 1], y_hat[srt_ind])
        ax.scatter(x_mat[:, 1].flatten().A[0],
                   np.mat(y_arr).T.flatten().A[0],
                   s=2,
                   c='red')

        ax = fig.add_subplot(223)
        # k=0.003,考虑了过多的噪声,进而导致出现过拟合现象
        y_hat = regression.lwlrTest(x_arr, x_arr, y_arr, 0.003)
        ax.plot(x_sort[:, 1], y_hat[srt_ind])
        ax.scatter(x_mat[:, 1].flatten().A[0],
                   np.mat(y_arr).T.flatten().A[0],
                   s=2,
                   c='red')

        plt.show()
Exemple #5
0
 def test_loadDataSet(self):
     x_arr, y_arr = regression.loadDataSet('data/ex0.txt')
     print(x_arr[0:2])
     ws = regression.standRegress(x_arr, y_arr)
     print(ws)
Exemple #6
0
 def test_stageWise(self):
     x_arr, y_arr = regression.loadDataSet('data/abalone.txt')
     print(regression.stageWise(x_arr, y_arr, 0.001, 5000))