机器学习---逻辑回归代码

news2024/11/25 4:36:03

1. 逻辑回归模型


import numpy as np

class LogisticRegression(object):

    def __init__(self, learning_rate=0.1, max_iter=100, seed=None):
        self.seed = seed
        self.lr = learning_rate
        self.max_iter = max_iter

    def fit(self, x, y):
        np.random.seed(self.seed)
        self.w = np.random.normal(loc=0.0, scale=1.0, size=x.shape[1])
        self.b = np.random.normal(loc=0.0, scale=1.0)
        self.x = x
        self.y = y
        for i in range(self.max_iter):
            self._update_step()
            # print('loss: \t{}'.format(self.loss()))
            # print('score: \t{}'.format(self.score()))
            # print('w: \t{}'.format(self.w))
            # print('b: \t{}'.format(self.b))

    def _sigmoid(self, z):
        return 1.0 / (1.0 + np.exp(-z))

    def _f(self, x, w, b):
        z = x.dot(w) + b
        return self._sigmoid(z)

    def predict_proba(self, x=None):
        if x is None:
            x = self.x
        y_pred = self._f(x, self.w, self.b)
        return y_pred

    def predict(self, x=None):
        if x is None:
            x = self.x
        y_pred_proba = self._f(x, self.w, self.b)
        y_pred = np.array([0 if y_pred_proba[i] < 0.5 else 1 for i in range(len(y_pred_proba))])
        return y_pred

    def score(self, y_true=None, y_pred=None):
        if y_true is None or y_pred is None:
            y_true = self.y
            y_pred = self.predict()
        acc = np.mean([1 if y_true[i] == y_pred[i] else 0 for i in range(len(y_true))])
        return acc

    def loss(self, y_true=None, y_pred_proba=None):
        if y_true is None or y_pred_proba is None:
            y_true = self.y
            y_pred_proba = self.predict_proba()
        return np.mean(-1.0 * (y_true * np.log(y_pred_proba) + (1.0 - y_true) * np.log(1.0 - y_pred_proba)))

    def _calc_gradient(self):
        y_pred = self.predict()
        d_w = (y_pred - self.y).dot(self.x) / len(self.y)
        d_b = np.mean(y_pred - self.y)
        return d_w, d_b

    def _update_step(self):
        d_w, d_b = self._calc_gradient()
        self.w = self.w - self.lr * d_w
        self.b = self.b - self.lr * d_b
        return self.w, self.b

这段代码实现了逻辑回归模型的训练和预测过程。

       在类的初始化方法 __init__ 中,可以设置学习率 learning_rate、最大迭代次数 max_iter 和

随机种子 seed

       在 fit 方法中,使用随机数生成初始的参数 w 和 b,然后通过迭代更新参数,直到达到最大迭

代次数。在每次更新迭代中,调用 _update_step 方法来更新参数。

在 _sigmoid 方法中,定义了 sigmoid 函数,用于将线性函数的输出转换为概率值。

       在 _f 方法中,将输入 x 与参数 w 进行点乘,再加上参数 b,得到线性函数的输出 z。将 z 作

为参数传给 _sigmoid 方法,将线性函数的输出转换为概率值。

       在 predict_proba 方法中,根据输入特征和当前的参数预测样本属于正例的概率。sigmoid 函

数的输出范围在 0 到 1 之间,可以看作是样本属于正例的概率。

       在 predict 方法中,根据预测的概率值将其转换为二分类的标签值。

       在 score 方法中,计算了模型在训练数据上的准确率。首先判断是否提供了自定义的真实标

签  y_true 和预测标签 y_pred,如果没有,则使用类初始化时保存的真实标签 self.y 和调用 

 predict 方法得到的预测标签。然后,通过列表推导式遍历每个位置的真实标签和预测标签,对比

它们是否相等。如果相等,则在列表中添加 1,表示预测正确;如果不相等,则添加 0,表示预测

错误。接下来,使用 np.mean 方法计算列表中元素的平均值,即计算准确预测的比例。最后,返回

准确率 acc

       在 loss 方法中,计算了模型的损失函数,即交叉熵损失。L(y, p) = - (y * log(p) + (1 - y) *

log(1 - p)),其中,L 表示损失函数,y 是真实标签(取值为0或1),p 是模型的预测概率(取值范

围为0到1)。当 y=1 时,损失函数可以简化为 -log(p),表示模型预测为正类的概率越小,损失越

大。当 y=0 时,损失函数可以简化为 -log(1-p),表示模型预测为负类的概率越小,损失越大。这

个损失函数的思想是,当模型的预测与真实标签一致时,损失接近于0;当模型的预测与真实标签

