机器学习入门-逻辑回归算法

梯度下降: 对theta1, theta2, theta3 分别求最快梯度下降的方向,然后根据给定的学习率,进行theta1, theta2, theta3的参数跟新

假定目标函数 J(theta) = 1/2m * np.sum(h(theta) - y)^2 / len(X)

梯度下降的策略分为3种,

批量梯度下降: 每次迭代输入全部的数据, 效果好,但耗时

随机梯度下降: 每次输入一个样本,时间快,迭代效果差

小批量梯度下降:每次输入部分数据,效果好,时间适中,一般都是16, 32, 64

逻辑回归: 是一种典型的二分类,也可以是多分类,主要在于cost的定义

逻辑回归的概率似然函数: h(theta)**y * (1-h(theta)) ** (1-y)

逻辑回归的对数似然函数 l(theta) = 1/ m * np.sum(y*logh(theta) - (1-y)*log(1-h(theta)))  # 及损失函数

依据theta对损失函数进行求导,求出梯度下降的方向,用于跟新参数

grad = 1/m np.sum(h(theta) - y) * xj    xj表示的是一列特征

theta = theta - grad

接下来进行代码分析

需要完成的函数

主要函数
sigmoid  #将数值映射为概率

model   # 构造h(theta) 即 sigmoid(np.dot(X, theta.T))

cost     # 计算损失值及对数似然函数  1/ m * np.sum(-y*logh(theta) - (1-y)*log(1-h(theta)))

gradient  # 用于计算梯度  grad = 1/m np.sum(h(theta) - y) * xj

descent  # 用于进行参数更新

runExpe  # 进行画图操作

predict  # 进行结果预测

次要函数
shuffledata  # 用于进行数据清洗

StopCriter   # 停止情况判断

代码:

import numpy as np
import pandas as pd
import time
import matplotlib.pyplot as plt

pdData = pd.read_csv(‘data/LogiReg_data.txt‘, header=None, names=[‘exam1‘, ‘exam2‘, ‘admitted‘])

# 插入一列全1的数据, 为了和theta0进行匹配
pdData.insert(0, ‘ones‘, 1)
# 将数据转换的为numpy形式
orig_data = pdData.as_matrix()
# 获得列的维度
cols = orig_data.shape[1]
# 分出样本
X = orig_data[:, :cols-1]
# 分出标签
y = orig_data[:, cols-1:]
# 初始化theta
theta = np.zeros([1, 3])
# 定义sigmoid函数
def sigmoid(z):
    return (1 / (1 + np.exp(-z)))
# 定义H(theta)
def model(X, theta):
    return sigmoid(np.dot(X, theta.T))

# 定义损失函数即对数似然函数   1/ m * np.sum(-y*logh(theta) - (1-y)*log(1-h(theta)))
def cost(X, y, theta):
    left = np.multiply(-y, np.log(model(X, theta)))
    right = np.multiply((1-y), np.log(1-model(X, theta)))
    return np.sum(left - right) / len(X)
# 定义数据洗牌的函数
def shuffle_data(data):
    # 进行数据洗牌
    np.random.shuffle(data)
    # 分离出X和y
    cols = data.shape[1]
    X = data[:, :cols-1]
    y = data[:, cols-1:]
    return X, y

# 定义停止条件的函数
Stop_iter = 0
Stop_cost = 1
Stop_grad = 2
def StopCriter(Stop_name, value, threshold):
    # 如果迭代条件是迭代次数,返回迭代比较的结果,真或者假
    if Stop_name == Stop_iter: return value > threshold
    # 如果迭代条件是损失值,返回最后两个损失值之差,如果低于阈值,返回为真
    elif Stop_name == Stop_cost: return value[-2] - value[-1] < threshold
    # 如果迭代条件是梯度下降的方向向量,返回的是梯度下降方向向量的模,如果低于阈值,则返回为真
    elif Stop_name == Stop_grad: return np.linalg.norm(value) < threshold

# 用于计算梯度下降方向的向量 grad = 1/m np.sum(h(theta) - y) * xj
def gradient(X, y, theta):
    # 初始化梯度值
    grad = np.zeros_like(theta)
    # 计算误差 ravel()函数将(100, 1)转换为(100, )
    error = (model(X, theta) - y).ravel()
    # 计算每一个方向上的梯度方向
    for j in range(X.shape[1]):
        term = np.multiply(error, X[:, j])
        grad[0, j] = np.sum(term) / len(X)
    return grad
