机器学习与TensorFlow编程(2)逻辑线性回归模型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/irving512/article/details/72843594

0. 参考资料


1. 总体介绍

1.1. 分类(classification)

预测值是离散值(如银行是否放贷),则称此类学习任务为“分类”(classification)。

1.2. 二分类逻辑线性回归思路

  • 输入一系列参数  x  ,构建一系列参数  θ  ,获得因变量,记为  z=θTx 
  •  z  的取值范围可能是  (,+)  ,为了方便分类,将  z  映射到  [0,1]  中,记为  g(z) 
    •  g(z) >=0.5  为正类
    •  g(z) <0.5  为反类
  • 完整公式:  hθ(x)=g(z)=g(θTx)  ,其中  hθ(x) 的取值就是为正类的概率。

2. 逻辑方程(Logistic Function)

  • 初学者(我)不了解这个函数到底牛在哪里,于是查了下知乎Wiki,高端,还不太明白。
  • 函数形式(sigmoid函数):
    h(z)=11+ez
  • 函数图像为S型曲线,自变量取值范围  (,+)  ,因变量取值范围  (0,1) 

3. 损失函数(Loss Function)

  • 函数形式如下:
    Cost(hθ(x),y)={log(hθ(x))log(1hθ(x))if  y=1if  y=0
  • 对于多个训练样本,其函数形式:
    J(θ)=1mi=1mCost(hθ(x(i),y(i)))=1mi=1m[y(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))]
  • 梯度下降公式,在Coursera Week 3 Lecture Notes 中有详细推导:
    θjJ(θ)=1mi=1m[hθ(x(i))y(i)]x(j)

4. 矩阵形式

4.1. 原始数据介绍

  • 假定输入数据一共包含n个特征,m个训练样本,则输入数据为m*(n+1)维矩阵:
    X=111x(1)1x(2)1x(m)1x(1)2x(2)2x(m)2x(1)nx(2)nx(m)n
  • 输入样本结果为:

    y=y(1)y(2)y(m)

  • 要求的参数列表为:

    θ=θ0θ1θn

4.2. 矩阵计算过程

  • 第一步,计算m维向量  z 
    z=Xθ
  • 第二步,通过sigmoid函数计算m维向量  hθ(x)
    hθ(x)=sigmoid(z)=sigmoid(Xθ)
  • 第三步,计算损失函数  J(θ)
    J(θ)=1m[(yTlog(hθ(x))+(1y)Tlog(1hθ(x)))]
  • 第四步,每一次梯度下降的变化量,即n+1维向量grad:
    grad=1mXT(hθ(x)y)
  • 第五步,通过各种优化算法得出  θ  的值,计算测试样本的  hθ(x) ,若结果>=0.5则判断为正例,若结果<0.5则分类为反例。

5. TensorFlow编程实现

  • 数据源:Coursera ML Week2 课后练习数据
  • python源码
import tensorflow as tf
import numpy as np


def read_data(file_name, delimiter=','):
    return np.loadtxt(file_name, delimiter=delimiter)


def init_data(input_data):
    input_x = input_data[:, 0:-1]
    input_y = input_data[:, -1].reshape(m, 1)
    input_x = np.concatenate((np.ones([m, 1]), input_x), 1)
    return input_x, input_y


def tensor_flow_run(input_x, input_y, init_w):
    # 初始化参数
    x = tf.placeholder("float32", [None, n])  # m*n
    y = tf.placeholder("float32", [None, 1])  # m*1
    W = tf.Variable(init_w)  # n*1

    # 构建模型
    z = tf.matmul(x, W)  # m*1
    h = tf.sigmoid(z)  # m*1

    # 构建代价函数
    cost = (tf.reduce_sum(y*tf.log(h)) + tf.reduce_sum((1-y) * (tf.log(1-h)))) / (-m)

    # 梯度下降算法参数配置
    train_op = tf.train.GradientDescentOptimizer(LEARNING_RATE).minimize(cost)

    # 判断训练集合上的准确性
    predict = tf.greater_equal(tf.sigmoid(tf.matmul(x, W)), 0.5)
    y_ = tf.equal(y, 1)
    correct_prediction = tf.equal(predict, y_)
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

    with tf.Session() as sess:
        # 初始化
        init = tf.global_variables_initializer()
        sess.run(init)

        # 梯度下降算法
        for _ in range(ITERATIONS):
            sess.run(train_op, feed_dict={x: input_x, y: input_y})

        # 参数列表
        print('Octave theta: -25.16127 0.20623 0.20147')
        print('Actual theta:', sess.run(W))

        # 代价函数
        print('\nOctave Cost: 0.20350')
        print('Actual Cost:', sess.run(cost, feed_dict={x: input_x, y: input_y}))

        # 正确率
        print('\nOctave Accuracy: 0.89')
        print('Actual Accuracy:', sess.run(accuracy, feed_dict={x: input_x, y: input_y}))


# 设置超参数
LEARNING_RATE = 0.001
ITERATIONS = 500

# 读取数据
raw_data = read_data('ex2data1.txt')

# 获取样本数量,属性数量
m = raw_data.shape[0]
n = raw_data.shape[1]

# 获取输入数据
data = init_data(raw_data)

# 进行机器学习运算
tensor_flow_run(data[0], data[1], [[-25], [0.2], [.2]])

猜你喜欢

转载自blog.csdn.net/irving512/article/details/72843594