当前位置:   article > 正文

掌握Logistic回归_logistic回归实验

logistic回归实验

01.什么是逻辑回归

如下图,它属于机器学习 – 监督学习 – 分类 – 逻辑回归,主要解决二分类问题,用来表示某件事情发生的可能性。

关于二分类问题又是什么呢?

比如:

  • 瓜是好瓜坏瓜可能性(是、不是)
  • 你买一件衣服的可能性(买、不买)
  • 你去上课的可能性(去、不去)

 

02. 概念

Logistic回归分析也用于研究影响关系,即X对于Y的影响情况。Y为定类数据,X可以是定量数据或定类数据。

Logistic回归和线性回归最大的区别在于,Y的数据类型。线性回归分析的因变量Y属于定量数据,而Logistic回归分析的因变量Y属于分类数据

03.监督学习的2个任务:回归、分类

监督学习有2个主要的任务:

  1. 回归
  2. 分类

回归:预测连续的、具体的数值。

分类:对各种事物分门别类,用于离散型预测。 

04.逻辑回归原理

逻辑回归的公式是:y = w_1*x_1 + w_2*x_2 + ... + w_n*x_n +bias    (bias为偏置,可以理解为一元函数的y=ax+b中的b)

大概流程如下:

 

05.案例 - 简单数据集的逻辑分类

数据集如下

  1. 0.089392 -0.715300 1
  2. 1.825662 12.693808 0
  3. 0.197445 9.744638 0
  4. 0.126117 0.922311 1
  5. -0.679797 1.220530 1
  6. 0.677983 2.556666 1
  7. 0.761349 10.693862 0
  8. -2.168791 0.143632 1
  9. 1.388610 9.341997 0
  10. 0.317029 14.739025 0

数据集加载

  1. def load_data_set(file_path):
  2. """
  3. 加载dataset文件夹中的数据集
  4. :param file_path: 文件目录
  5. :return:
  6. """
  7. data_matrix = []
  8. label_list = []
  9. with open(file_path, "r") as file:
  10. for line in file:
  11. line = line.strip().split()
  12. data_matrix.append([float(line[0]), float(line[1]), 1.0])
  13. label_list.append(int(line[2]))
  14. return np.array(data_matrix), np.array(label_list)

sigmoid函数

  1. def sigmoid(values):
  2. """
  3. sigmoid函数
  4. :param values: 列表类型 分别计算出值封装成列表返回
  5. :return: 1.0 / (1.0 + np.exp(-values))
  6. """
  7. return 1.0 / (1.0 + np.exp(-values))

梯度上升训练

  1. def gradAscent(data_matrix, label_matrix, alpha=0.001, n=500):
  2. """
  3. 开始使用梯度上升训练weights
  4. :param data_matrix: np.array()类型 数据集矩阵
  5. :param label_matrix: np.array()类型 标签矩阵
  6. :param alpha: 学习率
  7. :param n: 训练次数
  8. :return: weights
  9. """
  10. # label_matrix转为列向量
  11. label_matrix = np.mat(label_matrix).transpose()
  12. # 初始化weights = [3,1] = 1
  13. weights = np.ones(shape=(len(data_matrix[0]), 1))
  14. for i in range(n):
  15. # [n,1] = [n,m] * [m,1] 矩阵乘法
  16. # 要把data_matrix从np.array 转为np.mat才能相乘
  17. values = np.mat(data_matrix) * weights
  18. # 激活函数后得到类别
  19. activated_values = sigmoid(values)
  20. # 计算误差 (以2元函数举例)
  21. error_list = label_matrix - activated_values
  22. print(activated_values,error_list)
  23. # 调整权重weights
  24. # 因为偏移量error_list是(5,1)所以要把data_matrix转为(3,5),最终得到每个权重需要调整的量
  25. weights = weights + alpha * data_matrix.transpose() * error_list
  26. return np.array(weights)

用matplotlib画图

  1. def paint(data_matrix, label_matrix, weights):
  2. """
  3. 画出数据集和拟合直线
  4. :param data_matrix:
  5. :param label_matrix:
  6. :param weights:
  7. :return:
  8. """
  9. point_0 = []
  10. point_1 = []
  11. plt.figure(figsize=(5, 5), dpi=200)
  12. # 遍历把两类点分离出来
  13. for i in range(len(label_matrix)):
  14. if label_matrix[i] == 1:
  15. point_1.append(data_matrix[i])
  16. else:
  17. point_0.append(data_matrix[i])
  18. point_0 = np.array(point_0)
  19. point_1 = np.array(point_1)
  20. # 把离散点画出来
  21. plt.scatter(x=point_0[:, 0], y=point_0[:, 1], c="red")
  22. plt.scatter(x=point_1[:, 0], y=point_1[:, 1], c="blue")
  23. # 画拟合曲线
  24. x = np.arange(-3.0, 3.0, 0.1)
  25. y = (-weights[2] - weights[0] * x) / weights[1]
  26. plt.plot(x, y)
  27. plt.show()

拟合对比

 

 

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号