利用python和TensorFlow解决逻辑回归问题

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

使用随机的方法成样两个样本集,使用逻辑回归的方法对两个样本集进行分类。步骤如下:

步骤1. 建立数据源(样本库)——使用随机初始化的方式。由于需要进行逻辑分类,需要建立2个数据类,并合并在一起。如下:

num_points=1000  # 样本数目

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,0])

    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,假设函数 ,代价函数,优化算法选择梯度下降法,并设置步长:

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

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

y_input=tf.placeholder(tf.float32)

 

h_theta=1/(1+tf.exp(-tf.matmul(x_input,theta))) # 构建假设函数

 

cost=-tf.reduce_mean(y_input*tf.log(h_theta)+(1-y_input)*tf.log(1-h_theta))  # 构建代价(损失)函数

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

train_step = optimizer.minimize(cost)

 

步骤3.初始化流图:

sess = tf.Session()

init = tf.global_variables_initializer()

sess.run(init)

 

步骤4.开始训练,同时记录训练过程:

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.输出训练结果,主要为训练参数theta和损失值(代价值):

print("Finnally Result")

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

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

 

步骤6.在样本集中绘制训练后的直线,和“训练次数-损失”曲线,一边观察训练结果:

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: [[-10.052092]

 [ -2.693136]

 [ 27.155874]]

Cost: 0.084509

绘制的曲线:

虽然代价值比较大,但从途中可以看出直线已经拟合的比较好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值