目录
一、算法思想
为克服线性函数分类效果不足的问题,非线性分类器中引入了非线性函数来提升分类效果。非线性分类器用一个曲面或者多个超平(曲)面的组合将两组样本隔离开。
一个典型的非线性分类器就是决策树,它的主要思想就是用多个线性分类器的组合来将两组样本隔离开。 决策树采用非常直观的方式来对样本进行分类,你只需要针对样本的特征问一系列问题就能将各样本分离开来。
二、算法原理
线性分类:是用一个超平面能将正负样本区分开,表达式为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()
五、运行结果及分析
六、总结
线性分类器可解释性好,计算复杂度较低,不足之处是模型的拟合效果相对弱些。
非线性分类器效果拟合能力较强,不足之处是数据量不足容易过拟合、计算复杂度高、可解释性不好。