机器学习之logistic回归(逻辑回归)(代码片段)

chenyoude chenyoude     2023-02-16     391

关键词:

目录

Logistic回归

博客园地址:https://www.cnblogs.com/chenyoude/

git 地址:https://github.com/nickcyd/machine_learning

微信:a1171958281

代码中涉及的数学公式可以自己下载 Typora 这款软件后,把内容复制到.md文件内通过 Typora 打开

Logistic 回归

本章内容

  • Sigmoid 函数和 Logistic 回归分类器
  • 最优化理论初步
  • 梯度下降最优化算法
  • 数据中的缺失项处理

回归算法

  • 回归算法:假设现在有一些数据点,我们用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称作回归。与分类算法一样同属于监督学习。

Logistic 回归的一般过程

  1. 收集数据:采用任意方法收集数据。
  2. 准备数据:由于需要进行距离计算,因此要求数据类型为数值型。
  3. 分析数据:采用任意方法对数据进行分析。
  4. 训练算法:大部分时间讲用于训练,训练的目的是为了找到最佳的分类回归系数。
  5. 测试算法:一旦训练步骤完成,分类将会很快。
  6. 使用算法:基于训练好的回归系数对这些数值进行简单的回归计算,判定他们属于哪个类别,在此基础上做一些其他分析工作。

Logistic的优缺点

  • 优点:计算代价不高,易于理解和实现。
  • 缺点:容易欠拟合,分类精度可能不高。
  • 适用数据类型:数值型和标称型。

基于 Logistic 回归和 Sigmoid 函数的分类

Sigmoid 函数

  • 海维赛德阶跃函数(单位阶跃函数):输出只有0或1的函数,并且0到1的过程属于跳跃过程,即非0即1。
  • Sigmoid 函数:x=0时,sigmoid 值为0.5;随着 x 的增大,对应值将逼近1;随着 x 的减小,对应值将逼近0。
  • Sigmoid 函数公式:$$sigma(z)=frac11+e^-z$$。

Logistic 回归分类器

  • Logistic 回归分类器:我们在每个特征上都乘以一个回归系数 之后详细介绍,然后把所有的结果值相加,将这个总和代入 sigmoid 函数,进而得到一个范围在0~1之间的数值。大于0.5的数据被分入1类,小于0.5即被归入0类。

图5-1 两种坐标尺度下的 Sigmoid 函数图

技术分享图片

  • 通过图5-1 下面一张图可以看出,如果横坐标的尺度足够大,在 x=0出 sigmoid 函数看起来很像阶跃函数。

基于最优化方法的最佳回归系数确定

  • Sigmoid函数的输入记为 z,可由该公式得出:$z=w_0x_0+w_1x_1+w_2x_2+cdots+w_nx_n$。
  • 上述公式向量写法:$z=w^Tx$ 向量 x 是分类器的输入数据,向量 w 是我们需要找的最佳参数(系数)

梯度上升法

  • 梯度上升法:沿着函数的梯度方向探寻某函数的最大值。即求函数的最大值。
  • 如果梯度记为 ebla,则函数$f(x,y)$的梯度公式:$ abla f(x,y)=eginpmatrix fracpart f(x,y)part x fracpart f(x,y)part y endpmatrix$。
  • $fracpart f(x,y)part x$:沿 x 的方向移动$fracpart f(x,y)part x$,函数$f(x,y)$必须要在待计算的点上有定义并且可微。
  • $fracpart f(x,y)part y$:沿 x 的方向移动$fracpart f(x,y)part y$,函数$f(x,y)$必须要在待计算的点上有定义并且可微。

图5-2 梯度上升图

技术分享图片

  • 通过图5-2 可以看出梯度上升算法到达每个点后都会重新估计移动的方向。
  • 梯度上升算法的迭代公式:$w:=w+alpha abla_wf(w)$,该公式将一直被迭代执行,直至达到某个停止条件为止。
  • $alpha$:移动量的大小,称为步长。

梯度下降算法

  • 梯度下降算法:沿着函数的梯度方向探寻某函数的最小值。即求函数的最小值。
  • 梯度下降算法的迭代公式:$w:=w-alpha abla_wf(w)$