# 在梯度方向上进行theta的参数更新
def descent(data, theta, batchsize, Stop_name, threshold, alpha):
    # 数据进行洗牌
    X, y = shuffle_data(data)
    k = 0
    # 获得损失值函数
    costs = [cost(X, y, theta)]
    # 迭代次数
    i = 0
    # 初始时间
    init_time = time.time()
    # 循环
    while True:
        # 获得batchsize的样本
        batch_x, batch_y = X[k:k+batchsize], y[k:k+batchsize]
        # 更新k
        k = k + batchsize
        # 如果k大于样本数,置0,重新获得洗牌后的X和y
        if k >= X.shape[0]:
            k = 0
            X, y = shuffle_data(data)
        # 计算梯度方向
        grad = gradient(batch_x, batch_y, theta)
        # 更新参数
        theta = theta - alpha * grad
        # 重新计算损失值
        costs.append(cost(X, y, theta))
        i = i + 1
        # 根据迭代的条件获得当前的value值
        if Stop_name == Stop_iter:value = i
        elif Stop_name == Stop_cost: value=costs
        elif Stop_name == Stop_grad: value=grad
        # 将value值输入,与阈值进行条件比较,满足即跳出循环
        if StopCriter(Stop_name, value, threshold):
            break
    # 返回
    return   data, theta, i, batchsize, Stop_name, threshold, alpha, time.time() - init_time, costs
# 进行画图操作
def runExpe(data, theta, batchsize, Stop_name, threshold, alpha):
    data, theta, i, batchsize, Stop_name, threshold, alpha, dur, costs = descent(data, theta, batchsize, Stop_name, threshold, alpha)
    name = "Original" if (data[:, 1] > 2).sum() > 1 else "Scaled"
    name += " data - learning rate: {} - ".format(alpha)
    if batchsize == n:
        strDescType = "Gradient"
    elif batchsize == 1:
        strDescType = "Stochastic"
    else:
        strDescType = "Mini-batch ({})".format(batchsize)
    name += strDescType + " descent - Stop: "
    if Stop_name == Stop_iter:
        strStop = "{} iterations".format(threshold)
    elif Stop_name == Stop_cost:
        strStop = "costs change < {}".format(threshold)
    else:
        strStop = "gradient norm < {}".format(threshold)
    name += strStop
    print("***{}\nTheta: {} - Iter: {} - Last cost: {:03.2f} - Duration: {:03.2f}s".format(
        name, theta, iter, costs[-1], dur))
    fig, ax = plt.subplots(figsize=(12, 4))
    ax.plot(np.arange(len(costs)), costs, ‘r‘)
    ax.set_xlabel(‘Iterations‘)
    ax.set_ylabel(‘Cost‘)
    ax.set_title(name.upper() + ‘ - Error vs. Iteration‘)

    return theta

# 预测函数
def predict(X, theta):
    # 代入h(theta) 即model中进行样本预测
    pre_y = model(X, theta)
    # 概率大于0.5的,输出为1, 小于0.5的输出为0
    pre_y[pre_y >= 0.5] = 1
    pre_y[pre_y < 0.5] = 0
    # 返回预测结果的向量
    return pre_y
# 表示样本的总个数
n = 100
# 获得迭代好以后的theta
theta = runExpe(orig_data, theta, 100, Stop_grad, 0.05, alpha=0.001)
# 进行数据归一化操作
import sklearn.preprocessing as pp
scale_data = orig_data.copy()
# 对第二列和第三列数据进行归一化操作
scale_data[:, 1:3] = pp.scale(scale_data[:, 1:3])
# 获得预测结果的向量
pre_y = predict(X, theta)
# 将预测结果与真实结果进行比较,返回0和1的数组,正确是1,错误是0
correct_array = np.array(pre_y == y, dtype=int)
# 准确率就是计算正确和错误的平均值
accurracy = correct_array.mean()
print(accurracy)

迭代次数与损失值cost的作图

原文地址:https://www.cnblogs.com/my-love-is-python/p/10260545.html

时间: 2024-10-06 23:30:08

机器学习入门-逻辑回归算法的相关文章

4.机器学习之逻辑回归算法

理论上讲线性回归模型既可以用于回归,也可以用于分类.解决回归问题,可以用于连续目标值的预测.但是针对分类问题,该方法则有点不适应,因为线性回归的输出值是不确定范围的,无法很好的一一对应到我们的若干分类中.即便是一个二分类,线性回归+阈值的方式,已经很难完成一个鲁棒性很好的分类器了.为了更好的实现分类,逻辑回归诞生了.逻辑回归(Logistic Regression)主要解决二分类问题,用来表示某件事情发生的可能性.逻辑回归是假设数据服从Bernoulli分布的,因此LR也属于参数模型,他的目的也

机器学习 (三) 逻辑回归 Logistic Regression

