利用TensorFlow解决逻辑回归问题

使用梯度下降法实现逻辑回归,绘制一条线将是否发给用户信用卡两类数据分开,在machine_learning项目下新建Logistic_regression.py。

1.导入必要的库

import matplotlib.pyplot as plt

import tensorflow as tf

import numpy as np

2.训练逻辑回归

# 创造数据

raw_data_X = [[1.85, 1.05],

                   [1.57, 2.63],

                   [2.28, 1.42],

                   [2.28, 3.64],

                   [1.94, 3.68],

                   [2.09, 2.66],

                   [1.49, 3.66],

                   [0.12, 1.12],

                   [0.25, 1.04],

                   [0.23, 0.54],

                   [0.83, 1.49],

                   [0.95, 0.09],

                   [0.46, 1.63],

                   [0.26, 1.03],

                   ]

raw_data_Y = [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1];

data = np.array(raw_data_X)

label = np.array(raw_data_Y)

data = np.hstack(data).reshape(-1,2)

label = np.hstack(label).reshape(-1,1)

label1 = label.reshape(1,-1)[0]

plt.scatter(data[label1 == 0, 0], data[label1 == 0, 1], marker="*")

plt.scatter(data[label1 == 1, 0], data[label1 == 1, 1], marker="^")

plt.show()

x = tf.placeholder(tf.float32,shape=(None,2))

y_ = tf.placeholder(tf.float32,shape=(None,1))

# tf.random_normal()函数用于从服从指定正态分布的数值中取出指定个数的值

# tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None,
name=None)

weight = tf.Variable(tf.random_normal([2,1]), dtype=tf.float32)

bias = tf.Variable(tf.constant(0.1, shape=[1]))

# tf.nn.sigmoid()是激活函数

y_hat = tf.nn.sigmoid(tf.matmul(x, weight) + bias)

# 不适用该损失函数

# cost = tf.reduce_sum(tf.square(y_ - y_hat))

# 损失函数

cost = - tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y_hat, 1e-10, 1.0)) + \

      (1 - y_) * tf.log(tf.clip_by_value((1 - y_hat), 1e-10, 1.0)))

# 梯度下降

optimizer = tf.train.AdamOptimizer(0.001)

train = optimizer.minimize(cost)

# 开始训练

with tf.Session() as sess:

      sess.run(tf.global_variables_initializer())

      plt.ion()

      for i in range(8000):

             sess.run(train,feed_dict={x:data,y_:label})

             #画出训练后的分割函数

             #mgrid()函数产生两个300×400的数组:0~3每隔0.1取一个数,共300×400个

             xx, yy = np.mgrid[0:3:.1,0:4:.1]

             if (i % 20) == 0:

                    # np.c_用于合并两个数组

                    # ravel()函数将多维数组降为一维,仍返回array数组,元素以列排列

                    grid = np.c_[xx.ravel(), yy.ravel()]

                    probs = sess.run(y_hat, feed_dict={x:grid})

                    # print(probs)

                    probs = probs.reshape(xx.shape)

                    plt.cla() # 清除原有图像

                    plt.scatter(data[label1 == 0, 0], data[label1 == 0, 1], marker="*")

                    plt.scatter(data[label1 == 1, 0], data[label1 == 1, 1], marker="^")

                    plt.contour(xx, yy, probs, levels=[.5])

                    plt.pause(0.00001)

                    print("After %d steps, cost:%f" % (i, sess.run(cost, feed_dict=
{x:data,y_:label})))

      plt.close()

经过8000步的训练后,逻辑回归结果如图所示。

逻辑回归结果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值