• 线性二分类——机器学习


    目录

    一、算法思想

     二、算法原理

    三、算法分析

    四、源程序代码

    五、运行结果及分析

    六、总结


    一、算法思想


    (1)二分类:表示分类任务有两个类别,比如我们想识别图片中是不是狗,也就是说,训练一个分类器,输入一幅图片,用特征向量x表示,输出是不是狗,用y=0或1表示。二类分类是假设每个样本都被设置了一个且仅有一个标签 0 或者 1。

     

    (2)多类分类: 表示分类任务中有多个类别, 比如对一堆水果图片分类, 它们可能是橘子、苹果、梨等. 多类分类是假设每个样本都被设置了一个且仅有一个标签: 一个水果可以是苹果或者梨, 但是同时不可能是两者。

    (3)多标签分类: 给每个样本一系列的目标标签. 可以想象成一个数据点的各属性不是相互排斥的(一个水果既是苹果又是梨就是相互排斥的), 比如一个文档相关的话题. 一个文本可能被同时认为是宗教、政治、金融或者教育相关话题。

    (4)二分类函数:对率函数Logistic Function,本身是激活函数,又可以当作二分类的分类函数。

     

    此函数实际上是一个概率计算,它把[ − ∞ , ∞ ]之间的任何数字都压缩到[0,1]之间,返回一个概率值。这就是它的工作原理。

     二、算法原理


            训练时,一个样本x在经过神经网络的最后一层的矩阵运算后的结果作为输入,经过Sigmoid后,输出一个[0,1]之间的预测值。

            我们假设这个样本的标签值为0(属于负类,另外一类是第1类属于正类),如果其预测值越接近0,就越接近标签值,那么误差越小,反向传播的力度就越小。

            推理时,我们预先设定一个阈值,比如上图中的红线,我们设置阈值=0.5,则当推理结果大于0.5时,认为是正类;小于0.5时认为是负类;等于0.5时,根据情况自己定义。

            阈值也不一定就是0.5,也可以是0.65等等,阈值越大,准确率越高,召回率越低;阈值越小则相反。

    三、算法分析


    (1)、先进行正向计算,如z=x1w1+x2w2+b

    (2)、然后进行分类计算a=1/(1+e^z)

    (3)、损失函数计算loss=-[yln(a)+(1-y)ln(1-a)]

    (4)、根据loss的值来判断分类情况是否正确

    四、源程序代码


    1. import matplotlib.pyplot as plt
    2. import numpy as np
    3. from sklearn.metrics import classification_report
    4. from sklearn import tree
    5. import graphviz
    6. #载入数据
    7. data = np.genfromtxt('.csv',delimiter=',')
    8. x_data = data[:,:-1]
    9. y_data = data[:,-1]
    10. plt.scatter(x_data[:,0],x_data[:,-1],c=y_data)
    11. plt.show()
    12. #创建决策树模型
    13. model = tree.DecisionTreeClassifier()
    14. model.fit(x_data,y_data)
    15. #导出决策树
    16. dot_data = tree.export_graphviz(model,
    17. out_file=None,
    18. #特征的名字,要设置
    19. feature_names = ['x','y'],
    20. class_names=['label0','label1'],
    21. filled=True,
    22. rounded=True,
    23. special_characters=True)
    24. graph = graphviz.Source(dot_data)
    25. graph.render('cart_1')
    26. #获取数据值所在范围
    27. x_min,x_max = x_data[:,0].min() - 1,x_data[:,0].max() + 1
    28. y_min,y_max = x_data[:,1].min() - 1,x_data[:,1].max() + 1
    29. #生成网格矩阵
    30. xx,yy = np.meshgrid(np.arange(x_min,x_max,0.02),
    31. np.arange(y_min,y_max,0.02))
    32. z = model.predict(np.c_[xx.ravel(),yy.ravel()])
    33. #扁平化,得到一个一个的点
    34. #ravel和flatten类似,多维数据转一维,flatten不会改变原始数据,而ravel会
    35. z = z.reshape(xx.shape)
    36. #等高线图
    37. #在这里,只有两个高度,0和1
    38. cs = plt.contourf(xx,yy,z)
    39. #样本散点图
    40. plt.scatter(x_data[:,0],x_data[:,1],c=y_data)
    41. plt.show()

    五、运行结果及分析


     

    由图可见,数据几乎被一条线分隔为两部分

    六、总结


            通过本次实验的学习,基本可以实现线性二分类。通过对该方法的学习,发现相同的模型在不同的终止方式、不同的训练次数、损失、梯度的情况下有不同的效果。

            特别是数据标准化前和标准化后的处理有很大的差异,所以要多尝试不同的指定参数。详细的分析方式在之后的内容中介绍。

  • 相关阅读:
    spring5.0 源码解析(day05) initMessageSource();
    小艺的英文名编程求助(帮忙检查)
    214页(10万字)以数据驱动为核心的区域医疗数据中台
    LQ0134 最大降雨量【中位数】
    Maven打包知识点
    我开源了一个加密算法仓库,支持18种算法!登录注册业务可用!
    卷积神经网络中的 Full、Same 和 Valid 卷积
    聚乳酸改性乳清白蛋白/肌白蛋白/豆清白蛋白/蓖麻蛋白/豌豆白蛋白1b ( PA1b)|蛋白偶联修饰
    基于JAVA旅游足迹记录系统计算机毕业设计源码+数据库+lw文档+系统+部署
    【UE 网络】专用服务器和多个客户端加入游戏会话的过程,以及GameMode、PlayerController、Pawn的创建流程
  • 原文地址:https://blog.csdn.net/qq_50942093/article/details/128022541