TensorFlow(五) 线性支持向量机的使用

#在TensorFlow实现一个soft margin 支持向量机
#损失函数 惩罚项 使用L2范数
# 1/n*Σmax(0, y(Ax-b)) +Σ||A||^2
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from sklearn import  datasets

sess=tf.Session()
#加载鸢尾花集合
iris=datasets.load_iris()
#提取特征
x_vals=np.array([ [x[0],x[3] ]for x in iris.data])
#山鸢尾花为1 否则为-1
y_vals=np.array([  1 if y==0 else -1  for y in iris.target])

#分割训练集 测试集
train_indices=np.random.choice(len(x_vals),round(len(x_vals)*0.8),replace=False)
test_indices=list(set(range(len(x_vals)))-set(train_indices))
#数组分片操作 使得 x_vals必须要array类型
x_vals_train=x_vals[train_indices]
y_vals_trian=y_vals[train_indices]

x_vals_test=x_vals[test_indices]
y_vals_test=y_vals[test_indices]

#设置批量大小 希望用非常大的批量 因为小的批量会使 最大间隔线缓慢移动
batch_size=80

#设置变量 占位符
x_data=tf.placeholder(shape=[None,2],dtype=tf.float32)
y_target=tf.placeholder(shape=[None,1],dtype=tf.float32)

A=tf.Variable(tf.random_normal(shape=[2,1]))
b=tf.Variable(tf.random_normal(shape=[1,1]))

#输出 y=Ax-b
model_out=tf.subtract(tf.matmul(x_data,A),b)

#声明最大间隔损失函数。首先声明一个函数计算L2范数,接着增加间隔参数alpha
l2_norm=tf.reduce_sum(tf.square(A))
alpha=tf.constant([0.1])
l2=tf.multiply(alpha,l2_norm)
#分类器 该处y为真实值  1/n*Σmax(0, y(Ax-b)) +Σ||A||^2
classification_term=tf.reduce_mean(tf.maximum(0.,tf.subtract(1.,tf.multiply(y_target,model_out))))
loss=tf.add(classification_term,l2)

#增加预测函数 和 准确度函数
prediction=tf.sign(model_out)  #tf.sign ==-1,0,1
accuracy=tf.reduce_mean(tf.cast(tf.equal(prediction,y_target) ,tf.float32))
#梯度下降
my_opt=tf.train.GradientDescentOptimizer(0.01)
train_step=my_opt.minimize(loss)

#初始化上述变量
init=tf.global_variables_initializer()
sess.run(init)

#开始遍历迭代
loss_rec=[]
train_acc_rec=[]
test_acc_rec=[]
l2_rec=[]
for i in range(500):
    rand_index=np.random.choice(len(x_vals_train),size=batch_size)
    #shape(None,2)
    rand_x= x_vals_train[rand_index]
    rand_y= np.transpose([y_vals_trian[rand_index]])
    #运行
    sess.run(train_step,feed_dict={x_data:rand_x,y_target:rand_y})
    temp_loss =sess.run(loss,feed_dict={x_data:rand_x,y_target:rand_y})
    #添加记录
    loss_rec.append(temp_loss)
    #带入所有训练集 查看精确度
    train_acc_temp=sess.run(accuracy,feed_dict={x_data:x_vals_train,y_target:np.transpose([y_vals_trian])})
    train_acc_rec.append(train_acc_temp)
    # 带入所有测试集 查看精确度
    test_acc_temp=sess.run(accuracy,feed_dict={x_data:x_vals_test,y_target:np.transpose([y_vals_test])})
    test_acc_rec.append(test_acc_temp)
    l2_rec.append(sess.run(l2))
    #打印
    if (i+1)%100==0:
        print(‘Step:%d  A=%s ‘%(i,str(sess.run(A))))
        print(‘b=%s‘%str(sess.run(b)))
        print(‘Loss:%s‘% str(temp_loss))

#抽取系数 画图
[[a1],[a2]]=sess.run(A)
[[b]]=sess.run(b)
#a1x1+a2*x2-b=0 ==> x1=-a2*x2/a1 +  b/a1
slope=-a2/a1
y_intercept=b/a1
x1_vals=[ x[1] for x in x_vals]
#最优分割线 对应所有数据
best_fit=[]
for i in x1_vals:
    best_fit.append(slope*i+y_intercept)
#展示全部数据
setosa_x=[ s[1] for i,s in enumerate(x_vals) if y_vals[i] == 1]
setosa_y=[ s[0] for i,s in enumerate(x_vals) if y_vals[i] == 1]

not_setpsa_x=[ s[1] for i,s in enumerate(x_vals) if y_vals[i] == -1]
not_setpsa_y=[ s[0] for i,s in enumerate(x_vals) if y_vals[i] == -1]
plt.plot(setosa_x,setosa_y,‘o‘,label=‘Setosa‘)
plt.plot(not_setpsa_x,not_setpsa_y,‘x‘,label=‘Non-Setosa‘)
plt.plot(x1_vals,best_fit,‘r-‘,label=‘Linear Seprator‘)
plt.xlabel(‘Pedal Width‘)
plt.ylabel(‘Sepal Width‘)
plt.ylim([0,10])
plt.legend(loc=‘upper left‘)
plt.show()

plt.plot(train_acc_rec,‘k-‘,label=‘Training Accrary‘)
plt.plot(test_acc_rec,‘r--‘,label=‘Test Accrary‘)
plt.title(‘Train and Test Accrary‘)
plt.xlabel(‘Generation‘)
plt.ylabel(‘ Accrary ‘)
plt.legend(loc=‘lower right‘)
plt.show()