训练算法:使用梯度上升找到最佳参数

图5-3 数据集图

技术分享图片

  • 图5-3中有100个样本点,每个点包含两个数值型特征 X1和X2。

梯度上升算法的伪代码

每个回归系数初始化为1
重复 R 次:
    计算整个数据集的梯度
    使用 alpha*gradient 更新回归系数的向量
    返回回归系数 
    

程序5-1 Logistic 回归梯度上升优化算法

import os
import numpy as np
import matplotlib.pyplot as plt
from path_settings import machine_learning_PATH

data_set_path = os.path.join(machine_learning_PATH, '第五章/data-set')
testSet_path = os.path.join(data_set_path, 'testSet.txt')
horseColicTraining_path = os.path.join(data_set_path, 'horseColicTraining.txt')
horseColicTest_path = os.path.join(data_set_path, 'horseColicTest.txt')


def load_data_set():
    """导入数据集"""
    data_mat = []
    label_mat = []

    # 循环导入.txt文本数据构造成列表
    fr = open(testSet_path)
    for line in fr.readlines():
        line_arr = line.strip().split()
        data_mat.append([1, float(line_arr[0]), float(line_arr[1])])
        label_mat.append(int(line_arr[2]))

    return data_mat, label_mat


def sigmoid(in_x):
    return 1 / (1 + np.exp(-in_x))


def grad_ascent(data_mat_in, class_labels):
    # 生成特征矩阵
    data_matrix = np.mat(data_mat_in)
    # 生成标记矩阵并反置
    label_mat = np.mat(class_labels).transpose()

    # 计算data_matrix的行列
    m, n = np.shape(data_matrix)

    # 设置移动的步长为0.001
    alpha = 0.001
    # 设置最大递归次数500次
    max_cycles = 500

    # 初始化系数为1*3的元素全为1的矩阵
    weights = np.ones((n, 1))

    # 循环迭代梯度上升算法
    for k in range(max_cycles):
        # 计算真实类别与预测类别的差值
        h = sigmoid(data_matrix * weights)
        error = (label_mat - h)
        
        # 调整回归系数
        weights = weights + alpha * data_matrix.transpose() * error

    return weights


def test_grad_ascent():
    data_mat, label_mat = load_data_set()
    weights = grad_ascent(data_mat, label_mat)
    print(weights)
    """
    [[ 4.12414349]
     [ 0.48007329]
     [-0.6168482 ]]
    """


if __name__ == '__main__':
    test_grad_ascent()

分析数据:画出决策边界

  • 该节将通过代码画出决策边界

程序5-2 画出数据集和 Logistic 回归最佳拟合直线的函数

def plot_best_fit(wei):
    # getA==np.asarrayz(self)
    # 使用__class__.__name__为了判断是梯度上升和随机梯度上升
    if wei.__class__.__name__ == 'matrix':
        weights = wei.getA()
    elif wei.__class__.__name__ == 'ndarray':
        weights = wei
    else:
        weights = wei

    data_mat, label_mat = load_data_set()

    # 把特征集转换成数组
    data_arr = np.array(data_mat)
    n = np.shape(data_arr)[0]

    # 循环数据集分类
    xcord1 = []
    ycord1 = []
    xcord2 = []
    ycord2 = []
    for i in range(n):
        if int(label_mat[i]) == 1:
            xcord1.append(data_arr[i, 1])
            ycord1.append(data_arr[i, 2])
        else:
            xcord2.append(data_arr[i, 1])
            ycord2.append(data_arr[i, 2])

    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
    ax.scatter(xcord2, ycord2, s=30, c='green')

    # 0.1是步长
    x = np.arange(-3, 3, 0.1)
    # 假设 sigmoid 函数为0,并且这里的 x,y 相当于上述的 x1和x2即可得出 y 的公式
    y = (-weights[0] - weights[1] * x) / weights[2]

    ax.plot(x, y)
    plt.xlabel('X1')
    plt.ylabel('X2')
    plt.show()


def test_plot_best_fit():
    data_mat, label_mat = load_data_set()
    weights = grad_ascent(data_mat, label_mat)
    plot_best_fit(weights)


