机器学习分类算法之逻辑回归

一、概念

逻辑回归(Logistic Regression,LR)是一种广义的线性回归分析模型,属于监督学习算法,需要打标数据,可以用在回归、二分类和多分类等问题上,最常用的是二分类。

线性回归就是通过一条曲线区分不同的数据集,在二分类问题上会有一条直线对其进行区分,如下:

逻辑回归需要每组数据都是都是数值型的,因为需要对其进行运算,得到直线系数,打标数据一般是0和1。

二、计算

逻辑回归的输出是一组特征系数,使用了 y=wx+b这种函数来进行线性拟合,这个问题的y值不是0,就是1。使用上述函数很难快速逼近0-1。为了解决这个问题,我们给出一个激活函数Sigmoid函数:

他在z趋向于无穷小时,逼近于0 ,在t趋向于无穷大时逼近于1。

,函数就变为了:

,这样,W的存在就将原本的数据集转换为了一组值在0-1之间的数,我们通过调整W的值,尽可能让数据集的值贴近目标值,即0和1。

由上面介绍可知,y=0.5时刚好是x=0;

y越趋近于0,x越小,且为负数,到负无穷时为0;

反之,y越趋近于1,x越大,且为正数,到正无穷时为1。

逻辑回归会算出一组系数,使样本的值向目标值0或1趋近,越接近目标值越好,预测就会越准确。

这里用梯度下降法来实现逻辑回归。

梯度下降法(Gradient Descent)就是每一次迭代都向目标结果接近一点,直到计算收敛。

梯度下降法的基本思想可以类比为一个下山的过程,以当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着山的高度下降的地方走,同理,如果我们的目标是上山,也就是爬到山顶,那么此时应该是朝着最陡峭的方向往上走。然后每走一段距离,都反复采用同一个方法,最后就能成功的抵达山谷。

梯度下降公式为:

其中是权重系数每次需要调整的值,

alpha被称之为步长,也叫乘积系数,是为了限制每次调整的大小,调整太大会错过关键信息,调整太小会迭代次数过多,所以要反复调整,

error被称之为梯度,error = sigmoid(XW) - Y,Y是目标列,

我们一般会指定一个初始特征系数,一般设为全是1,即 W=(1,1,1.....,1),

常数项我们作为增广向量添加到数据集中,增广向量我们全部设为1,同样的,目标列也增加一个1,

最后我们还有设置一个阈值,来作为预测结果的依据,根据上面的描述,梯度下降法可选用sigmoid(XW)和0.5的比较来判断,因为小于0.5,x为负,趋近于0,大于0.5,x为正,趋近于1。

三、实现

# !/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt

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

def grad_ascent(data_mat, class_label, alpha):
    data_matrix = np.mat(data_mat)
    label_mat = np.mat(class_label).transpose()
    m, n = np.shape(data_matrix)
    data_matrix = augment(data_matrix)  # 增广
    n += 1
    weight = np.ones((n, 1))
    while True:
        error = sigmoid(data_matrix * weight) - label_mat
        cha = alpha * data_matrix.transpose() * error
        if np.abs(np.sum(cha)) < 0.0001:
            break
        weight = weight - cha
    return weight

def create_sample():
    np.random.seed(10)  # 随机数种子,保证随机数生成的顺序一样
    n_dim = 2
    num = 100
    a = 3 + 5 * np.random.randn(num, n_dim)
    b = 18 + 4 * np.random.randn(num, n_dim)
    data_mat = np.concatenate((a, b))
    ay = np.zeros(num)
    by = np.ones(num)
    label = np.concatenate((ay, by))
    return {‘data_mat‘: data_mat, ‘label‘: label}

def plot_data(samples, plot_type=‘o‘):
    data_mat = samples[‘data_mat‘]
    label = samples[‘label‘]
    n = data_mat.shape[0]
    cs = [‘r‘, ‘g‘]
    dd = np.arange(n)
    for i in range(2):
        index = label == i
        xx = data_mat[dd[index]]
        plt.plot(xx[:, 0], xx[:, 1], plot_type, markerfacecolor=cs[i], markersize=14)

def augment(data_matrix):
    n, n_dim = data_matrix.shape
    a = np.mat(np.ones((n, 1)))
    return np.concatenate((data_matrix, a), axis=1)

def classify(data_mat, weight):
    data_matrix = np.mat(data_mat)
    data_matrix = augment(data_matrix)
    d = sigmoid(data_matrix * weight)
    print(d)
    r = np.zeros((data_matrix.shape[0], 1))
    r[d > 0.5] = 1
    return r

def plot(weight, data):
    lx = [0, -weight[2] / weight[0]]
    ly = [-weight[2] / weight[1], 0]
    plot_data(data)
    plt.plot(lx, ly)
    plt.show()

def main():
    data = create_sample()
    final_weight = grad_ascent(data[‘data_mat‘], data[‘label‘], 0.001)
    print(final_weight)
    plot(final_weight, data)
    pred = classify(data[‘data_mat‘], final_weight)
    label = np.mat(data[‘label‘]).T
    diff = np.sum(pred != label)
    print(diff, len(label), 1.0 * diff / len(label))

