手把手教你用Python实现感知机

实现

  1. Python代码

    import numpy as np
    import matplotlib
    matplotlib.use('TkAgg')
    from matplotlib import pyplot as plt
    
    
    # 载入数据
    def load_data_set(file_name):
        fr = open(file_name)
        data_set = []
        label = []
        for line in fr.readlines():
            line_data = line.strip().split('\t')
            data_set.append([float(line_data[0]), float(line_data[1])])
            label.append(float(line_data[2]))
            data_mat = np.mat(data_set)
            data_mat_new = np.insert(data_mat, 2, values=1, axis=1)
        return data_mat_new, label
    
    
    # 感知机分类学习
    def precep_classify(data_mat, label_mat, eta=1):
        omega = np.mat(np.zeros(3))
        m = np.shape(data_mat)[0]
        error_data = True
        while error_data:
            error_data = False
            for i in range(m):
                judge = label_mat[i] * (np.dot(omega, data_mat[i].T))
                if judge <= 0:
                    error_data = True
                    omega = omega + np.dot(label_mat[i], data_mat[i])
        return omega
    
    
    # 测试
    def precep_test(test_data_mat, test_label_mat, omega):
        m = np.shape(test_data_mat)[0]
        error = 0.0
        for i in range(m):
            classify_num = np.dot(test_data_mat[i], omega.T)
            if classify_num > 0:
                class_ = 1
            else:
                class_ = -1
            if class_ != test_label_mat[i]:
                error += 1
        print error/m
    
    
    # 画图
    def plot(data_mat, label_mat, omega):
        fig = plt.figure()
        ax = fig.add_subplot(111)
        X = data_mat[:, 0]
        Y = data_mat[:, 1]
    
        for i in range(len(label_mat)):
            if label_mat[i] > 0:
                ax.scatter(X[i].tolist(), Y[i].tolist(), color='red')
            else:
                ax.scatter(X[i].tolist(), Y[i].tolist(), color='green')
        o1 = omega[0, 0]
        o2 = omega[0, 1]
        o3 = omega[0, 2]
        x = np.linspace(3, 6, 50)
        y = (-o1 * x - o3) / o2
        ax.plot(x, y)
        plt.show()
    
    
    # 主函数
    def preceptron_main():
        file_name = 'testSet.txt'
        # 载入数据文件,得到输入矩阵和标记列表
        data_mat, label_mat = load_data_set(file_name)
        # 分类学习得到参数
        omega = precep_classify(data_mat[:80], label_mat[:80])
        # 用部分数据测试
        precep_test(data_mat[80:], label_mat[80:], omega)
        plot(data_mat, label_mat, omega)
    
    
    if __name__ == "__main__":
    
  2. 实验数据

    3.542485    1.977398    -1
    3.018896    2.556416    -1
    7.551510    -1.580030   1
    2.114999    -0.004466   -1
    8.127113    1.274372    1
    7.108772    -0.986906   1
    8.610639    2.046708    1
    2.326297    0.265213    -1
    3.634009    1.730537    -1
    0.341367    -0.894998   -1
    3.125951    0.293251    -1
    2.123252    -0.783563   -1
    0.887835    -2.797792   -1
    7.139979    -2.329896   1
    1.696414    -1.212496   -1
    8.117032    0.623493    1
    8.497162    -0.266649   1
    4.658191    3.507396    -1
    8.197181    1.545132    1
    1.208047    0.213100    -1
    1.928486    -0.321870   -1
    2.175808    -0.014527   -1
    7.886608    0.461755    1
    3.223038    -0.552392   -1
    3.628502    2.190585    -1
    7.407860    -0.121961   1
    7.286357    0.251077    1
    2.301095    -0.533988   -1
    -0.232542   -0.547690   -1
    3.457096    -0.082216   -1
    3.023938    -0.057392   -1
    8.015003    0.885325    1
    8.991748    0.923154    1
    7.916831    -1.781735   1
    7.616862    -0.217958   1
    2.450939    0.744967    -1
    7.270337    -2.507834   1
    1.749721    -0.961902   -1
    1.803111    -0.176349   -1
    8.804461    3.044301    1
    1.231257    -0.568573   -1
    2.074915    1.410550    -1
    -0.743036   -1.736103   -1
    3.536555    3.964960    -1
    8.410143    0.025606    1
    7.382988    -0.478764   1
    6.960661    -0.245353   1
    8.234460    0.701868    1
    8.168618    -0.903835   1
    1.534187    -0.622492   -1
    9.229518    2.066088    1
    7.886242    0.191813    1
    2.893743    -1.643468   -1
    1.870457    -1.040420   -1
    5.286862    -2.358286   1
    6.080573    0.418886    1
    2.544314    1.714165    -1
    6.016004    -3.753712   1
    0.926310    -0.564359   -1
    0.870296    -0.109952   -1
    2.369345    1.375695    -1
    1.363782    -0.254082   -1
    7.279460    -0.189572   1
    1.896005    0.515080    -1
    8.102154    -0.603875   1
    2.529893    0.662657    -1
    1.963874    -0.365233   -1
    8.132048    0.785914    1
    8.245938    0.372366    1
    6.543888    0.433164    1
    -0.236713   -5.766721   -1
    8.112593    0.295839    1
    9.803425    1.495167    1
    1.497407    -0.552916   -1
    1.336267    -1.632889   -1
    9.205805    -0.586480   1
    1.966279    -1.840439   -1
    8.398012    1.584918    1
    7.239953    -1.764292   1
    7.556201    0.241185    1
    9.015509    0.345019    1
    8.266085    -0.230977   1
    8.545620    2.788799    1
    9.295969    1.346332    1
    2.404234    0.570278    -1
    2.037772    0.021919    -1
    1.727631    -0.453143   -1
    1.979395    -0.050773   -1
    8.092288    -1.372433   1
    1.667645    0.239204    -1
    9.854303    1.365116    1
    7.921057    -1.327587   1
    8.500757    1.492372    1
    1.339746    -0.291183   -1
    3.107511    0.758367    -1
    2.609525    0.902979    -1
    3.263585    1.367898    -1
    2.912122    -0.202359   -1
    1.731786    0.589096    -1
    2.387003    1.573131    -1
    
  3. 结果
    手把手教你用Python实现感知机_第1张图片

你可能感兴趣的:(机器学习)