分类算法原理及python实现(一)

2023-10-27


一、分类算法的概念

1.概念

输出变量Y为有限个离散值的预测问题,是一种有监督学习。分类算法可以分为概率模型与非概率模型,概率模型通过学习得到属性集与分类标签的条件概率分布形式P(y|x),非概率模型通过学习得到一个属性集与分类标签的函数形式y=f(x)

2.应用

分类模型可以被用于预测类别未知的个体的类别标签,也可以根据分类模型解释样本分类规律等

3.统计学分类与机器学习分类的区别

统计学分类与机器学习分类的主要区别在于,统计学模型重点是刻画数据与结果变量之间的关系,而不是对未知个体进行预测;机器学习模型的重点是模型在与模型的预测精度,往往会牺牲掉模型的可解释性追求更高的精度。
因此对应到分类问题中,统计学分类更关注分类模型的可解释性,通过解释模型中的参数提取出数据中的分类规律(个体因为具备了哪些属性所以被分到了某一类);而机器学习分类更多的关注模型的预测效果(模型是个否能够准确预测未知个体的类别)。

4. 概率模型与非概率模型基本思想

分类学习算法可以分为两类:概率模型与非概率模型。概率模型的基本思想是求条件概率P(Y│x),选择概率最大值对应的类别作为分类结果,以获得最小的经验风险;非概率模型的基本思想是直接拟合输入向量x与输出类别y之间的映射关系。
图1 分类算法基本思想的理解

二、分类算法

1.逻辑回归

定义:Logistic Regression逻辑回归属于概率模型,一个单独的逻辑回归只能用于二分类问题(类别用0,1表示),逻辑回归模型如下,其中x为输入的特征向量,ω,b为参数,
P(Y=1│x)=(exp⁡(ωx+b))/(1+exp⁡(ωx+b))
P(Y=0│x)=1/(1+exp⁡(ωx+b))
可以看到对于给定的输入实例x,逻辑回归会得到该实例属于0或1的概率,并将实例x分到概率值较大的一类。

原理及推导
明确目标:已知x求P(Y=1│x)

思考解决办法:找到一个x→p的映射f,即找到一个函数f满足自变量可以取任意值,因变量为一个概率值。

具体解决过程
首先需要引入一个概念,一个事件发生的几率(Odds)是指该事件发生的概率与不发生的概率的比值,那么假设该事件发生的概率为p,那么该事件的几率为

odds= p/(1-p)

对该事件发生的几率取对数即为logit函数,该函数的特点是定义域为(0,1),值域为R,

logit (p)=log p/(1-p)

我们的目标是求概率p,所以取logit函数的反函数,得到sigmoid函数

p=sigmoid(α)=(exp⁡(α))/(1+exp⁡(α))

对于逻辑回归有,

P(Y=1│x)=(exp⁡(α))/(1+exp⁡(α))

其中α可以取任意值且一定要与输入实例x联系起来,逻辑回归中取α=ωx+b,即

P(Y=1│x)=(exp⁡(ωx+b))/(1+exp⁡(ωx+b))

参数估计

逻辑回归利用极大似然估计法估计模型参数

P(Y=1│x)=π(x), P(Y=0│x)=1-π(x)

则似然函数为
在这里插入图片描述
对似然函数取对数后,得到对数似然函数,再求其极大值,即可得到ω的估计值。

逻辑回归Python实现

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.metrics import accuracy_score
# import some data to play with
iris = datasets.load_iris()
X = iris.data[:100, 2:4]
y = iris.target[:100]
X_train, X_test, y_train, y_test =\
    train_test_split(X, y, test_size=0.20, random_state=0)
# Create an instance of Logistic Regression Classifier and fit the data
logreg = LogisticRegression(C=1)
logreg.fit(X_train, y_train)
LogisticRegression(C=1)
y_pred = logreg.predict(X_test)
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))

2.朴素贝叶斯

定义:基于贝叶斯定理与特征条件独立假设的分类方法,对于给定的训练集,首先基于特征独立假设学习输入与输出的联合概率分布;然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y.

原理及推导
明确目标:已知x求P(Y=i│x)

思考解决办法:利用贝叶斯公式
在这里插入图片描述

所以我们要求的就是P(x|Y=i)与P(x),由于x表示特征向量,假设
在这里插入图片描述

每一个特征有k_h (h=1,2,⋯,n)种可能取值,类别数为n,容易得出待求参数P(x|Y=i)共有
在这里插入图片描述
为了减少待求参数,朴素贝叶斯方法提出了特征条件独立的假设,该假设也正是朴素贝叶斯朴素之处。在特征条件独立的假设下,该算法的待求参数量减少到了在这里插入图片描述

参数估计:直接用训练数据集的频率估计概率。

