一般分类任务主要有两个步骤:1.训练;2.测试。
对于KNN来讲,没有训练过程。只是将训练数据与训练数据进行距离度量来实现分类。
对于SVM来讲,是先在训练集上训练一个模型,然后用这个模型直接对测试集进行分类。这两个步骤是独立的。
KNN:
SVM:
KNN是模糊分类,寻找每个人的特征,然后根据这些人的特征对其归类,重点是“一个人一个人的找”,比如妈妈有双眼皮,爸爸有单眼皮,预测孩子就是单眼皮这样子,至于有没有基因突变,这个不管。
SVM是规则分类,开始先找了一小拨人,对这一小堆人进行归类,找到规律,比如“黄种人一般是黄皮肤,白种人一般是白皮肤”,然后扩大到每个人的特征,对人进行归类,个人认为在速率上要比KNN快
svm, 就像是在河北和北京之间有一条边界线,如果一个人居住在北京一侧就预测为北京人,在河北一侧,就预测为河北人。但是住在河北的北京人和住在北京的河北人就会被误判。
knn,就是物以类聚,人以群分。如果你的朋友里大部分是北京人,就预测你也是北京人。如果你的朋友里大部分是河北人,那就预测你是河北人。不管你住哪里。
定义:
支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。
我个人理解:就是根据一定的数据计算出一个函数,然后把这个函数作为标准,去判断后面的数据是否合规,和高中学的概率部分很像。
目标函数能够体现SVM的基本定义。
极大值问题转化为极小值问题
目的:让分类更合理
目标函数的变化,及C的引入(能够体现容错能力)
升维,二位的变成三维的,可能能够很好的用平面分开。
升维效果展示
添加的相关注释:(有一些比较零碎,所以都放上来了)
#加载相关包
import numpy as np #numpy是深度学习一个经典的包,主要是做数据的转换
from matplotlib import colors #画图有关的包
from sklearn import svm #sklearn工具包,包含一些算法,可以调用
from sklearn import model_selection #sklearn工具包
import matplotlib.pyplot as plt #做图的包
import matplotlib as mpl #
#加载数据、切分数据集
# ======将字符串转化为整形==============
def iris_type(s):
it = {b'Iris-setosa':0, b'Iris-versicolor':1,b'Iris-virginica':2}
return it[s] #set这些都是鸢尾花的名字 把他命名为0,1,2三类
# 1 数据准备
# 1.1 加载数据
data = np.loadtxt('/home/aistudio/data/data2301/iris.data', # 数据文件路径i
dtype=float, # 数据类型
delimiter=',', # 数据分割符
converters={4:iris_type}) # 将第五列使用函数iris_type进行转换
print(data) #提取之后给data
# # 1.2 数据分割
# x, y = np.split(data, (4, ), axis=1) # 数据分组 第五列开始往后为y 代表纵向分割按列分割
# x = x[:, :2]
# x_train, x_test, y_train, y_test=model_selection.train_test_split(x, y, random_state=1, test_size=0.2)
# 1.2 数据分割
x, y = np.split(data, (4, ), axis=1) # 数据分组 第五列开始往后为y 代表纵向分割按列分割
#print(x)
x = x[:, :2]
#print(x)
x_train, x_test, y_train, y_test=model_selection.train_test_split(x, y, random_state=1, test_size=0.2)
#分成训练集和测试集 后面他们的比例5:1
print(x_train)
# SVM分类器构建
def classifier(): #规定这个分配器的一些性质
clf = svm.SVC(C=0.5, #是容错率,默认值是1(对噪声的兼容性)
kernel='rbf', #线性核Kernel='rbf':高斯核
decision_function_shape='ovr') #决策函数
return clf
# 训练模型
def train(clf, x_train, y_train): #将训练数据导入,将分类器参数导入,进行模型训练
clf.fit(x_train, #训练集特征向量
y_train.ravel()) #训练集目标值
# 2 定义模型 SVM模型定义
clf = classifier()
# 3 训练模型
train(clf, x_train, y_train)
#展示训练结果及验证结果
# ======判断a,b是否相等计算acc的均值
def show_accuracy(a, b, tip):
acc = a.ravel() == b.ravel()
print('%s Accuracy:%.3f' %(tip, np.mean(acc))) #计算准确率
# 分别打印训练集和测试集的准确率 score(x_train, y_train)表示输出 x_train,y_train在模型上的准确率
def print_accuracy(clf, x_train, y_train, x_test, y_test):
print('training prediction:%.3f' %(clf.score(x_train, y_train)))
print('test data prediction:%.3f' %(clf.score(x_test, y_test)))
# 原始结果和预测结果进行对比 predict() 表示对x_train样本进行预测,返回样本类别
show_accuracy(clf.predict(x_train), y_train, 'traing data')
show_accuracy(clf.predict(x_test), y_test, 'testing data')
# 计算决策函数的值 表示x到各个分割平面的距离
# print('decision_function:\n', clf.decision_function(x_train))
# 4 模型评估
print('-------- eval ----------')
print_accuracy(clf, x_train, y_train, x_test, y_test) #Accurty
# 5 模型使用
# print('-------- show ----------')
# draw(clf, x)
实际运行的各个部分结果:
切分数据集部分:
最终结果: