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


    目录

    一、算法思想

    二、算法原理

    三、算法分析

    四、源程序代码

    五、运行结果及分析

    六、总结


    一、算法思想


            为克服线性函数分类效果不足的问题,非线性分类器中引入了非线性函数来提升分类效果。线性分类器用一个曲面或者多个超平(曲)面的组合将两组样本隔离开。

            一个典型的非线性分类器就是决策树,它的主要思想就是用多个线性分类器的组合来将两组样本隔离开。 决策树采用非常直观的方式来对样本进行分类,你只需要针对样本的特征问一系列问题就能将各样本分离开来。

    二、算法原理


            线性分类:是用一个超平面能将正负样本区分开,表达式为y=wx,对于二维的情况,可以理解为一条直线,如一次函数。他的分类算法是基于一个线性的预测函数,决策的边界是平的,比如直线和平面。

     

            非线性分类:他的分类界面没有限制,可以是一个曲面,或者是多个超平面的组合,那在二维的情况下,应该是一个曲线,如正态分布。

            线性函数:线性函数是指那些线性的函数,但也常做一次函数的别称。

            非线性:是指不按比例,不成直线的关系,一阶导数不为常数。

    三、算法分析


            非线性分类器就是用一个超曲面或者多个超平(曲)面的组合将正、负样本隔离开(即,不属于线性的分类器),如:

     (1)二维平面上的正、负样本用一条曲线或折线来进行分类;

     (2)三维立体空间内的正、负样本用一个曲面或者折面来进行分类;

      (3)N维空间内的正负样本用一个超曲面来进行分类。

    四、源程序代码


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

    五、运行结果及分析


     

    六、总结


    线性分类器可解释性好,计算复杂度较低,不足之处是模型的拟合效果相对弱些。

    非线性分类器效果拟合能力较强,不足之处是数据量不足容易过拟合、计算复杂度高、可解释性不好。

  • 相关阅读:
    聊一聊 C# 弱引用 底层是怎么玩的
    个人网站接入Google Ads的一点心得
    概率 | 【提神醒脑】自用笔记串联
    【Shell】简单的交互式脚本
    记录做碧桂园项目时后端Java踩的坑
    【linux】【platform[1]】简述device和driver几种匹配方式(包括测试用demo)
    创新型中小企业评价标准有哪些?
    [附源码]java毕业设计高校资源共享平台
    Garnet发布 Redis不再是唯一选择
    【python】pip的使用
  • 原文地址:https://blog.csdn.net/qq_50942093/article/details/128022984