if __name__ == '__main__':
    # test_grad_ascent()
    test_plot_best_fit()
    

图5-4 梯度上升算法500次迭代后的结果

技术分享图片

  • 通过图5-4 可以看出我们只分错了2-4个点。

训练算法:随机梯度上升

  • 梯度上升法每次更新回归系数时都需要遍历整个数据集,如果样本或者特征数过多就应该考虑使用随机梯度上升算法。
  • 随机梯度上升:一次仅用一个样本点来更新回归系数,不需要重新读取整个数据集。

随机梯度上升算法伪代码

所有回归系数初始化为1
对数据集中每个样本
    计算该样本的梯度
    使用 alpha*gradient 更新回归系数值
返回回归系数值

程序5-3 随机梯度上升算法

def stoc_grad_ascent0(data_matrix, class_labels):
    """随机梯度上升算法"""
    m, n = np.shape(data_matrix)

    alpha = 0.01
    weights = np.ones(n)
    for i in range(m):
        # 使用 sum 函数得出一个值,只用计算一次
        h = sigmoid(sum(data_matrix[i] * weights))
        error = class_labels[i] - h
        weights = weights + alpha * error * data_matrix[i]

    return weights


def test_stoc_grad_ascent0():
    data_arr, label_mat = load_data_set()
    weights = stoc_grad_ascent0(np.array(data_arr), label_mat)
    plot_best_fit(weights)


if __name__ == '__main__':
    # test_grad_ascent()
    # test_plot_best_fit()
    test_stoc_grad_ascent0()
  • 梯度上升和随机梯度上升:从代码中我们可以看到前者变量 h 和误差 error 都是向量,而后者全是数值;前者是矩阵转换,后者则是 numpy 数组。

图5-5 随机梯度上升算法图

技术分享图片

  • 图5-5可以看出随机梯度上升算法的最佳拟合直线并非最佳分类线

程序5-4 改进的随机梯度上升算法

def stoc_grad_ascent1(data_matrix, class_labels, num_iter=150):
    """改进随机梯度上升算法,默认迭代150次"""
    m, n = np.shape(data_matrix)
    weights = np.ones(n)
    for j in range(num_iter):
        data_index = list(range(m))
        for i in range(m):
            # 每次迭代减小 alpha 的值,但最小为0.01,确保新数据依然有影响。缓解系数波动的情况
            alpha = 4 / (1 + j + i) + 0.01

            # 随机选取值进行更新
            rand_index = int(np.random.uniform(0, len(data_index)))

            h = sigmoid(sum(data_matrix[rand_index] * weights))
            error = class_labels[rand_index] - h
            weights = weights + alpha * error * data_matrix[rand_index]

            # 删除更新后的值
            del (data_index[rand_index])

    return weights


def test_stoc_grad_ascent1():
    data_arr, label_mat = load_data_set()
    weights = stoc_grad_ascent1(np.array(data_arr), label_mat)
    plot_best_fit(weights)


if __name__ == '__main__':
    # test_grad_ascent()
    # test_plot_best_fit()
    # test_stoc_grad_ascent0()
    test_stoc_grad_ascent1()

图5-6 改进随机梯度上升算法图

技术分享图片

  • 图5-6可以看出150次的跌打就能得到一条很好的分类线,而梯度上升算法需要迭代500次。

示例:从疝气病预测病马的死亡率

  • 疝气病:描述马胃肠痛的术语
  • 数据集中包含368个样本和28个特征,并且有30%的值是缺失的

示例:使用 Logistic 回归估计马疝病的死亡率

  1. 收集数据:给定数据文件
  2. 准备数据:用 Python 解析文本文件并填充缺失值
  3. 分析数据:可视化并观察数据
  4. 训练算法:使用优化算法,找到最佳的系数
  5. 测试算法:观察错误率,根据错误率决定是否会退到训练阶段;改变迭代的次数和步长等参数来得到更好的回归系数
  6. 使用算法:实现一个简单的程序来手机马的症状并输出预测结果

