• 数学建模--逻辑回归算法的Python实现


    首先感谢CSDN上发布吴恩达的机器学习逻辑回归算法任务的各位大佬.

    通过大佬的讲解和代码才勉强学会.

    这篇文章也就是简单记录一下过程和代码.

    CSDN上写有关这类文章的大佬有很多,大家都可以多看一看学习学习.

    机器学习方面主要还是过程和方法.

    这篇文章只完成了线性可分方面的任务,由于时间关系,线性不可分的任务就没有去涉及.

    若要深入学习请看这位大佬的文章:https://blog.csdn.net/Cowry5/article/details/80247569

    目录

    1.数据初始化 

    2.数据绘图可视化

    3.设置关键函数

    4.利用fmin_tnc函数进行拟合

    5.计算模型正确率

    6.计算绘制图形的决策边界

    1.数据初始化 

    1. #%%
    2. #导入必要的库和函数
    3. import scipy.optimize as opt
    4. import time
    5. import numpy as np
    6. import pandas as pd
    7. import matplotlib.pyplot as plt
    8. from torch import sigmoid
    9. #获取数据并查阅
    10. path="C:\\Users\\Zeng Zhong Yan\\Desktop\\py.vs\\.vscode\\数学建模\\逻辑回归模型材料包\\逻辑回归数据1.txt"
    11. global data1
    12. data=pd.read_csv(path,names=['exam_1','exam_2','admitted'])
    13. data.head()

     

    2.数据绘图可视化

    1. #%%
    2. #利用.isin()函数将录取和未录取的样本分离
    3. positive = data[data['admitted'].isin([1])]
    4. negative = data[data['admitted'].isin([0])]
    5. #然后进行可视化绘图
    6. #fig用来绘制图像,ax绘制坐标系
    7. fig,ax=plt.subplots(figsize=(10,4))
    8. ax.scatter(positive['exam_1'], positive['exam_2'], s=30, c='b', marker='o', label='Admitted')
    9. ax.scatter(negative['exam_1'], negative['exam_2'], s=30, c='r', marker='x', label='Not Admitted')
    10. ax.legend()
    11. ax.set_xlabel('Exam_1 Score')
    12. ax.set_ylabel('Exam_2 Score')
    13. ax.figure.savefig('C:\\Users\\Zeng Zhong Yan\\Desktop\\py.vs\\.vscode\\数学建模\\逻辑回归模型材料包\\逻辑回归散点分布.png', dpi=500, bbox_inches='tight')
    14. #%%

     

    3.设置关键函数

    1. #创建逻辑回归类
    2. #创建激活函数
    3. def sigmoid(x):
    4. y=1 / (1 + np.exp(-x))
    5. return y
    6. #创建一个函数检查一下其是否能够正常工作
    7. """
    8. x1 = np.arange(-10, 10, 0.1)
    9. plt.plot(x1, sigmoid(x1), c='r')
    10. plt.show()
    11. """
    12. def cost(theta, X, y):
    13. first = (-y) * np.log(sigmoid(X @ theta))
    14. second = (1 - y)*np.log(1 - sigmoid(X @ theta))
    15. return np.mean(first - second)
    16. if 'Ones' not in data.columns:
    17. data.insert(0, 'Ones', 1)
    18. #创建一个训练训练集
    19. X = data.iloc[:, :-1].values
    20. y = data.iloc[:, -1].values
    21. theta = np.zeros(X.shape[1])
    22. print(X.shape, theta.shape, y.shape)# ((100, 3), (3,), (100,))
    23. def gradient(theta, X, y):
    24. return (X.T @ (sigmoid(X @ theta) - y))/len(X)

    4.利用fmin_tnc函数进行拟合

    1. #%%
    2. """
    3. 1.利用fmin_tnc函数进行拟合
    4. 2.或者利用minimize函数进行拟合,minimize中的method有很多的算法进行计算,设置method=xxx即可
    5. """
    6. result = opt.fmin_tnc(func=cost, x0=theta, fprime=gradient, args=(X, y))
    7. result
    8. # (array([-25.16131867, 0.20623159, 0.20147149]), 36, 0)

    5.计算模型正确率

    1. #%%
    2. """
    3. 我们将theta训练完毕之后我们就能够利用模型来测试学生是否能被录取了
    4. 以下就是我们构造函数的过程,设置h(x)
    5. 如果h(x)=>0.5->能够被录取
    6. 如果h(x)<0.5->不能够被录取
    7. 根据以上书写预测函数
    8. """
    9. """
    10. def predict(theta, X):
    11. probability = sigmoid(X@theta)
    12. for x in probability:
    13. if x>=0.5:
    14. return 1
    15. else:
    16. return 0
    17. """
    18. def predict(theta, X):
    19. probability = sigmoid(X@theta)
    20. return [1 if x >= 0.5 else 0 for x in probability] # return a list
    21. #%%
    22. """
    23. 预测之后我们可以查看以下模型预测的正确率如何
    24. """
    25. final_theta = result[0]
    26. predictions = predict(final_theta, X)
    27. correct = [1 if a==b else 0 for (a, b) in zip(predictions, y)]
    28. accuracy = sum(correct) / len(X)
    29. accuracy#0.89

    6.计算绘制图形的决策边界

    1. 面我们将设置模型的决策边界
    2. x1 = np.arange(130, step=0.1)
    3. x2 = -(final_theta[0] + x1*final_theta[1]) / final_theta[2]
    4. #%
    5. fig, ax = plt.subplots(figsize=(8,4))
    6. ax.scatter(positive['exam_1'], positive['exam_2'], c='b', label='Admitted')
    7. ax.scatter(negative['exam_1'], negative['exam_2'], s=50, c='r', marker='x', label='Not Admitted')
    8. ax.plot(x1, x2)
    9. ax.set_xlim(0, 130)
    10. ax.set_ylim(0, 130)
    11. ax.set_xlabel('x1')
    12. ax.set_ylabel('x2')
    13. ax.set_title('Decision Boundary')
    14. ax.figure.savefig('C:\\Users\\Zeng Zhong Yan\\Desktop\\py.vs\\.vscode\\数学建模\\逻辑回归模型材料包\\Decision Boundary.png', dpi=500, bbox_inches='tight')
    15. #%%

     

     

  • 相关阅读:
    orangepi香橙派 ubuntu安装RabbitMQ
    GMT 格式 转 标准日期格式
    JS基础----call和apply方法、代理Proxy的使用、JS中defineProperty用法
    win10进行安装使用11ie浏览器——遇到问题合集解决(执行一遍、问题解决)
    以爱情规律为例,浅谈三段式描述状态机
    Jackson和fastjson解决序列化时字段属性大小写改变的问题
    vue 在beforeRouteEnter中获取 this 和操作 data 中的数据
    将 CSS 过滤器与 SVG 一起使用的完整指南
    华为云如何购买并登录Windows弹性云服务器?
    手把手教你如何Vue项目打包dist文件并Tomcat发布【超级详细】
  • 原文地址:https://blog.csdn.net/m0_71819746/article/details/132696973