目录
为克服线性函数分类效果不足的问题,非线性分类器中引入了非线性函数来提升分类效果。非线性分类器用一个曲面或者多个超平(曲)面的组合将两组样本隔离开。
一个典型的非线性分类器就是决策树,它的主要思想就是用多个线性分类器的组合来将两组样本隔离开。 决策树采用非常直观的方式来对样本进行分类,你只需要针对样本的特征问一系列问题就能将各样本分离开来。
线性分类:是用一个超平面能将正负样本区分开,表达式为y=wx,对于二维的情况,可以理解为一条直线,如一次函数。他的分类算法是基于一个线性的预测函数,决策的边界是平的,比如直线和平面。

非线性分类:他的分类界面没有限制,可以是一个曲面,或者是多个超平面的组合,那在二维的情况下,应该是一个曲线,如正态分布。
线性函数:线性函数是指那些线性的函数,但也常做一次函数的别称。
非线性:是指不按比例,不成直线的关系,一阶导数不为常数。
非线性分类器就是用一个超曲面或者多个超平(曲)面的组合将正、负样本隔离开(即,不属于线性的分类器),如:
(1)二维平面上的正、负样本用一条曲线或折线来进行分类;
(2)三维立体空间内的正、负样本用一个曲面或者折面来进行分类;
(3)N维空间内的正负样本用一个超曲面来进行分类。
-
- import matplotlib.pyplot as plt
- import numpy as np
- from sklearn.metrics import classification_report
- from sklearn import tree
- from sklearn.model_selection import train_test_split
- import graphviz
- #载入数据
- data = np.genfromtxt('test2.csv',delimiter=',')
- x_data = data[:,:-1]
- y_data = data[:,-1]
- plt.scatter(x_data[:,0],x_data[:,-1],c=y_data)
- plt.show()
- #分割数据
- x_train,x_test,y_train,y_test = train_test_split(x_data,y_data)
- #创建决策树模型
- model = tree.DecisionTreeClassifier()
- model.fit(x_data,y_data)
- #导出决策树
- dot_data = tree.export_graphviz(model,
- out_file=None,
- #特征的名字,要设置
- feature_names = ['x','y'],
- class_names=['label0','label1'],
- filled=True,
- rounded=True,
- special_characters=True)
- graph = graphviz.Source(dot_data)
- graph.render('cart_1')
- #获取数据值所在范围
- x_min,x_max = x_data[:,0].min() - 1,x_data[:,0].max() + 1
- y_min,y_max = x_data[:,1].min() - 1,x_data[:,1].max() + 1
- #生成网格矩阵
- xx,yy = np.meshgrid(np.arange(x_min,x_max,0.02),
- np.arange(y_min,y_max,0.02))
- z = model.predict(np.c_[xx.ravel(),yy.ravel()])
- #扁平化,得到一个一个的点
- #ravel和flatten类似,多维数据转一维,flatten不会改变原始数据,而ravel会
- z = z.reshape(xx.shape)
- #等高线图
- #在这里,只有两个高度,0和1
- cs = plt.contourf(xx,yy,z)
- #样本散点图
- plt.scatter(x_data[:,0],x_data[:,1],c=y_data)
- plt.show()

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