准备数据:处理数据中的缺失值

  • 数据的获取是相当昂贵的,扔掉和重新获取都是不可取的
  • 以下几种方法可以解决数据的缺失的问题
  1. 使用可用特征的均值来填补缺失值
  2. 使用特殊值来填补缺失值
  3. 忽略有缺失值的样本
  4. 使用相似样本的均值填补缺失值
  5. 使用另外的机器学习算法预测缺失值
  • 预处理第一件事:用0替代所有的缺失值,因为缺失值为0时回归系数的更新公式不会更新并且 sigmoid(0)=0.5,他对结果的预测不具有任何倾向性
  • 预处理第二件事:对于数据标记缺失的数据舍弃,因为标记很难确定采用某个合适的值来替换。
  • 预处理后的文件:对于原始数据文件可以去 http://archive.ics.uci.edu/ml/datasets/Horse+Colic 获取,此处只提供预处理之后的文件

测试算法:用 Logistic 回归进行分类

def classify_vector(in_x, weights):
    prob = sigmoid(sum(in_x * weights))
    if prob > 0.5:
        return 1
    else:
        return 0


def colic_test():
    """马疝病造成马死亡概率预测"""
    fr_train = open(horseColicTraining_path)
    fr_test = open(horseColicTest_path)

    training_set = []
    training_labels = []
    for line in fr_train.readlines():
        # 切分所有特征并把特征加入 line_arr 列表中
        curr_line = line.strip().split('	')  # type:list
        line_arr = []
        for i in range(21):
            line_arr.append(float(curr_line[i]))
        # 分开处理特征和标记
        training_set.append(line_arr)
        training_labels.append(float(curr_line[21]))

    train_weights = stoc_grad_ascent1(np.array(training_set), training_labels, 500)
    print(train_weights)

    error_count = 0
    num_test_vec = 0
    for line in fr_test.readlines():
        num_test_vec += 1
        curr_line = line.strip().split('	')  # type:list
        line_arr = []
        for i in range(21):
            line_arr.append(float(curr_line[i]))

        # 通过比较样本标记与输入系数与特征相乘值 sigmoid 函数得到的标记判断是否预测失误
        if int(classify_vector(np.array(line_arr), train_weights)) != int(curr_line[21]):
            error_count += 1

    error_rate = (float(error_count) / num_test_vec)
    print('测试集的错误率: '.format(error_rate))
    # 测试集的错误率: 0.373134328358209

    return error_rate


def multi_test():
    num_tests = 10
    error_sum = 0
    for k in range(num_tests):
        error_sum += colic_test()
    print('迭代  次后平均错误率为: '.format(num_tests, error_sum / float(num_tests)))
    # 迭代 10 次后平均错误率为: 0.3656716417910448


if __name__ == '__main__':
    # test_grad_ascent()
    # test_plot_best_fit()
    # test_stoc_grad_ascent0()
    # test_stoc_grad_ascent1()
    multi_test()

完整代码logRegres.py

import os
import numpy as np
import matplotlib.pyplot as plt
from path_settings import machine_learning_PATH

data_set_path = os.path.join(machine_learning_PATH, '第五章/data-set')
testSet_path = os.path.join(data_set_path, 'testSet.txt')
horseColicTraining_path = os.path.join(data_set_path, 'horseColicTraining.txt')
horseColicTest_path = os.path.join(data_set_path, 'horseColicTest.txt')


def load_data_set():
    """导入数据集"""
    data_mat = []
    label_mat = []

    # 循环导入.txt文本数据构造成列表
    fr = open(testSet_path)
    for line in fr.readlines():
        line_arr = line.strip().split()
        data_mat.append([1, float(line_arr[0]), float(line_arr[1])])
        label_mat.append(int(line_arr[2]))

    return data_mat, label_mat


def sigmoid(in_x):
    """构造 sigmoid 函数"""
    return 1 / (1 + np.exp(-in_x))