文章内容均来自斯坦福大学的Andrew Ng教授讲解的Machine Learning课程,本文是针对该课程的个人学习笔记,如有疏漏,请以原课程所讲述内容为准.感谢博主Rachel Zhang 的个人笔记,为我做个人学习笔记提供了很好的参考和榜样. § 3.  逻辑回归 Logistic Regression 1 分类Classification 首先引入了分类问题的概念——在分类(Classification)问题中,所需要预测的$y$是离散值.例如判断一封邮件是否属于垃圾邮件.判断一个在线交

机器学习实战-逻辑回归

什么是回归? 假设现在有些数据点,我用直线对这些点进行拟合(该线叫做最佳拟合直线),这个拟合的过程就叫做回归. Logistic回归? 这里,Logistic回归进行分类的主要思想:根据现有数据对分类的边界线建立回归公式,以此边界线进行分类.这里的回归指的是最佳拟合,就是要找到边界线的回归公式的最佳拟合的参数集.训练时使用最优化算法寻找最佳拟合参数. 基于Logistic回归和Sigmoid函数的分类 对于边界线建立的回归函数,能够接受所有的输入然后预测出类别.例如,对于二分类的情况下,上述函数

机器学习:逻辑回归(基础理解)

逻辑回归(Logistic Regression) 一.行业算法应用率 具统计,2017年,除了军事和安全领域,逻辑回归算法是在其它所有行业使用最多了一种机器学习算法: Logistic Regression(逻辑回归) Decision Trees(决策树) Random Forests(随机森林) Neural Networks(人工神经网络 NNs)--深度学习算法 人工神经网络(Artificial Neural Networks,简写为ANNs)也简称为神经网络(NNs)或称作连接模型

机器学习:逻辑回归(使用多项式特征)

一.基础 逻辑回归中的决策边界,本质上相当于在特征平面中找一条直线,用这条直线分割所有的样本对应的分类: 逻辑回归只可以解决二分类问题(包含线性和非线性问题),因此其决策边界只可以将特征平面分为两部分: 问题:使用直线分类太过简单,因为有很多情况样本的分类的决策边界并不是一条直线,如下图:因为这些样本点的分布是非线性的: 方案:引入多项式项,改变特征,进而更改样本的分布状态: 二.具体实现 1)模拟数据集 import numpy as np import matplotlib.pyplot a

逻辑回归算法-通俗易懂易实现

转自https://www.cnblogs.com/hum0ro/p/9652674.html,看到介绍的逻辑回归很容易理解算法原理及实现,拿来存档做记录 一直做图像处理算法和视频方面的嵌入式应用软件,早起研究和应用过神经网络算法,一直没有了解其他分类的机器学习算法,这段时间用空学习研究这些算法,如k-means,em聚类算法,查阅了许多资料,算法推倒的,结合举例说明有个直观印象,这样可以更好地理解算法,方便实现 1.什么是逻辑回归 在前面讲述的回归模型中,处理的因变量都是数值型区间变量,建立的

机器学习之逻辑回归(Logistic Regression)

1. Classification 这篇文章我们来讨论分类问题(classification problems),也就是说你想预测的变量 y 是一个离散的值.我们会使用逻辑回归算法来解决分类问题. 之前的文章中,我们讨论的垃圾邮件分类实际上就是一个分类问题.类似的例子还有很多,例如一个在线交易网站判断一次交易是否带有欺诈性(有些人可以使用偷来的信用卡,你懂的).再如,之前判断一个肿瘤是良性的还是恶性的,也是一个分类问题. 在以上的这些例子中,我们想预测的是一个二值的变量,或者为0,或者为1:或者

21-城里人套路深之用python实现逻辑回归算法

如果和一个人交流时,他的思想像弹幕一样飘散在空中,将是怎样的一种景象?我想大概会毫不犹豫的点关闭的.生活为啥不能简单明了?因为太直白了令人乏味.保留一些不确定性反而扑朔迷离,引人入胜.我们学习了线性回归,对于损失函数及权重更新公式理解起来毫无压力,这是具体直白的好处.然而遇到抽象晦涩的逻辑回归,它的损失函数及权重更新公式就经历了从p(取值范围0~1)->p/(1-p)(取值范围0~+oo)->z=log(p/(1-p))(取值范围-oo~+oo)->p=1/1+e^(-z)->极大

SparkMLlib学习分类算法之逻辑回归算法

SparkMLlib学习分类算法之逻辑回归算法 (一),逻辑回归算法的概念(参考网址:http://blog.csdn.net/sinat_33761963/article/details/51693836) 逻辑回归与线性回归类似,但它不属于回归分析家族(主要为二分类),而属于分类家族,差异主要在于变量不同,因此其解法与生成曲线也不尽相同.逻辑回归是无监督学习的一个重要算法,对某些数据与事物的归属(分到哪个类别)及可能性(分到某一类别的概率)进行评估. (二),SparkMLlib逻辑回归应用