在一个机器学习任务中,如果每一条数据的目标值是离散的,则该任务是一个分类任务。

解决分类问题基本的方法有:线性分类器、决策树、朴素贝叶斯、人工神经网络、K近邻(KNN)、支持向量机(SVM);

组合基本分类器的集成学习算法:随机森林、Adaboost、Xgboost等。

一、线性分类器

线性分类器=假设函数+损失函数,假设函数是原始图像数据到类别的映射;

使用线性分类器分类的问题可以转化为最优化问题:通过更新假设函数的参数值来最小化损失函数的值,从而找到最优解。

在线性分类器中,输出是输入的加权和。

常用的线性分类器有:基本线性分类器、最小二乘线性分类器、感知器、逻辑回归分类器。

1.基本线性分类器

原理:

(1)计算目标值为1的所有正例数据的重心和目标值为0的所有负例数据的重心。

(2)计算与正例重心与负例重心距离相等的超平面。

过程:

(1)对训练集中目标值为1的正例逐个属性求均值,得到正例重心;对训练集中目标值为0的负例逐属性求均值,得到负例重心。

(2)正例重心和负例重心相减得到权重向量

(3)将正例重心和负例重心相加除以2得到中点C。

(4)将T=作为分类阈值。对测试集的每个样本x与权重做点乘,若大于T,则分为1;否则分为0。

 python代码:

#1.基本线性分类器
class BaseLinearClassifier:def __init__(self,w=np.zeros((20,1))):#私有属性不允许继承self.weight=w#查看权重系数@propertydef get_weight(self):return self.weight#训练函数def fit(self,xtrain,ytrain):#得到正例索引index1=np.where(ytrain==1)#得到正例重心#axis=0表示“压缩行”,对各列求均值,最终得到1*n矩阵。pos_centriod=np.mean(xtrain[index1[0]],axis=0)#得到负例索引index2=np.where(ytrain==0)#得到负例重心neg_centriod=np.mean(xtrain[index2[0]],axis=0)#得到权重向量self.weight=pos_centriod-neg_centriod#计算阈值T=np.dot(self.weight,1/2*(pos_centriod+neg_centriod))return T#准确率测试def score(self,xtest,ytest,threshold):#测试集预测的类别predict=[]for i in xtest:#若大于阈值,则返回类别1if np.dot(i,self.weight)>=threshold:predict.append(1)#若小于阈值,则返回类别0else:predict.append(0)#计算准确率accuracy=accuracy_score(ytest, predict)return accuracy#调用
baseLR=BaseLinearClassifier()
T=baseLR.fit(xtrain,ytrain)#返回阈值
accuracy_baseLR=baseLR.score(xtest,ytest,T)

2.最小二乘线性分类器

原理:

当预测值与真实值之间的均方误差最小时,预测值与真实值最接近。此时的与b即求解结果。

过程:

(1)把数据集D表示成一个m*(d+1)的矩阵X,每行对应一个样本,前d个元素对应样本的d个属性值,最后一个元素恒为1(把常数项b也合并进w中了)。

(2)此时的求解结果为:

(3)当满秩时,可以按照计算。

python代码:

#2.最小二乘线性分类器
import numpy.linalg as lin
class LsqClassifier(BaseLinearClassifier):
#在继承父类后,如果在子类中重新定义了和父类中名字一样的函数,则先执行子类的,当在子类中找不到时,才去父类中找。def __init__(self):super().__init__()#继承父类中的init属性#训练函数def fit(self,xtrain,ytrain):#按照最终得到的那个公式直接求出权重矩阵。XTX=np.matmul(xtrain.T,xtrain)#np.matmual函数用于矩阵相乘,这里计算出X{T}*XXTX_inv=lin.inv(XTX)#求矩阵的逆XTX_inv_XT=np.matmul(XTX_inv,xtrain.T)self.weight=np.dot(XTX_inv_XT,ytrain)#准确率测试def score(self,xtest,ytest,threshold=0):predict=[]for i in xtest:if np.dot(i,self.weight)>threshold:predict.append(1)else:predict.append(0)accuracy=accuracy_score(ytest, predict)return accuracy@propertydef get_weight(self):return self.weight#调用
lsqLR=LsqClassifier()
lsqLR.fit(xtrain,ytrain)#返回阈值
accuracy_lsqLR=lsqLR.score(xtest,ytest)

3.感知器

原理:

假设有n个输入(每个样本有n个属性),将每个输入值加权求和,然后判断结果是否达到了某一个阈值v,若达到,则输出1;否则为-1。

现在令阈值v=-w_0,新增变量x_0=1,此时公式变为:

过程:

(1)随机初始化权重向量

(2)对每个训练样本,按照公式计算其预期输出(符号函数的定义是,参数大于0时返回1;小于0时返回-1;等于0时返回0)。

(3)当预测值不等于真实值时,修改权重向量:为更新步长,也叫学习速率。由于采用随机梯度下降,所以每次仅选取一个误分类样本来计算梯度。

(4)重复(2)(3),直到数据集没有被错分的样例。

python代码:

#3.感知器
class Perception(BaseLinearClassifier):def __init__(self,learning_rate=0.1):super().__init__(np.random.rand(20,1))self.learning_rate=learning_ratedef fit(self,xtrain,ytrain):#找到训练集中所有正例indexes=np.where(ytrain==1)pos=xtrain[indexes[0],:]#对所有误分类样本进行权重学习,直到所有样本都分类正确,退出迭代;或者达到最大迭代次数,推出迭代。count=0for ite in range(500):#设置最大迭代次数为500for i in pos:if np.dot(i,self.weight)<0:#分类错误self.weight+=self.__learning_rate*np.array(i).reshape(-1,1)#reshape(-1,1)的意思是,我们并不知道原来数组的形状,但我们想让列数变为1列,如果在行的位置填入-1,那么系统会自动计算出需要多少行。else:#正确分类个数加1count+=1if count==len(indexes[0]):#全部分类正确breakdef score(self,xtest,ytest,threshold=0):predict=[]for i in xtest:if np.dot(i,self.weight)>=0:predict.append(1)else:predict.append(0)accuracy=accuracy_score(ytest,predict)return accuracy@propertydef get_weight(self):return self.weight#调用
perception=Perception()
perception.fit(xtrain,ytrain)
accuracy_perception=perception.score(xtest,ytest)

4.逻辑回归分类器

原理:

对于分类问题,需要一个函数能够通过所有的输入预测出类别。

考虑最简单的二分类情况,给定数据集

利用线性回归模型计算得到预测值。

为了分类,需要将z转化为0和1。

考虑选取逻辑函数作为转化函数,将任意值映射到[0,1],实现由值到概率的转换。

先从一条数据拟合的直线开始,沿着最大化可能性(最大化极大似然函数)的方向不断优化,最终求出模型参数。

过程:

(1)令因为w为要求的参数,故去掉前面的负号,转换函数变为:

(2)有

(3)将y视为样本x为0类的概率,1-y视为样本x为1类的概率。二者的比值成为“几率”,一个事件的几率就是指该事件发生的概率与该事件不发生的概率的比值,反映了该事件发生的相对可能性。对几率取对数则得到对数几率(Logit)

(4)若将y视为已知样本为x并且最终被分为0类的概率,即类后验概率p{y=0|x;w}。并且给出记号:p{y=1|x;w}=,则p{y=0|x;w}=1-,则有:

(5)在得到已知参数向量和所有训练样本的情况下,求得似然函数:

(6)

python代码:

sklearn库中有专门的逻辑回归分类器,直接调用即可。

#4.逻辑回归分类器
from sklearn.linear_model import LogisticRegression
lr=LogisticRegression()
lr.fit(xtrain,ytrain)
score=lr.score(xtest,ytest)