def grad_ascent(data_mat_in, class_labels):
    """梯度上升算法"""
    # 生成特征矩阵
    data_matrix = np.mat(data_mat_in)
    # 生成标记矩阵并反置
    label_mat = np.mat(class_labels).transpose()

    # 计算data_matrix的行列
    m, n = np.shape(data_matrix)

    # 设置移动的步长为0.001
    alpha = 0.001
    # 设置最大递归次数500次
    max_cycles = 500

    # 初始化系数为1*3的元素全为1的矩阵
    weights = np.ones((n, 1))

    # 循环迭代梯度上升算法
    for k in range(max_cycles):
        # 计算真实类别与预测类别的差值
        h = sigmoid(data_matrix * weights)
        error = (label_mat - h)

        # 调整回归系数
        weights = weights + alpha * data_matrix.transpose() * error

    return weights


def test_grad_ascent():
    data_mat, label_mat = load_data_set()
    weights = grad_ascent(data_mat, label_mat)
    print(weights)
    """
    [[ 4.12414349]
     [ 0.48007329]
     [-0.6168482 ]]
    """


def plot_best_fit(wei):
    """画出被分割的数据集"""
    # getA==np.asarrayz(self)
    # 使用__class__.__name__为了判断是梯度上升和随机梯度上升
    if wei.__class__.__name__ == 'matrix':
        weights = wei.getA()
    elif wei.__class__.__name__ == 'ndarray':
        weights = wei
    else:
        weights = wei

    data_mat, label_mat = load_data_set()

    # 把特征集转换成数组
    data_arr = np.array(data_mat)
    n = np.shape(data_arr)[0]

    # 循环数据集分类
    xcord1 = []
    ycord1 = []
    xcord2 = []
    ycord2 = []
    for i in range(n):
        if int(label_mat[i]) == 1:
            xcord1.append(data_arr[i, 1])
            ycord1.append(data_arr[i, 2])
        else:
            xcord2.append(data_arr[i, 1])
            ycord2.append(data_arr[i, 2])

    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
    ax.scatter(xcord2, ycord2, s=30, c='green')

    # 0.1是步长
    x = np.arange(-3, 3, 0.1)
    # 假设 sigmoid 函数为0,并且这里的 x,y 相当于上述的 x1和x2即可得出 y 的公式
    y = (-weights[0] - weights[1] * x) / weights[2]

    ax.plot(x, y)
    plt.xlabel('X1')
    plt.ylabel('X2')
    plt.show()


def test_plot_best_fit():
    data_mat, label_mat = load_data_set()
    weights = grad_ascent(data_mat, label_mat)
    plot_best_fit(weights)


def stoc_grad_ascent0(data_matrix, class_labels):
    """随机梯度上升算法"""
    m, n = np.shape(data_matrix)

    alpha = 0.01
    weights = np.ones(n)
    for i in range(m):
        # 使用 sum 函数得出一个值,只用计算一次
        h = sigmoid(sum(data_matrix[i] * weights))
        error = class_labels[i] - h
        weights = weights + alpha * error * data_matrix[i]

    return weights


def test_stoc_grad_ascent0():
    data_arr, label_mat = load_data_set()
    weights = stoc_grad_ascent0(np.array(data_arr), label_mat)
    plot_best_fit(weights)


def stoc_grad_ascent1(data_matrix, class_labels, num_iter=150):
    """改进随机梯度上升算法,默认迭代150次"""
    m, n = np.shape(data_matrix)
    weights = np.ones(n)
    for j in range(num_iter):
        data_index = list(range(m))
        for i in range(m):
            # 每次迭代减小 alpha 的值,但最小为0.01,确保新数据依然有影响。缓解系数波动的情况
            alpha = 4 / (1 + j + i) + 0.01

            # 随机选取值进行更新
            rand_index = int(np.random.uniform(0, len(data_index)))

            h = sigmoid(sum(data_matrix[rand_index] * weights))
            error = class_labels[rand_index] - h
            weights = weights + alpha * error * data_matrix[rand_index]

            # 删除更新后的值
            del (data_index[rand_index])

    return weights


def test_stoc_grad_ascent1():
    data_arr, label_mat = load_data_set()
    weights = stoc_grad_ascent1(np.array(data_arr), label_mat)
    plot_best_fit(weights)


def classify_vector(in_x, weights):
    prob = sigmoid(sum(in_x * weights))
    if prob > 0.5:
        return 1
    else:
        return 0


