自己利用Logistic函数做一个梯度下降模型

博主在阅读《机器学习算法原理与编程实践》并尝试使用Logistic函数实现梯度下降模型时遇到了困惑。主要问题包括:1) 梯度下降的权重更新方式与预期不同;2) 单一特征如何通过权重计算目标特征;3) logistic回归中阈值判断的标准。尽管模型已编写完成,但博主对于某些概念仍感到迷茫。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据来源于《机器学习算法原理与编程实践》中的“testset.txt”

import numpy as np
import matplotlib.pyplot as plt


def scatter_data(data):
    plt.figure(figsize=(10, 9))
    for i in range(data.shape[0]):
        if data[i, -1] == 0:
            plt.scatter(data[i, 0], data[i, 1], marker='o', c='r', s=30)
        else:
            plt.scatter(data[i, 0], data[i, 1], marker='s', c='g', s=30)
    plt.xlabel('first_column_feature', fontsize=12)
    plt.ylabel('second_column_feature', fontsize=12)
    plt.show()
    
    return None

def plot_data(data, weight):
    plt.figure(figsize=(10, 9))
    plt.scatter(data[:, 0], data[:, 1], c=data[:, -1])
    x = np.linspace(-3, 3, 100)
    a = -weight[1]/weight[2]     # 怎么利用权重
    b = -weight[0]/weight[2]
    y = a*x + b
    plt.plot(x, y, c='r', lw=2)
    plt.show()
    
    return None

def logistic_function(fx, *threshold):
    output = 1/(1 + np.exp(-fx))
#    output[output > threshold] = 1
#    output[output <= threshold] = 0
    
    return output

def test_data(data, weight):
    b = np.ones([data.shape[0], 1])
    data_test = np.hstack([b, data])
    print(data_test)
    fx = np.dot(data_test, weight)
    print(fx)
    prob = 1/(1 + np.exp(-fx))
#    if prob > 0.5:
#        return 1.0
#    else:
#        return 0
    print(prob)
    prob[prob>0.5] = 0
    prob[prob<=0.5] = 1.0
    return prob


if __name__ == '__main__':
    np.set_printoptions(suppress=True, precision=2)
    data = np.loadtxt('./testset.txt')
    # 分离数据集
    x = data[:, :-1]
    y = data[:, -1].reshape(-1, 1)
    
    # 构建新的x,主要是包含了偏执bias
    b = np.ones([x.shape[0], 1])
    x = np.hstack([b, x])

    # 绘制不同数据集的图像
#    scatter_data(data)
#    
#    # 定义步长和迭代次数
    alpha = 0.01
    steps = 500
    weight = np.ones([x.shape[1], 1])           # 初始化权重
#    
#    # 主程序:迭代过程
    w_ls = []
    for i in range(steps):         # 为什么我做的权重没变
        w_ls.append(weight)
        fx = np.dot(x, weight)
        output = logistic_function(fx, 0.5)
        error = y - output
        weight = weight + alpha*np.dot(x.T, error)
#        if i == 30:
#            break
#    print(weight)
    plot_data(data, weight)
    
    # 对测试数据进行预测
    x_test = np.array([[-0.1473, 2.8748], [-0, 0], [0, 10]])
    test_label = test_data(x_test, weight)
    print(test_label)

以上代码有几个不懂的地方:
1、这里的梯度下降和自己理解为倒数的好像不太一样,不像是一个倒数,而且权重的更新不太懂为什么要这么实现,为什么不是 weight = weight - alpha*np.dot(x.T, error),而是用+
2、输入一个特征,怎么利用权重算另外一个特征。因为按照自己往常的理解,是直接输入两个特征进行训练的。
3、logistic回归中什么大于阈值归为1还是0,搞不懂。
哎呀,虽然写出来了,但还是很迷茫,好多东西都没搞清楚,贼jer难受。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值