利用python和TensorFlow通过SVM解决线性二分类问题

本文示例的模块版本:
python 3.6
tensorflow 1.15(会有很多警告,但不妨碍运行。另2.0很坑,API都变了T-T)

系统构建的具体步骤如下:

步骤1.使用随机的方式建立样本库。在进行标签数据的设置分类时,注意分类需要分正负(值随意):

num_points=200  # 样本数目

vectors_set=[]

x1_PlotData=[]  # 用于后期绘图的数据

y1_PlotData=[]

x2_PlotData=[]

y2_PlotData=[]

for i in range(int(num_points/2)):

    x1=np.random.normal(0.0,0.55)   #横坐标,进行随机高斯处理化,以0为均值,以0.55为标准差

    y1=x1*0.1+0.3+np.random.normal(-0.03,0.03)   #纵坐标,数据点在y1=x1*0.1+0.3上小范围浮动

    vectors_set.append([x1,y1,1])  # 注意标签数据的值,要有正负之分

    x2 = np.random.normal(0.0, 0.55)

    y2 = x2 * 0.1 + 0.5 + np.random.normal(-0.03, 0.03)

    vectors_set.append([x2, y2,-1])  # 注意标签数据的值,要有正负之分

    x1_PlotData.append(x1)

    y1_PlotData.append(y1)

    x2_PlotData.append(x2)

    y2_PlotData.append(y2)

x1_data=[v[0] for v in vectors_set]  # 使用np.mat将list转化为numpy中的矩阵格式

x2_data=[v[1] for v in vectors_set]

y_data=[v[2] for v in vectors_set]

 

步骤2.建立计算流图,包含 “代价函数”和“训练函数”。如下,训练函数为梯度下降:

theta=tf.Variable(np.zeros([3,1]),dtype=tf.float32)  # 新建变量和占位符

x_input=tf.placeholder(tf.float32,shape=[None,3])

y_input=tf.placeholder(tf.float32,shape=[None,1])

 

h_theta=tf.matmul(x_input,theta) # 构建分割直线

 

cost=tf.reduce_mean(tf.maximum(0.0,1.0-h_theta*y_input))+0.01*tf.reduce_mean(tf.square(theta))  # 构建代价(损失)函数

optimizer = tf.train.GradientDescentOptimizer(0.2)  # 选择梯度下降法,并设置步长。

train_step = optimizer.minimize(cost)

 

步骤3.初始化流图,主要是初始化运行环境。如:

sess = tf.Session()

init = tf.global_variables_initializer()

sess.run(init)

 

步骤4.开始训练:向占位符中输入数据,使用sess.run()方法进行训练。如下:

x_plot=[]

y_plot=[]

steps = 2000  # 训练次数

for i in range(steps):

    xs=np.column_stack((np.ones([num_points]), np.mat(x1_data).T,np.mat(x2_data).T))

    ys = np.mat(y_data).T

    feed = { x_input: xs, y_input: ys }

    sess.run(train_step, feed_dict=feed)

    if i % 100 == 0 :  # 每训练100次,记录训练结果

        print("After %d iteration:" % i)

        print("Theta:", sess.run(theta))

        print("Cost: %f" % sess.run(cost, feed_dict=feed))

        x_plot.append(i)

        y_plot.append(sess.run(cost, feed_dict=feed))

 

步骤5.绘制分类结果和“训练次数-代价函数值”曲线,观察训练的收敛趋势。如下:

# 打印最终结果

print("Finnally Result")

print("Theta:" ,sess.run(theta))

print("Cost: %f" % sess.run(cost, feed_dict=feed))

 

# 绘制结果曲线

x_result=[-2,2]

Theta_result=sess.run(theta)

y_result=[]

for x_temp in x_result:  # 如果直接赋值y_result=x_result*W+b,则y_result类型为Tensor,不能直接打印

    y_result.append((-Theta_result[0]-x_temp*Theta_result[1])/Theta_result[2])

plt.subplot(1,2,1)

plt.scatter(x1_PlotData,y1_PlotData,c='g')

plt.scatter(x2_PlotData,y2_PlotData,c='r')

plt.plot(x_result,y_result,'-y')

plt.subplot(1,2,2)

plt.plot(x_plot,y_plot,'-')

plt.show()

 

输出结果大致如下:

Finnally Result

Theta: [[ 3.0790575]

 [ 0.884045 ]

 [-8.339388 ]]

Cost: 0.470947

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值