def colic_test():
    """马疝病造成马死亡概率预测"""
    fr_train = open(horseColicTraining_path)
    fr_test = open(horseColicTest_path)

    training_set = []
    training_labels = []
    for line in fr_train.readlines():
        # 切分所有特征并把特征加入 line_arr 列表中
        curr_line = line.strip().split('	')  # type:list
        line_arr = []
        for i in range(21):
            line_arr.append(float(curr_line[i]))
        # 分开处理特征和标记
        training_set.append(line_arr)
        training_labels.append(float(curr_line[21]))

    train_weights = stoc_grad_ascent1(np.array(training_set), training_labels, 500)
    print(train_weights)

    error_count = 0
    num_test_vec = 0
    for line in fr_test.readlines():
        num_test_vec += 1
        curr_line = line.strip().split('	')  # type:list
        line_arr = []
        for i in range(21):
            line_arr.append(float(curr_line[i]))

        # 通过比较样本标记与输入系数与特征相乘值 sigmoid 函数得到的标记判断是否预测失误
        if int(classify_vector(np.array(line_arr), train_weights)) != int(curr_line[21]):
            error_count += 1

    error_rate = (float(error_count) / num_test_vec)
    print('测试集的错误率: '.format(error_rate))
    # 测试集的错误率: 0.373134328358209

    return error_rate


def multi_test():
    num_tests = 10
    error_sum = 0
    for k in range(num_tests):
        error_sum += colic_test()
    print('迭代  次后平均错误率为: '.format(num_tests, error_sum / float(num_tests)))
    # 迭代 10 次后平均错误率为: 0.3656716417910448


if __name__ == '__main__':
    # test_grad_ascent()
    # test_plot_best_fit()
    # test_stoc_grad_ascent0()
    # test_stoc_grad_ascent1()
    multi_test()

总结

  • Logistic 回归:寻找一个非线性函数 Sigmoid 的最佳拟合参数。
  • 求解过程:通过最优化算法(常用的梯度上升算法),通过简化梯度上升算法得到随机梯度上升算法
  • 对缺失数据的处理:机器学习中最后只能更要的问题之一,主要还是取决于实际应用中的需求。

支持向量机 coding……

==尊重原创==
==可以伸出你的小手点个关注,谢谢!==

博客园地址:https://www.cnblogs.com/chenyoude/
git 地址:https://github.com/nickcyd/machine_learning
微信:a1171958281

机器学习之logistic回归算法

1Logistic回归算法的原理1.1需要的数学基础我在看机器学习实战时对其中的代码非常费解,说好的利用偏导数求最值怎么代码中没有体现啊,就一个简单的式子:θ=θ - α Σ[(hθ(x(i))-y(i) )]*xi。经过查找资料才知道,... 查看详情

机器学习之线性回归以及logistic回归

1、线性回归回归的目的是预测数值型数据的目标值。目标值的计算是通过一个线性方程得到的,这个方程称为回归方程,各未知量(特征)前的系数为回归系数,求这些系数的过程就是回归。对于普通线性回归使用的损失函数... 查看详情

机器学习之线性回归---logistic回归---softmax回归

1摘要     本报告是在学习斯坦福大学机器学习课程前四节加上配套的讲义后的总结与认识。前四节主要讲述了回归问题,回归属于有监督学习中的一种方法。该方法的核心思想是从连续型统计数据中得到数学... 查看详情

机器学习之逻辑回归(logisticregression)

 """逻辑回归中的Sigmoid函数""" importnumpyasnp importmatplotlib.pyplotasplt   defsigmoid(t): return1/(1+np.exp(-t))   x=np.linspace(-10,10,500) y=sigmoid 查看详情

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

理论上讲线性回归模型既可以用于回归,也可以用于分类。解决回归问题,可以用于连续目标值的预测。但是针对分类问题,该方法则有点不适应,因为线性回归的输出值是不确定范围的,无法很好的一一对应到我们的若干分类... 查看详情

逻辑回归(logistic回归)

