【机器学习】Exam3

线性可分logistic逻辑回归

数据集点被分为了两边,根据课程学会归一化函数以及梯度下降即可。

使用线性模型。

python 复制代码
import copy

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt

#归一化函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# 计算损失
def compute_cost_logistic(X, y, w, b):
    m = X.shape[0]
    cost = 0.0
    for i in range(m):
        z_i = np.dot(X[i], w) + b
        f_wb_i = sigmoid(z_i)
        cost += -y[i] * np.log(f_wb_i) - (1 - y[i]) * np.log(1 - f_wb_i)
    cost = cost / m
    return cost
    
# 计算梯度逻辑
def compute_gradient_logistic(X, y, w, b):
    m, n = X.shape
    db_w = np.zeros(n)
    db_b = 0.
    for i in range(m):
        z_i = sigmoid(np.dot(X[i], w) + b)
        err_i = z_i - y[i]
        for j in range(n):
            db_w[j] += err_i * X[i][j]
        db_b += err_i
    return db_w / m, db_b / m

# 梯度下降
def gradient_descent(X, y, w, b, eta, num_iter):
    m = X.shape[0]
    for i in range(num_iter):
        w_temp = copy.deepcopy(w)
        b_temp = b
        db_w, db_b = compute_gradient_logistic(X, y, w_temp, b_temp)
        w = w_temp - eta * db_w
        b = b_temp - eta * db_b
        """
        if i == 0:
            print(compute_cost_logistic(X, y, w, b))
        """

    return w, b

if __name__ == '__main__':
    data = pd.read_csv(r'D:\BaiduNetdiskDownload\data_sets\ex2data1.txt')
    xx = data.iloc[:, 0:-1].to_numpy()
    data = (data - data.min()) / (data.max() - data.min())
	# 获取X,y训练集
    X_train = data.iloc[:, 0:-1]
    y_train = data.iloc[:, -1]

    X_train = X_train.to_numpy()
    y_train = y_train.to_numpy()

    w_tmp = np.zeros_like(X_train[0])
    b_tmp = 0.
    alph = 0.1
    iters = 10000
    w_out, b_out = gradient_descent(X_train, y_train, w_tmp, b_tmp, alph, iters)
    print(w_out, b_out)
    # 根据 w,b画出关于x的图表
    x = np.linspace(0, 1, 100)
    k = (-b_out - w_out[0] * x ) / w_out[1]

    X_air = xx[:, 0]
    Y_air = np.zeros(X_air.shape[0])
    plt.plot(x, k, color='blue')
    plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train)
    plt.show()

	# 计算准确率
    count = 0
    for i in range(X_train.shape[0]):
        ans = sigmoid(np.dot(X_train[i], w_out) + b_out)
        prediction = 1 if ans >= 0.5 else 0
        if(prediction == y_train[i]): count += 1
    print('Accuracy:{}'.format(count))
    print(f"\nupdated parameters: w:{w_out}, b:{b_out}")
一些图表

回归方程和数据集:

预期结果:

w: 9.24150506 8.78629869 b: -8.125896329768265

Accuracy:88%

相关推荐
198******126343 小时前
2026深度解读:Work Agent长程任务的技术机制与落地能力
人工智能
老金带你玩AI4 小时前
别只让AI解释,让它做个你能看懂的东西
人工智能
iffy14 小时前
Deepseek hardness 桌面版 + ollama
人工智能
Xiaofeng36934 小时前
知漫剧入门科普:一站式工作台一句话生成漫剧
人工智能
“AI国潮设计-小江”4 小时前
《Python+SDXL实战:用ControlNet精准控制“英歌舞翻糖吐司”构图,附批量生成脚本》
开发语言·人工智能·python·prompt·aigc
wenwen_chao5 小时前
Python学习与开发资源合集:实用技巧与工具推荐
python
MobotStone5 小时前
万物皆插件:DeepSeek Harness 底层揭秘,脚手架如何蜕变为产品
人工智能
youdexiang5 小时前
Android录音软件时间关键词检索功能分析
java·人工智能
WUYOUGYLU5 小时前
大模型时代:人与智能的共同进化
人工智能
netkiller-BG7NYT5 小时前
基于图像识别的人工智能中医望诊方案
人工智能·百度