适用范围及优缺点
由于朴素贝叶斯的特征条件独立假设,所以该模型比较适用于特征量较少的小数据集(特征量小独立性假设成立的可能性大)。
朴素贝叶斯很明显的优点就是简单易用,在特征独立假设成立的数据集上表现较好;当然,特征独立性假设也使得朴素贝叶斯适用条件比较苛刻。

朴素贝叶斯算法Python实现

import numpy as np
from sklearn.naive_bayes import GaussianNB # naive bayes
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.metrics import accuracy_score
# import some data to play with
iris = datasets.load_iris()
X = iris.data[:100, 2:4]
y = iris.target[:100]
X_train, X_test, y_train, y_test =\
    train_test_split(X, y, test_size=0.20, random_state=0)
# Create Naive Bayes classifier
classifier = GaussianNB()
# Train the classifier
classifier.fit(X_train, y_train)
# Predict the values
y_pred = classifier.predict(X_test)
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))

3.K近邻

定义:给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的k个实例,这k个实例的多数属于某个类,就把该输入实例分为这个类。

原理及推导
明确目标:已知x,求Y=f(x)
思考解决办法:从训练集中找到与输入实例x最相似的实例x’,根据x’所属的类别来确定输入实例x的类别。为了减小误差以及尽可能的利用训练集数据所提供的信息,我们进一步改进算法,从训练集中选取与输入实例最邻近的k个实例,按照多数表决的思想,将k个相似实例中出现次数最多的类别作为输入实例x的类别。
那么问题是如何根据特征向量判断两个实例的相似性?以及k值如何取?

距离度量
我们利用两个实例点的距离来反映两个实例点的相似程度。这个距离可以是欧式距离、Lp距离或曼哈顿距离等。

在这里插入图片描述
则xi ,xj的Lp距离定义为
在这里插入图片描述
当p=2时,称为欧式距离,p=1时称为曼哈顿距离

k值选取
K值的选择会对k近邻算法产生很大的影响。
如果选择较小的k值,就相当于用较小的邻域中的训练实例进行预测,那么只有与输入实例较为相似的训练实例才会对预测结果起作用,但同时预测结果会对近邻的实例点非常敏感。
如果k值太大,就相当于用较大邻域中的训练实例进行预测。其优点是预测结果对某一个实例不会非常敏感,但同时预测结果可能会受到一些与输入实例不相关的点的影响,比如当k值取最大值,即训练集的实例个数N时,无论输入实例是什么都会被分到出现次数最多的类别中。
因此k值应该选择一个比较适中的值,一般情况下,我们会先取一个较小的数值,然后逐步增大,根据模型评估结果来选择最优的k值。

K近邻算法python实现

import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.metrics import accuracy_score
# import some data to play with
iris = datasets.load_iris()
X = iris.data[:100, 2:4]
y = iris.target[:100]
X_train, X_test, y_train, y_test =\
    train_test_split(X, y, test_size=0.20, random_state=0)
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
clf = KNeighborsClassifier(n_neighbors=5)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分类算法原理及python实现(一) 的相关文章

  • MySQL数据库的导入与导出

    1 数据库的导入 1 1 新建一个数据库名称 create database 数据库名 students 如下 create database students 1 2 使用use命令进入该数据库 如下 use students 1 3 导
  • 监控流媒体服务器的搭建和使用

    需求的提出 海康 大华 宇视等视频监控系统 都有自己的流媒体服务器平台 为什么要还需要通用的流媒体服务器产品呢 这个问题可以从几个方面回答 1 经济性 传统监控厂商的流媒体服务器 由于主要面向城市建设和大型安防项目 往往造价和报价相对较高

