机器学习-逻辑回归 logistic regression

本文介绍了一个简单的Logistic回归实现过程,包括数据集构建、模型训练及预测准确率评估。通过Python代码展示了如何从零开始搭建Logistic回归模型,并进行参数更新以最小化损失函数。

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


# logistic回归


import numpy as np
import matplotlib.pyplot as plt


def DataSet(X_orig, Y_orig):

    '''

    :param X_orig:
    :param Y_orig:
    :return: X: shape=(m_examples, n_features+1)
             Y: shape=(m_examples, 1)
    '''
    mExamples = X_orig.shape[0]
    nFeatures = X_orig.shape[1]

    # 训练数据中添加一列为全0,作为x0,theta0的参数,
    # 训练集的维度为m*(n+1)
    trainX = np.zeros((mExamples, nFeatures + 1))
    trainX[:, 0] = np.ones(mExamples)
    trainX[:, 1:] = X_orig

    # 定义标签数组
    trainY = np.zeros((mExamples, 1))
    trainY[:, 0] = Y_orig

    return trainX, trainY



def logisticRegression(X, Y, iteration=1000, learning_rate=0.1, regularization=0):

    '''

    :param X: shape=(m_examples, n_features+1)
    :param Y: shape=(m_examples, 1)
    :param iteration:
    :return: parameters, shape=(n_features+1, 1)
    '''
    # 读取样本个数,特征个数
    m_examples = X.shape[0]
    n_features = X.shape[1 ] -1

    # 初始化参数
    parameters = np.zeros((n_features +1, 1))

    # 开始迭代
    iter_i = 0
    while iter_i <= iteration:
        iter_i = iter_i +1

        Z = np.dot(X, parameters)
        HZ = 1.0 / (1.0 + np.exp(-Z))

        # 计算代价函数(此处不加正则化项,只需要在求梯度的时候加入即可)
        J_cost = np.sum(np.multiply(Y, np.log(HZ)) + np.multiply((1 - Y), np.log(1 - HZ))) / (-m_examples)

        # 计算梯度
        PartDeri = np.dot(X.T, (HZ - Y)) / m_examples

        if regularization > 0:
            PartDeri = PartDeri + (regularization * parameters) / m_examples

        # 更新参数
        parameters = parameters - learning_rate * PartDeri
        parameters = parameters.reshape(n_features + 1, 1)

        print("[", iter_i, "] [cost] ", J_cost)

    return parameters


def predict_all(parameters, X, Y):
    Z = np.dot(X, parameters)
    # HZ = 1.0 / (1.0 + np.exp(-Z))

    m_examples = Z.shape[0]

    i = 0
    while i < m_examples:
        if Z[i] > 0:
            Z[i] = 1
        else:
            Z[i] = 0;
        i = i + 1

    result = np.sum(abs(Z - Y))
    accurancy = 1 - result / m_examples

    return accurancy


if __name__ == '__main__':
    # 创建数据集合
    X_orig = np.arange(0, 10, 1).reshape(10, 1)
    print("X_orig:", X_orig)

    Y_orig = np.array([1, 1, 1, 1, 1, 0, 0, 0, 0, 0])
    print("Y_orig: ", Y_orig)

    X, Y = DataSet(X_orig, Y_orig)
    print("X:", X)
    print("Y", Y)

    parameters = logisticRegression(X, Y, regularization=0)

    accurancy = predict_all(parameters, X, Y)
    print("train accrancy:", accurancy)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值