深度学习第四课

SVM和KNN的对比分析

从原理上面来讲:

一般分类任务主要有两个步骤:1.训练;2.测试。

对于KNN来讲,没有训练过程。只是将训练数据与训练数据进行距离度量来实现分类。

对于SVM来讲,是先在训练集上训练一个模型,然后用这个模型直接对测试集进行分类。这两个步骤是独立的。

从解析图上面来说:

KNN:

深度学习第四课_第1张图片

SVM:

深度学习第四课_第2张图片

从我个人理解上来讲:

KNN是模糊分类,寻找每个人的特征,然后根据这些人的特征对其归类,重点是“一个人一个人的找”,比如妈妈有双眼皮,爸爸有单眼皮,预测孩子就是单眼皮这样子,至于有没有基因突变,这个不管。

SVM是规则分类,开始先找了一小拨人,对这一小堆人进行归类,找到规律,比如“黄种人一般是黄皮肤,白种人一般是白皮肤”,然后扩大到每个人的特征,对人进行归类,个人认为在速率上要比KNN快

也有一个比喻:

svm, 就像是在河北和北京之间有一条边界线,如果一个人居住在北京一侧就预测为北京人,在河北一侧,就预测为河北人。但是住在河北的北京人和住在北京的河北人就会被误判。

knn,就是物以类聚,人以群分。如果你的朋友里大部分是北京人,就预测你也是北京人。如果你的朋友里大部分是河北人,那就预测你是河北人。不管你住哪里。

SVM原理梳理

定义:

支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。

我个人理解:就是根据一定的数据计算出一个函数,然后把这个函数作为标准,去判断后面的数据是否合规,和高中学的概率部分很像。

首先要进行第一步的计算:计算点到平面的距离

深度学习第四课_第3张图片

 整一个目标函数(没有函数就缺少了这条“线”)

目的:找到一条线,使得离该线 最近的点 能够最远。
深度学习第四课_第4张图片

 放缩变换和优化目标

深度学习第四课_第5张图片

目标函数能够体现SVM的基本定义。

部分数学原理部分 

简化最终目标函数:

w b 通过相关关系,全部转化为 a 相关的参数,方便进行求解。
深度学习第四课_第6张图片

极大值问题转化为极小值问题 

深度学习第四课_第7张图片

软间隔优化

目的:让分类更合理

深度学习第四课_第8张图片

目标函数的变化,及C的引入(能够体现容错能力) 

深度学习第四课_第9张图片

核函数(分类好的关键)

升维,二位的变成三维的,可能能够很好的用平面分开。

深度学习第四课_第10张图片 

升维效果展示

深度学习第四课_第11张图片 

深度学习第四课_第12张图片 

 

SVM代码在百度飞桨上实际运行,添加注释的截图

添加的相关注释:(有一些比较零碎,所以都放上来了)

#加载相关包
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) 

一些比较完整的截图:深度学习第四课_第13张图片

 深度学习第四课_第14张图片

 

实际运行的各个部分结果:

加载数据:

深度学习第四课_第15张图片

 切分数据集部分:

深度学习第四课_第16张图片

最终结果:

深度学习第四课_第17张图片 

 

 

你可能感兴趣的:(深度学习,支持向量机,机器学习)