if __name__ == ‘__main__‘:
    main()

四、结果:

weight:

[[ 0.3236568 ]
[ 0.30234029]
[-7.00232679]]

图形:

准确率:

预测不一致:4个

总数:200个

错误率:2%

调整迭代跳出条件为np.abs(np.sum(cha)) < 0.00001,则:

weight:

[[ 1.52741071]
[ 1.08976556]
[-32.00925101]]

图形:

准确率:

预测不一致:3个

总数:200个

错误率:1.5%

原文地址:https://www.cnblogs.com/small-office/p/10231338.html

时间: 2024-08-30 06:20:34

机器学习分类算法之逻辑回归的相关文章

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

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

分类算法之逻辑回归(Logistic Regression

分类算法之逻辑回归(Logistic Regression) 1.二分类问题 现在有一家医院,想要对病人的病情进行分析,其中有一项就是关于良性\恶性肿瘤的判断,现在有一批数据集是关于肿瘤大小的,任务就是根据肿瘤的大小来判定是良性还是恶性.这就是一个很典型的二分类问题,即输出的结果只有两个值----良性和恶性(通常用数字0和1表示).如图1所示,我们可以做一个直观的判定肿瘤大小大于5,即为恶心肿瘤(输出为1):小于等于5,即为良性肿瘤(输出为0). 2.分类问题的本质 分类问题本质上属于有监督学习

分类算法之逻辑回归

机器学习笔记04:逻辑回归(Logistic regression)、分类(Classification)

之前我们已经大概学习了用线性回归(Linear Regression)来解决一些预测问题,详见: 1.<机器学习笔记01:线性回归(Linear Regression)和梯度下降(Gradient Decent)> 2.<机器学习笔记02:多元线性回归.梯度下降和Normal equation> 3.<机器学习笔记03:Normal equation及其与梯度下降的比较> 说明:本文章所有图片均属于Stanford机器学课程,转载请注明出处 面对一些类似回归问题,我们可

Coursera机器学习-第三周-逻辑回归Logistic Regression

Classification and Representation 1. Classification Linear Regression (线性回归)考虑的是连续值([0,1]之间的数)的问题,而Logistic Regression(逻辑回归)考虑的是离散值(例如只能取0或1而不能取0到1之间的数)的问题.举个例子,你需要根据以往季度的电力数据,预测下一季度的电力数据,这个时候需要使用的是线性回归,因为这个值是连续的,而不是离散的.而当你需要判断这个人抽烟还是不抽烟的问题时,就需要使用逻辑回

用Python开始机器学习(7:逻辑回归分类) --好!!

from : http://blog.csdn.net/lsldd/article/details/41551797 在本系列文章中提到过用Python开始机器学习(3:数据拟合与广义线性回归)中提到过回归算法来进行数值预测.逻辑回归算法本质还是回归,只是其引入了逻辑函数来帮助其分类.实践发现,逻辑回归在文本分类领域表现的也很优秀.现在让我们来一探究竟. 1.逻辑函数 假设数据集有n个独立的特征,x1到xn为样本的n个特征.常规的回归算法的目标是拟合出一个多项式函数,使得预测值与真实值的误差最小

[机器学习] Coursera ML笔记 - 逻辑回归(Logistic Regression)

引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记,涵盖线性回归.逻辑回归.Softmax回归.神经网络和SVM等等,主要学习资料来自Standford Andrew Ng老师在Coursera的教程以及UFLDL Tutorial,Stanford CS231n等在线课程和Tutorial,同时也参考了大量网上的相关资料(在后面列出). 前言 本文主要介绍逻辑回归的基础知识,文章小节安排如下: 1)逻辑回归定义 2)假设函数(Hypothesis function

「数据挖掘入门系列」挖掘建模之分类与预测&ndash;逻辑回归

拿电商行业举例,经常会遇到以下问题: 如果基于商品的历史销售情况,以及节假日.气候.竞争对手等影响因素,对商品的销量进行趋势预测? 如何预测未来一段时间哪些客户会流失,哪些客户可能会成为VIP用户? 如果预测一种新商品的销售量,以及哪种类型的客户会比较喜欢? 除此之外,运营部门需要通过数据分析来了解具有某些特征的客户的消费习惯,管理人员希望了解下一个月的销售收入等,这些都是分类与预测的日志. 分类和预测是预测问题的两种主要类型. 分类主要是预测分类标号(离散值) 预测主要是建立连续值函数模型 挖

【机器学习基础】核逻辑回归

将软间隔支持向量机看做正则化模型 上一小节中我们介绍了软间隔支持向量机,该模型允许有错分类数据的存在,从而使模型对数据有更好的适应性,有效避免过拟合的问题. 现在我们回顾一下松弛变量ξn,我们用ξn来记录违反分类边界的数据到边界的距离. 我们可以从另外一个角度,考虑一下ξn的计算: 对于任何一个点,如果该点违反了边界,那么ξn记录了其到边界的距离:如果没有违反,ξn为0. 所以我们可以用下面这个式子来表示: 与正则化模型的比较 在正则化中,我们用w的长度来控制复杂度,并且我们希望某个误差度量最小