前言      以下内容是个人学习之后的感悟,如果有错误之处,还请多多包涵~  逻辑回归一、为什么使用logistic回归  一般来说,回归不用在分类问题上,因为回归是连续型模型,而且受噪声影响... 查看详情

机器学习之线性回归(代码片段)

目录预测数值型数据:回归用线性回归找到最佳拟合直线程序8-1标准回归函数和数据导入函数程序8-2基于程序8-1绘图图片8-1ex0的数据集和它的最佳拟合直线局部加权线性回归图片8-2参数k与权重的关系程序8-3局部加权线性回归函... 查看详情

机器学习之逻辑回归

1.用自己的话描述一下,什么是逻辑回归,与线性回归对比,有什么不同?逻辑回归又称逻辑回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域;与线性回归相比大致有两大不同:①... 查看详情

机器学习之logistic回归(代码片段)

  都说万事开头难,可一旦开头,就是全新的状态,就有可能收获自己未曾预料到的成果。记录是为了更好的监督、理解和推进,学习过程中用到的数据集和代码都将上传到github  回归是对一个或多个自变量和因变量之间的... 查看详情

机器学习笔记—logistic回归

本文申明:本系列笔记全部为原创内容,如有转载请申明原地址出处。谢谢序言:whatislogisticregression?Logistics一词表示adj.逻辑的;[军]后勤学的n.[逻]数理逻辑;符号逻辑;[军]后勤学,“回归”是由英国著名生物学家兼统计学家... 查看详情

机器学习之svm与逻辑回归的联系和区别

  通常说的SVM与逻辑回归的联系一般指的是软间隔的SVM与逻辑回归之间的关系,硬间隔的SVM应该是与感知机模型的区别和联系。而且工程中也不能要求所有的点都正确分类,训练数据中噪声的存在使得完全正确分类很可能造成... 查看详情

机器学习之逻辑回归

给定一张图片,如何让计算机帮助我们识别它是不是一张猫的图片,这个问题可以看成一个简单的分类问题。如下图所示,平面上有两种不同颜色(黑色,红色)的点,我们要做到就是要找到类似与那条直线那样的界限。当某个... 查看详情

机器学习之五:神经网络反向传播算法(代码片段)

一、逻辑回归的局限在逻辑回归一节中,使用逻辑回归的多分类,实现了识别20*20的图片上的数字。但所使用的是一个一阶的模型,并没有使用多项式,为什么?可以设想一下,在原有400个特征的数据样本中,增加二次、三次、... 查看详情

机器学习之逻辑回归

1、逻辑回归其实可以称之为广义的线性回归,采用和线性回归类似的模型。但是逻辑回归解决的是一个分类问题,因此会对求出的y值做一个sigmod函数映射,然后根据预先设定的阈值进行标签处理。其中,使用sigmod函数将θTx映射... 查看详情

机器学习之逻辑回归以及梯度下降法求解(代码片段)

文章目录前言梯度下降法梯度梯度法逻辑回归思路公式推导代码实现西瓜数据集手写梯度下降法求解二分类逻辑回归模型可爱的sklearn求解参考前言逻辑回归,其实不是回归任务,而是分类任务,逻辑回归模型对二分... 查看详情

机器学习之逻辑回归

二项逻辑回归模型是如下的条件概率分布: 其中x∈是输入,y∈0,1是输出。为了方便,将权值向量和输入向量进行扩充,此时w=,x=,回归模型表示如下:   参数w未知,采用统计学中的极大似然估计来由样本估计参... 查看详情

机器学习之线性回归(代码片段)

文章目录评价方法一元线性回归np.polyfit求解带入公式求解化简公式求解lstsq求解多元线性回归代码实现一元多项式回归代码实现参考评价方法回归问题有很多的评价方法。这里主要想写一下R^2的计算方法。需要计算R^2需要先弄清... 查看详情

机器学习之学习路线

机器学习机器学习朴素贝叶斯(NBC) 决策树K-近邻算法回归K-均值聚类算法Apriori算法FP-growth算法主成分分析(PCA)奇异值分析(SVD)支持向量机logistic回归python实现明星专家系统http://9399369.blog.51cto.com/9389369/d-22/p-2本文出自“运维... 查看详情