不一致时,损失增大。通过最小化交叉熵损失函数,可以使模型更好地拟合训练数据,提高分类的

准确性。

       在 _calc_gradient 方法中,计算了损失函数对参数的梯度。

       在 _update_step 方法中,根据梯度和学习率更新参数。

这段代码的目的是实现逻辑回归模型,并提供了训练、预测、准确率和损失函数等功能。通过迭代

更新参数,模型可以根据输入特征预测样本的类别。

2. 数据分割

import numpy as np

def generate_data(seed):
    np.random.seed(seed)
    data_size_1 = 300
    x1_1 = np.random.normal(loc=5.0, scale=1.0, size=data_size_1)
    x2_1 = np.random.normal(loc=4.0, scale=1.0, size=data_size_1)
    y_1 = [0 for _ in range(data_size_1)]
    data_size_2 = 400
    x1_2 = np.random.normal(loc=10.0, scale=2.0, size=data_size_2)
    x2_2 = np.random.normal(loc=8.0, scale=2.0, size=data_size_2)
    y_2 = [1 for _ in range(data_size_2)]
    x1 = np.concatenate((x1_1, x1_2), axis=0)
    x2 = np.concatenate((x2_1, x2_2), axis=0)
    x = np.hstack((x1.reshape(-1,1), x2.reshape(-1,1)))
    y = np.concatenate((y_1, y_2), axis=0)
    data_size_all = data_size_1+data_size_2
    shuffled_index = np.random.permutation(data_size_all)
    x = x[shuffled_index]
    y = y[shuffled_index]
    return x, y
def train_test_split(x, y):
    split_index = int(len(y)*0.7)
    x_train = x[:split_index]
    y_train = y[:split_index]
    x_test = x[split_index:]
    y_test = y[split_index:]
    return x_train, y_train, x_test, y_test

这段代码实现了数据生成和训练集、测试集分割的功能。下面是对代码的解释:

   generate_data(seed) 函数用于生成数据。根据给定的随机种子 seed,使用 

np.random.seed(seed) 设置随机种子,保证每次生成的数据一致。生成了两个类别的数据:

第一个类别数据有 300 个样本,通过 np.random.normal 方法生成两个特征 x1_1 和 x2_1,分别服

从均值为 5.0 和 4.0,标准差为 1.0 的正态分布。标签 y_1 全部为 0。第二个类别数据有 400 个样

本,通过 np.random.normal 方法生成两个特征 x1_2 和 x2_2,分别服从均值为 10.0 和 8.0,标准

差为 2.0 的正态分布。标签 y_2 全部为 1。使用 np.concatenate 和 np.hstack 方法将两个类别的

数据合并,并返回特征矩阵 x 和标签向量 y

        np.concatenate 是 NumPy 库中的一个函数,用于将多个数组按指定的轴进行拼接。

        np.random.permutation 是 NumPy 库中的一个函数,用于对一个序列或数组进行随机排列。

        np.hstack 是 NumPy 库中的一个函数,用于水平(按列)拼接多个数组。

        reshape(-1,1)是将数组 x1 重塑为一个列数为 1 的二维数组,行数根据数组长度自动计算。

   train_test_split(x, y) 函数用于将数据分割为训练集和测试集。根据总样本数量的 70%

作为训练集,30% 作为测试集。具体步骤如下:根据 int(len(y)*0.7) 计算出分割的索引位置。

使用切片操作将特征矩阵 x 和标签向量 y 分割为训练集的特征矩阵 x_train 和标签向量 y_train

以及测试集的特征矩阵 x_test 和标签向量 y_test。返回训练集和测试集的特征矩阵和标签向量。

3. 结果生成

import numpy as np

import matplotlib.pyplot as plt

#import data_helper

#from logistic_regression import *

# data generation

x, y = generate_data(seed=272)
x_train, y_train, x_test, y_test = train_test_split(x, y)

# visualize data
# plt.scatter(x_train[:,0], x_train[:,1], c=y_train, marker='.')
# plt.show()
# plt.scatter(x_test[:,0], x_test[:,1], c=y_test, marker='.')
# plt.show()

# data normalization
x_train = (x_train - np.min(x_train, axis=0)) / (np.max(x_train, axis=0) - np.min(x_train, axis=0))
x_test = (x_test - np.min(x_test, axis=0)) / (np.max(x_test, axis=0) - np.min(x_test, axis=0))

# Logistic regression classifier
clf = LogisticRegression(learning_rate=0.1, max_iter=500, seed=272)
clf.fit(x_train, y_train)

