赞
踩
如下图,它属于机器学习 – 监督学习 – 分类 – 逻辑回归,主要解决二分类问题,用来表示某件事情发生的可能性。
关于二分类问题又是什么呢?
比如:
Logistic回归分析也用于研究影响关系,即X对于Y的影响情况。Y为定类数据,X可以是定量数据或定类数据。
Logistic回归和线性回归最大的区别在于,Y的数据类型。线性回归分析的因变量Y属于定量数据,而Logistic回归分析的因变量Y属于分类数据。
监督学习有2个主要的任务:
回归:预测连续的、具体的数值。
分类:对各种事物分门别类,用于离散型预测。
逻辑回归的公式是:y = w_1*x_1 + w_2*x_2 + ... + w_n*x_n +bias (bias为偏置,可以理解为一元函数的y=ax+b中的b)
大概流程如下:
数据集如下
- 0.089392 -0.715300 1
- 1.825662 12.693808 0
- 0.197445 9.744638 0
- 0.126117 0.922311 1
- -0.679797 1.220530 1
- 0.677983 2.556666 1
- 0.761349 10.693862 0
- -2.168791 0.143632 1
- 1.388610 9.341997 0
- 0.317029 14.739025 0
数据集加载
- def load_data_set(file_path):
- """
- 加载dataset文件夹中的数据集
- :param file_path: 文件目录
- :return:
- """
- data_matrix = []
- label_list = []
- with open(file_path, "r") as file:
- for line in file:
- line = line.strip().split()
- data_matrix.append([float(line[0]), float(line[1]), 1.0])
- label_list.append(int(line[2]))
- return np.array(data_matrix), np.array(label_list)
- def sigmoid(values):
- """
- sigmoid函数
- :param values: 列表类型 分别计算出值封装成列表返回
- :return: 1.0 / (1.0 + np.exp(-values))
- """
- return 1.0 / (1.0 + np.exp(-values))
- def gradAscent(data_matrix, label_matrix, alpha=0.001, n=500):
- """
- 开始使用梯度上升训练weights
- :param data_matrix: np.array()类型 数据集矩阵
- :param label_matrix: np.array()类型 标签矩阵
- :param alpha: 学习率
- :param n: 训练次数
- :return: weights
- """
- # label_matrix转为列向量
- label_matrix = np.mat(label_matrix).transpose()
- # 初始化weights = [3,1] = 1
- weights = np.ones(shape=(len(data_matrix[0]), 1))
- for i in range(n):
- # [n,1] = [n,m] * [m,1] 矩阵乘法
- # 要把data_matrix从np.array 转为np.mat才能相乘
- values = np.mat(data_matrix) * weights
- # 激活函数后得到类别
- activated_values = sigmoid(values)
- # 计算误差 (以2元函数举例)
- error_list = label_matrix - activated_values
- print(activated_values,error_list)
- # 调整权重weights
- # 因为偏移量error_list是(5,1)所以要把data_matrix转为(3,5),最终得到每个权重需要调整的量
- weights = weights + alpha * data_matrix.transpose() * error_list
- return np.array(weights)
- def paint(data_matrix, label_matrix, weights):
- """
- 画出数据集和拟合直线
- :param data_matrix:
- :param label_matrix:
- :param weights:
- :return:
- """
- point_0 = []
- point_1 = []
-
- plt.figure(figsize=(5, 5), dpi=200)
- # 遍历把两类点分离出来
- for i in range(len(label_matrix)):
- if label_matrix[i] == 1:
- point_1.append(data_matrix[i])
- else:
- point_0.append(data_matrix[i])
- point_0 = np.array(point_0)
- point_1 = np.array(point_1)
- # 把离散点画出来
- plt.scatter(x=point_0[:, 0], y=point_0[:, 1], c="red")
- plt.scatter(x=point_1[:, 0], y=point_1[:, 1], c="blue")
-
- # 画拟合曲线
- x = np.arange(-3.0, 3.0, 0.1)
- y = (-weights[2] - weights[0] * x) / weights[1]
- plt.plot(x, y)
-
- plt.show()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。