plt.plot(loss_rec,‘k-‘,label=‘Loss‘)
plt.title(‘Loss per Generation‘)
plt.xlabel(‘Generation‘)
plt.ylabel(‘ loss ‘)
plt.plot(l2_rec,‘r-‘,label=‘L2‘)
plt.show()

原文地址:https://www.cnblogs.com/x0216u/p/9186851.html

时间: 2024-10-11 09:11:18

TensorFlow(五) 线性支持向量机的使用的相关文章

支持向量机原理(五)线性支持回归

支持向量机原理(一) 线性支持向量机 支持向量机原理(二) 线性支持向量机的软间隔最大化模型 支持向量机原理(三)线性不可分支持向量机与核函数 支持向量机原理(四)SMO算法原理 支持向量机原理(五)线性支持回归 在前四篇里面我们讲到了SVM的线性分类和非线性分类,以及在分类时用到的算法.这些都关注与SVM的分类问题.实际上SVM也可以用于回归模型,本篇就对如何将SVM用于回归模型做一个总结.重点关注SVM分类和SVM回归的相同点与不同点. 1. SVM回归模型的损失函数度量 回顾下我们前面SV

支持向量机原理(二) 线性支持向量机的软间隔最大化模型

? ? ? ? ? ?支持向量机原理(一) 线性支持向量机 支持向量机原理(二) 线性支持向量机的软间隔最大化模型 支持向量机原理(三)线性不可分支持向量机与核函数 支持向量机原理(四)SMO算法原理 支持向量机原理(五)线性支持回归 在支持向量机原理(一) 线性支持向量机中,我们对线性可分SVM的模型和损失函数优化做了总结.最后我们提到了有时候不能线性可分的原因是线性数据集里面多了少量的异常点,由于这些异常点导致了数据集不能线性可分,本篇就对线性支持向量机如何处理这些异常点的原理方法做一个总结

支持向量机原理(一) 线性支持向量机

? ? ? ? ? ?支持向量机原理(一) 线性支持向量机 支持向量机原理(二) 线性支持向量机的软间隔最大化模型 支持向量机原理(三)线性不可分支持向量机与核函数 支持向量机原理(四)SMO算法原理 支持向量机原理(五)线性支持回归 支持向量机(Support Vecor Machine,以下简称SVM)虽然诞生只有短短的二十多年,但是自一诞生便由于它良好的分类性能席卷了机器学习领域,并牢牢压制了神经网络领域好多年.如果不考虑集成学习的算法,不考虑特定的训练数据集,在分类算法中的表现SVM说是

02-31 线性支持向量机

[TOC] 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/nickchen121/ 线性支持向量机 在线性可分支持向量机中说到线性可分支持向量机有一个缺点是无法对异常点做处理,也正是因为这些异常点导致数据变得线性不可分或者会因为它的正好被判断为支持向量导致模型的泛化能力变差. # 异常点导致数据线性不可分图例 import matplotlib.pyplot as plt from matp

svm支持向量机系列(1) -- 线性支持向量机

1.主要内容 沿着之前学些机器学习基石课程中学习到的工具进行分析,该工具主要就是vc维,沿着特征转换这一目标进行探讨: (1).当数据的特征的数量很大时,如何进行特征转换?支撑向量机 (2).能不能找到具有预测性的特征然后联合起来? (3).如何发现隐藏的具有预测意义的特征?原先的神经网络到现在的深度学习技术. 这节课主要讲述svm的由来,背后的原理,最佳化的求解问题. 2.线性支持向量机的由来 (1).从线性分类器说起到svm问题的提出 如果数据线性可分,那么必然可以找到一条线对齐进行分类,计

线性支持向量机(4)

对于线性支持向量机学习来说,模型为分离超平面w*x+b*=0及决策函数f(x)=sign(w*x+b*),其学习策略为软间隔最大化,学习算法为凸二次规划.线性支持向量机学习还有另外一种解释,也就是最小化如下目标函数: 第一项是经验损失,函数: 称为合页损失函数,下标+表示以下取正值的函数:

第五章 支持向量机

边界:感知 在逻辑回归中,$p(y=1 \mid x;\theta)$的概率由$h_{\theta}(x)=g(\theta^{T}x)$建立模型.当$h_{\theta}(x)\geq 0.5$则预测x的输出为1.或者说当$\theta_{x} \geq 0$则预测x的输出为1.因此当$\theta_{x} \gg 0$时,我们认为准确预测输出为1. 如上图,点A可以准确预测为x,而C点距离判决边界太近,无法做出准确预测.因此,我们希望找到一个判决边界,使得基于训练样本可以做出准确预测. 标记

斯坦福CS229机器学习课程笔记五:支持向量机 Support Vector Machines

SVM被许多人认为是有监督学习中最好的算法,去年的这个时候我就在尝试学习.不过,面对长长的公式和拗口的中文翻译最终放弃了.时隔一年,看到Andrew讲解SVM,总算对它有了较为完整的认识,总体思路是这样的:1.介绍间隔的概念并重新定义符号:2.分别介绍functional margins与geometric margins:3.由此引出最大间隔分类器,同时将最优化问题转化为凸函数的优化问题:4.补充了拉格朗日对偶性的知识:5.利用拉格朗日对偶性,推导最大间隔分类器最优化的对偶问题,即SVM的最优

tensorflow(五)

一.单机编程框架 单机程序是指启动和运行都在一台机器的一个进程中完成,因为没有网络开销,非常适合参数不多.计算量小的模型. 步骤,创建单机数据流图,创建并运行单机会话. saver = tf.train.Saver() sess = tf.InteractiveSession() tf.global_variables_initializer().run() for i in range(1000): batch_xs,batch_ys = mnist.train.next_batch(100)