# plot the result
split_boundary_func = lambda x: (-clf.b - clf.w[0] * x) / clf.w[1]
xx = np.arange(0.1, 0.6, 0.1)
cValue = ['g','b'] 
plt.scatter(x_train[:,0], x_train[:,1], c=[cValue[i] for i in y_train], marker='o')
plt.plot(xx, split_boundary_func(xx), c='red')
plt.show()

# loss on test set
y_test_pred = clf.predict(x_test)
y_test_pred_proba = clf.predict_proba(x_test)
print(clf.score(y_test, y_test_pred))
print(clf.loss(y_test, y_test_pred_proba))
# print(y_test_pred_proba)

       匿名函数(lambda 函数)split_boundary_func,它接受一个参数 x,并返回一个值。

具体来说,该函数使用逻辑回归模型 clf 的截距 clf.b、权重 clf.w[0] 和 clf.w[1] 计算分类边界

线的纵坐标值。

在逻辑回归模型中,分类边界线可以表示为:

w0 * x + w1 * y + b = 0

         其中 w0 和 w1 是模型的权重,b 是模型的截距。在这里,我们将 y 表示为 

split_boundary_func(x),即纵坐标值和横坐标值之间的关系。

   plt.scatter 函数绘制散点图,具体来说,x_train[:,0] 和 x_train[:,1] 是训练集数据中的

两个特征列(或称为自变量)。x_train[:,0] 表示取所有行的第一个特征值,x_train[:,1] 表示

取所有行的第二个特征值。c=[cValue[i] for i in y_train] 用于指定每个数据点的颜色。

y_train 是训练集数据的标签(或称为因变量),用于指示数据点的分类类别。cValue 是一个颜色

列表,用于表示不同类别的颜色。通过列表推导式,根据 y_train 的值选择相应的颜色,实现不同

类别的数据点具有不同的颜色。marker='o' 指定散点的形状为圆圈。

       首先,使用 generate_data 函数生成一些二维数据,并将数据集拆分为训练集和测试集。

       然后,通过数据可视化展示训练集和测试集的散点图。

       接下来,对训练集和测试集的特征数据进行归一化,将其缩放到 [0, 1] 范围内。

       然后,创建一个逻辑回归分类器对象 clf,并使用训练集数据对其进行训练。

       接着,定义一个函数 split_boundary_func 用于绘制分类边界线,并在图中绘制训练集数据和

分类边界线。

       最后,使用训练好的模型对测试集进行预测,并计算模型在测试集上的准确率和损失。

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/881981.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视频汇聚平台EasyCVR安防监控视频汇聚平台的FLV视频流在VLC中无法播放的问题解决方案

众所周知&#xff0c;TSINGSEE青犀视频汇聚平台EasyCVR可支持多协议方式接入&#xff0c;包括主流标准协议国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。在视频流的处理与分发上&#xff0c;视频监控…

ESP8266获取网络时间 实时时钟

程序现象 一、用串口调试助手调试 1.发送指令ATRST重启模块使应用模式更改生效&#xff1b; 2.发送指令ATE0取消回显 3.使用串口发送指令ATCWMODE1设置模块Wi-Fi应用模式为Station模式&#xff1b; 4.发送指令ATCWJAP "ssid","pwd"连接AP&#xff1b; …

react-native-webview RN和html双向通信

rn登录后得到的token需要传递给网页&#xff0c;js获取到的浏览器信息需要传递给rn RN Index.js: import React from react import { WebView } from react-native-webview import useList from ./useListexport default function Index(props) {const { uri, jsCode, webVie…

23款奔驰S450 4MATIC升级车载冰箱系统,快乐就是这么朴实无华呀

凉爽餐饮随时触手可及。容积10升的可拆卸冷藏箱与后排扶手和谐融合。如此一来&#xff0c;即使在炎炎夏日&#xff0c;也可享受沁凉的冷饮。

Vue3头像(Avatar)

效果如下图&#xff1a;在线预览 APIs 参数说明类型默认值必传shape指定头像的形状‘circle’ | ‘square’‘circle’falsesize设置头像的大小number | ‘large’ | ‘small’ | ‘default’ | Responsive‘default’falsesrc图片类头像资源地址string‘’falsealt图片无法显…

关于微信临时文件wxfile://tmp文件如何处理,微信小程序最新获取头像和昵称

分享-2023年资深前端进阶&#xff1a;前端登顶之巅-最全面的前端知识点梳理总结&#xff0c;前端之巅 *分享一个使用比较久的&#x1fa9c; 技术栈&#xff1a;taro框架 vue3版本 解决在微信小程序获取微信头像时控制台报错&#xff1a;找不着wxfile://tmp 文件路径,失败&…