随机推荐

  • Android pm 命令详解

    一 pm命令介绍与包名信息查询 1 pm命令介绍 pm工具为包管理 package manager 的简称 可以使用pm工具来执行应用的安装和查询应用宝的信息 系统权限 控制应用 pm工具是Android开发与测试过程中必不可少的工具 sh
  • QT QString与char *之间的转换

    1 QString转char 先将QString转换为QByteArray 再将QByteArray转换为char QString str hello QString转char QByteArray ba str toLatin1 char
  • 启动过滤器异常

    org apache catalina core StandardContext filterStart 启动过滤器异常 org apache catalina core StandardContext filterStart 启动过滤器异
  • 【转载】自监督学习详细介绍(学习笔记)

    原文链接 https blog csdn net Cloris Sue article details 105343762 一 相关文献 fast ai上面关于自监督学习的资料 Self supervised learning and co
  • 云原生之使用docker部署ZPan个人网盘系统

    云原生之使用docker部署ZPan个人网盘系统 一 ZPan介绍 1 ZPan简介 2 ZPan特点 二 检查本地docker环境 1 检查系统版本 2 检查docker版本 3 检查docker服务状态 三 下载ZPan镜像 四 部署Z
  • MySQL根据某个字段判断新增或更新

    有一个 USER表 字段有 id username password email phone 我们需要开发一个创建用户接口 username唯一 判断username是否存在 如果存在 就更新 不存在 就新增 看一下正常代码 创建用户 pu
  • 动态数码管实验

    多位数码管简介 多位数码管 即两个或两个以上单个数码管并列集中在一起形成一体的数码管 当多位一体时 其内部的公共端是独立的 而负责显示什么数字的段线 a dp 全部是连接在一起的 独立的公共端可以控制多位一体中的哪一位数码管点亮 而连接在一
  • 1.linux系统基础笔记(互斥量、信号量)

    操作系统是很多人每天必须打交道的东西 因为在你打开电脑的一刹那 随着bios自检结束 你的windows系统已经开始运行了 如果问大家操作系统是什么 可能有的人会说操作系统就是windows 就是那些可以放大 缩小 移动的窗口 对曾经是计算
  • Jenkins & Harbor

    Harbor 环境搭建 https github com goharbor harbor releases tag v2 5 6 点击下载地址安装包 安装 解压安装包 root localhost tar zxvf harbor offli
  • #if、#else、#endif、#elif、#ifdef、#ifndef的区别和使用

    常用的条件编译 if elif else endif ifdef ifndef 看名字就知道 跟我们平时用的if elseif else是 一样的 不同的是这里一定要记得 endif if 条件 1 代码 1 elif 条件 2 代码 2
  • HashMap底层原理:数据结构+put()流程+2的n次方+死循环+数据覆盖问题

    导航 Java笔记 踩坑汇总 Java基础 进阶 JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud 黑马旅游 谷粒商城 学成在线 MySQL高级篇 设计模式 常见面试题 源码 vincewm的博客 CSDN博客
  • 聊聊 220V交流 过零检测

    聊聊过零检测 以及如何实现过零检测 by 矜辰所致 增加测试结果 2023 6 20 目录 前言 一 什么是过零检测 1 1 为何需要过零检测 二 如何做过零检测 2 1 光耦 2 2 比较器 运放 2 3 三极管 MOS管 2 4 过零检
  • 利用哈弗曼编码

    1 课本教材习题5 18 a 根据字母及空格出现的频率 可构造哈夫曼树 1 根据字母及空格出现的频率 可构造哈夫曼树 如下图 利用哈夫曼编码定义 可得出哈夫曼编码为 z 1111011000 q 1111011001 x 111101101
  • python回文字符串编程_Python刷题:最长回文子串(字符串)

    题目描述 给定一个仅包含小写字母的字符串 求它的最长回文子串的长度 所谓回文串 指左右对称的字符串 解题思路 当字符串不为空时 回文子串最少也是一个字符 即初始长度为1 当回文子串更长时 就可能有两种情况 例如 aa 或 aba 即长度 1
  • 支持Blazor的保护!代码保护工具.NET Reactor v6.3.0.0全新出发

    NET Reactor是一个功能强大的代码保护和软件许可系统 适用于为 NET Framework编写的软件 并支持生成 NET程序集的所有语言 NET Reactor迎来了久违的版本更新 进入v6 3 0 0全新时代 支持Blazor保护
  • 【Vue】v-for循环图片绝对路径,图片无法显示

    1 src 和 src
  • 微信扫码跳转小程序并传参

    1 打开微信公众平台 微信公众平台 扫码登录小程序的后台 开发 开发管理 开发设置 扫普通链接二维码打开小程序 添加 2 输入业务域名 3 下载校验文件 这里我用一个aa txt来替代 把他放到test文件夹下 3 修改nginx的配置文件
  • 27岁活的像个废物一样,没技术没学历,现在学习软件测试还来得及吗?

    为什么会学习软件测试 27岁了 算一下8年了 工作了一年 就没去工作就一 直在家 家里固定每个月给2000 偶尔一个月有四千 但依旧没钱 家里给了一套房子 出门200米就是地铁站 三室 厅住7楼 自己一个人住 属于没有钱 却又饿不死的状态
  • Klokki Mac版常见问题解答

    Klokki Slim Mac破解版是Mac平台上的一款任务管理应用 Klokki Slim Mac版直接从菜单栏提供了一种强大而漂亮的时间跟踪方法 专注于你的工作 享受一种高效的方式来跟踪你在项目上的时间 Klokki 和Klokki S
  • 分类算法原理及python实现(一)

    文章目录 一 分类算法的概念 1 概念 2 应用 3 统计学分类与机器学习分类的区别 4 概率模型与非概率模型基本思想 二 分类算法 1 逻辑回归 2 朴素贝叶斯 3 K近邻 一 分类算法的概念 1 概念 输出变量Y为有限个离散值的预测问题