利用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

绘制的曲线:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
逻辑回归是一种二分类模型,它的目标是根据输入变量的预测输出变量的概率。在 TensorFlow 中,可以使用 `tf.keras` 实现逻辑回归模型。 以下是一个简单的逻辑回归实验的实验原理: 1. 加载数据集:首先,需要加载数据集。可以使用 `tf.keras.datasets` 中的数据集,例如 `tf.keras.datasets.mnist`。这个数据集包含手写数字的图像,可以用于训练一个逻辑回归模型来识别手写数字。 2. 数据预处理:接下来,需要对数据进行预处理。对于 MNIST 数据集,可以将图像像素的除以 255 进行归一化,以使其在 0 到 1 之间。 3. 构建模型:使用 `tf.keras.Sequential` 构建模型。逻辑回归模型只有一个输出节点,并使用 sigmoid 函数作为激活函数。 4. 编译模型:使用 `model.compile` 函数编译模型,指定损失函数和优化器。 5. 训练模型:使用 `model.fit` 函数训练模型。训练过程中,可以指定批次大小、训练轮数等参数。 6. 评估模型:使用 `model.evaluate` 函数评估模型的性能。可以使用测试集对模型进行评估,并计算准确率等指标。 以下是一个示例代码: ```python import tensorflow as tf # 加载 MNIST 数据集 (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() # 数据预处理 x_train, x_test = x_train / 255.0, x_test / 255.0 # 构建模型 model = tf.keras.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(1, activation='sigmoid') ]) # 编译模型 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, epochs=5, batch_size=32) # 评估模型 model.evaluate(x_test, y_test) ``` 在这个例子中,我们首先加载了 MNIST 数据集,并对数据进行了归一化处理。然后,我们使用 `Sequential` 构建了一个仅包含一个输出节点的逻辑回归模型,并使用 `compile` 函数编译了模型。接着,我们使用 `fit` 函数训练模型,并使用 `evaluate` 函数评估模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值