zoukankan      html  css  js  c++  java
  • 机器学习——圆形线性回归——注释就是笔记

    import pandas as pd
    import numpy as np
    from matplotlib import pyplot as plt
    from sklearn.linear_model import LogisticRegression
    from sklearn.metrics import accuracy_score
    
    
    def f(x):
        a = theta4
        b = theta5 * X1_new + theta2
        c = theta0 + theta1 * x + theta3 * x * x
        X2_new_boundary1 = (-b + np.sqrt(b * b - 4 * a * c)) / (2 * a)
        X2_new_boundary2 = (-b - np.sqrt(b * b - 4 * a * c)) / (2 * a)
        return X2_new_boundary1, X2_new_boundary2
    
    
    if __name__ == '__main__':
        '''
               逻辑回归
           '''
        # load the data
        data = pd.read_csv('')
        data.head()
        '''
            第一次查看所有数据
        '''
        # visualize the data
        fig1 = plt.figure()
        plt.scatter(data.loc[:, 'example1'], data.loc[:, 'example2'])  # .......导入数据
        plt.title('example1-example2')  # 设置表名
        plt.xlabel('example1')  # 设置X坐标轴
        plt.ylabel('example2')  # 设置Y坐标轴
        plt.show()  # 查看图像
        '''
            第二次查看带有正确错误标识的数据
        '''
        # add label mask
        mask = data.loc[:, 'pass'] == 1
        fig2 = plt.figure()
        passed = plt.scatter(data.loc[:, 'example1'][mask], data.loc[:, 'example2'][mask])  # .......导入数据
        failed = plt.scatter(data.loc[:, 'example1'][~mask], data.loc[:, 'example2'][~mask])  # .......导入数据
        plt.title('example1-example2')  # 设置表名
        plt.xlabel('example1')  # 设置X坐标轴
        plt.ylabel('example2')  # 设置Y坐标轴
        plt.legend((passed, failed), ('passed', 'failed'))
        plt.show()  # 查看图像
    
        # define X,Y
        X = data.drop(['pass'], axis=1)
        y = data.loc[:, 'pass']
        y.head  # 查看数据
        X1 = data.loc[:, 'example1']
        X2 = data.loc[:, 'example2']
    
        X1_2 = X1 * X1
        X2_2 = X2 * X2
        X1_X2 = X1 * X2
        X_new = {'X1': X1, 'X2': X2, 'X1_2': X1_2, 'X2_2': X2_2, 'X1_X2': X1_X2}
        X_new = pd.DataFrame(X_new)
        print(X_new)
    
        # 创建新的训练
        LR2 = LogisticRegression()
        LR2.fit(X_new, y)
        y2_predict = LR2.predict(X_new)  # 预测
        accuracy2 = accuracy_score(y, y2_predict)
        print(accuracy2)
        X1_new = X1.sort_values()  # 从小到大排序
        theta0 = LR2.intercept_
        theta1, theta2, theta3, theta4, theta5 = LR2.coef_[0][0], LR2.coef_[0][1], LR2.coef_[0][2], LR2.coef_[0][3], 
                                                 LR2.coef_[0][4]
        # 制作曲线参数
        a = theta4
        b = theta5 * X1_new + theta2
        c = theta0 + theta1 * X1_new + theta3 * X1_new * X1_new
        X2_new_boundary = (-b + np.sqrt(b * b - 4 * a * c)) / (2 * a)
    
        fig4 = plt.figure()
        passed = plt.scatter(data.loc[:, 'example1'][mask], data.loc[:, 'example2'][mask])  # .......导入数据
        failed = plt.scatter(data.loc[:, 'example1'][~mask], data.loc[:, 'example2'][~mask])  # .......导入数据
        plt.plot(X1_new, X2_new_boundary)
        plt.title('example1-example2')  # 设置表名
        plt.xlabel('example1')  # 设置X坐标轴
        plt.ylabel('example2')  # 设置Y坐标轴
        plt.legend((passed, failed), ('passed', 'failed'))
        plt.show()  # 查看图像
        '''
            如果在这里使用二阶线性回归,那么只有一半的数据能被隔离开
            也就是说忽略了X的第二种结果
            接下来就是加上这种结果的第二条曲线
        '''
    
        '''
            正确方法
        '''
    
    
        # define f(x)   --> 8
    
    
        X2_new_boundary1 = []
        X2_new_boundary2 = []
        for x in X1_new:
            X2_new_boundary1.append(f(x)[0])
            X2_new_boundary2.append(f(x)[1])
        print(X2_new_boundary1, X2_new_boundary2)
    
        fig5 = plt.figure()
        passed = plt.scatter(data.loc[:, 'example1'][mask], data.loc[:, 'example2'][mask])  # .......导入数据
        failed = plt.scatter(data.loc[:, 'example1'][~mask], data.loc[:, 'example2'][~mask])  # .......导入数据
        plt.plot(X1_new, X2_new_boundary1)
        plt.plot(X1_new, X2_new_boundary2)
        plt.title('example1-example2')  # 设置表名
        plt.xlabel('example1')  # 设置X坐标轴
        plt.ylabel('example2')  # 设置Y坐标轴
        plt.legend((passed, failed), ('passed', 'failed'))
        plt.show()  # 查看图像
        '''
            你会发现虽然你补上了另外一个X值,但是两个X对应的曲线并没有连在一起
            
            这是因为数之间本来就是有间隔的,不全,所以连不上,这时候需要我们把他补全 
        '''
    
        X1_range = [-0.9 + x / 10000 for x in range(0, 19000)]
        X1_range = np.array(X1_range)
        X2_new_boundary1 = []
        X2_new_boundary2 = []
        for x in X1_new:
            X2_new_boundary1.append(f(x)[0])
            X2_new_boundary2.append(f(x)[1])
        fig5 = plt.figure()
        passed = plt.scatter(data.loc[:, 'example1'][mask], data.loc[:, 'example2'][mask])  # .......导入数据
        failed = plt.scatter(data.loc[:, 'example1'][~mask], data.loc[:, 'example2'][~mask])  # .......导入数据
        plt.plot(X1_range, X2_new_boundary1)
        plt.plot(X1_range, X2_new_boundary2)
        plt.title('example1-example2')  # 设置表名
        plt.xlabel('example1')  # 设置X坐标轴
        plt.ylabel('example2')  # 设置Y坐标轴
        plt.legend((passed, failed), ('passed', 'failed'))
        plt.show()  # 查看图像
  • 相关阅读:
    svn上传文件钩子
    linux服务器版svn安装
    csp-s模拟55
    csp-s模拟54
    csp-s模拟53
    csp-s模拟52
    csp-s模拟51
    csp-s模拟50
    csp-s模拟49
    csp-s模拟48
  • 原文地址:https://www.cnblogs.com/chaogehahaha/p/15438625.html
Copyright © 2011-2022 走看看