机器学习-分类-线性分类器相关推荐

  1. 计算机视觉-图像识别分类线性分类器

    目录 图像识别难点:跨越语义鸿沟 基于规则的分类方法 数据驱动的图像分类方法 图像表示: 分类器: 损失函数 优化方法 训练过程 决策 2.设计 线性分类器: 损失函数 示例: 学习目标: 入门计算机 ...

  2. 【火炉炼AI】机器学习008-简单线性分类器解决二分类问题

    [火炉炼AI]机器学习008-简单线性分类器解决二分类问题 (本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplot ...

  3. 【机器学习】SVM学习(三):线性分类器的求解

    [机器学习]SVM学习(三):线性分类器的求解 2016-10-10 19:56 239人阅读 评论(0) 收藏 举报 本文章已收录于:  机器学习知识库  分类: 机器学习(37)  目录(?)[+ ...

  4. 【机器学习】线性(linear)与非线性(nonlinear)分类器区别

    背景 在机器学习中,主要解决分类任务或回归任务,在这两者中,分类任务更为常见. 分类任务又分为线性(linear)分类和非线性(nonlinear)分类,本文主要介绍线性分类和非线性分类的区别. 区别 ...

  5. TF之LiR:利用TF自定义一个线性分类器LiR对乳腺癌肿瘤数据集进行二分类预测(良/恶性)

    TF之LiR:利用TF自定义一个线性分类器LiR对乳腺癌肿瘤数据集进行二分类预测(良/恶性) 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 X_train = np.float32 ...

  6. 机器学习之基于Fisher线性分类器实现多类人脸的识别

    基于 ORL 人脸库,基于 Fisher 线性分类器实现多类人脸的识别问题. 本次实验相比起之前的二分类人脸识别问题,复杂很多.而且程序的识别效果并不好,应该是程序本身的问题,各位路过的大佬仅当做参考 ...

  7. 【机器学习实验五】基于多分类线性SVM实现简易人机猜拳游戏

    文章目录 基于多分类线性SVM&mediapipe手势关键点实现简易人机猜拳游戏 基于SMO优化的SVM分类算法完整实现版本 SVM决策结果与数据集可视化 多分类SVM实战:基于mediapi ...

  8. 机器学习实战(1)——线性分类器+Logistic回归解决良/恶性乳腺癌肿瘤预测问题

    本文参考书<Python机器学习及实践>(范淼 李超 编著) 理论分析 线性分类器 Logistic回归 随机梯度上升 略 数据分析 代码分析 导入数据 数据包文件名为breast-can ...

  9. 15分钟带你入门sklearn与机器学习——分类算法篇

    作者 | 何从庆 本文转载自AI算法之心(ID:AIHeartForYou) [导读]众所周知,Scikit-learn(以前称为scikits.learn)是一个用于Python编程语言的免费软件机 ...

  10. 来!一起捋一捋机器学习分类算法

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来自:算法与数学之美 可是,你能够如数家珍地说出所有常用的分类算法,以及他们的特征.优 ...

最新文章

  1. 电脑计算机无法关闭什么意思,笔记本电脑无法关闭是什么问题? (长按以关闭计算机以解决问题)...
  2. open python语言实现 pdf_使用python操作Pdf代码实现
  3. SH-20403AXIS12双轴蓝牙移动框架
  4. HDU5982. Relic Discovery
  5. 2017中国开源年会(COSCon'17) 报名正式开启
  6. Django操作原生MySQL的方法:MyModel.objects.raw()执行查询语句
  7. JSP之内置对象、作用域
  8. 从零开始学架构5 - 实战篇
  9. Learn OpenGL(一)图形渲染管线(Pipeline)
  10. SQL注入工具大比拼
  11. 设计一个正方形类,其中包括边长一个属性,包括构造函数,析构函数,求面积的成员函数和求周长的成员函数,通过正方形类定义2个正方形对象,并求建设一个下图所示的活动场地的费用。(用户输入中间草坪场地的边长)
  12. JS计算今天在本月第几周
  13. c++ 隐藏和显示标题栏
  14. BOSS创投社群:要想成为富人,得改变原有思维,谈谈什么是富人思维模式!
  15. RxJava在Android移动端开发中的实战应用之一
  16. Esp8266进阶之路10 【小实战下篇】Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。(带Demo)
  17. CV15 轮廓检测:霍夫变换原理及应用
  18. Flutter 自定义Dialog
  19. gm怎么刷东西 rust_我想知道GM刷装备的命令,越多越好,最好是1-13套全能刷的...
  20. 动画:面试官问我 0.1 + 0.2 __ 0.3 ? 为什么?该如何正确回答?

热门文章

  1. suse linux 10 下载,SUSE Linux 10下载
  2. 计算机汇编语言教程pdf,汇编语言实践教程.pdf
  3. BT5的 U盘启动 制作
  4. Android 动画 - TranslateAnimation位移动画
  5. 开源代码授权Licence说明
  6. VS2008编译的程序运行提示“由于应用程序配置不正确,应用程序未能启动”
  7. 李永乐老师讲博弈论:帝王为啥要杀掉有功之臣
  8. 让 Microsoft Office 下课!强烈推荐WPS2005!!
  9. 人工智能降噪插件Topaz DeNoise AI
  10. ionic-vue 开发app移动端