迁移协调器 - 就地迁移模式

在本系列博客的第一部分中&#xff0c;我们从高层级视角介绍了 Migration Coordinator 提供的所有模式&#xff0c;Migration Coordinator 是内置于 NSX 中的完全受 GSS 支持的工具&#xff0c;可将 NSX for vSphere 迁移到 NSX (NSX-T)。 本系列的第二篇博客将详细介绍就地迁…

cesium 卫星环绕扫描

成果图 源码 let viewer new Cesium.Viewer(cesiumContainer,{// terrainProvider: Cesium.createWorldTerrain(),geocoder: false, // 隐藏查找位置homeButton: false, // 隐藏返回视角到初始位置sceneModePicker: false, // 隐藏视角模式的选择baseLayerPicker: false, // 隐…

亚马逊云科技助力珠海丹德构建安全技术底座,促进商业发展

随着消费者对商品质量和安全关注度的不断提高&#xff0c;防伪、溯源、防窜已经成为企业关注的重要领域。据前瞻产业研究院数据显示&#xff0c;2028年中国防伪行业市场容量将超过4000亿元&#xff0c;未来市场对防伪、溯源、防窜技术的需求和重视程度可见一斑。 作为一家用智慧…

软件测试项目实战,电商业务功能测试点汇总(全覆盖)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 支付功能怎么测试…

医院后勤管理用什么系统好?的修医院报修管理系统有哪些优势?

随着医院后勤工作量的不断增加&#xff0c;需要协调和维护的设备和部门也随之增多。传统的医院后勤管理方式已经显得不够优越&#xff0c;其劣势日益凸显&#xff0c;无法满足实际工作需求。因此&#xff0c;快速推动医院后勤信息化管理已成为当前医院发展的迫切需求。而的修医…

进销存记账软件2023排行榜,秦丝、智慧记、管家婆哪家更好用?

进销存记账软件已经成为很多实体店必备的一款软件&#xff0c;使用进销存记账软件可以帮助实体店解决手工记账效率低下、对账麻烦且出错率高等问题。 很多实体店都是小本生意&#xff0c;选择进销存记账软件时由于缺乏经验&#xff0c;随意选择&#xff0c;结果买回来之后一堆问…

无人机跟随一维高度避障场景--逻辑分析

无人机跟随一维高度避障场景--逻辑分析 1. 源由2. 视频3. 问题3.1 思维发散3.2 问题收敛 4. 图示4.1 水平模式4.2 下坡模式4.3 上坡模式4.4 碰撞分析 5. 总结6. 参考资料 1. 源由 最近拿到一台测试样机&#xff0c;功能很多&#xff0c;就不多赘述。 这里针对跟随功能进行下吐…

java面试基础 -- 方法重载 方法重写

目录 重载 重写 重载 方法的重载是指在同一个类中定义多个方法, 他们具有相同的名称, 但是具有不同的参数列表, 例如: public void myMethod(int arg1) {// 方法体 }public void myMethod(int arg1, int arg2) {// 方法体 }public void myMethod(String arg1) {// 方法体 }…

企业权限管理(九)-用户操作

用户操作 1用户查询 UserController findAll Controller RequestMapping("/user") public class UserController {Autowiredprivate IUserService userService;RequestMapping("/findAll.do")public ModelAndView findAll() throws Exception {ModelAndVie…

PMP考试通过标准是什么?

PMP 新考纲一共是 180道题&#xff0c;答对 108道就通过了&#xff0c;具体怎么看通过没有&#xff1f; 一、查看是否通过 1、登录PMI 官网&#xff0c;点击“Log In” 如果忘记 PMI 的账号、密码了也别着急&#xff0c;去找你报名的培训机构&#xff0c;一般报名处有记录&…

C语言 — qsort 函数

介绍&#xff1a;qsort是一个库函数&#xff0c;用来对数据进行排序&#xff0c;可以排序任意类型的数据。 void qsort &#xff08;void*base&#xff0c; size_t num, size_t size, int(*compart)(const void*,constvoid*) &#xff09; qsort 具有四个参数&#xff1a; …

分割等和子集——力扣416

思路:动态规划 bool canPartition(vector<int>& nums){int n=nums.size(

建筑师设计师太难了,既要学BIM、无人机,还要学GIS!

我&#xff0c;一个平平无奇的城市规划专业&#xff08;建筑专业、路桥专业&#xff09;大学生&#xff0c;还有一年要毕业&#xff0c;很担心工作以后受到社会的毒打&#xff0c;遂问导师和学长&#xff0c;我要自学点什么技能和软件&#xff1f; 学长A&#xff1a;CAD&#x…