深度学习项目--基于LSTM的糖尿病预测探究(pytorch实现)

  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊

前言

  • LSTM模型一直是一个很经典的模型,一般用于序列数据预测,这个可以很好的挖掘数据上下文信息,本文将使用LSTM进行糖尿病预测(二分类问题),采用LSTM+Linear解决分类问题

  • 📖 糖尿病预测之前我用随机森林做过:机器学习/数据分析案例—糖尿病预测;

  • 👀 后面打算用机器学习(随机森林、SVM等)结合深度学习LSTM做一个比较完整的项目,大家可以关注一下哈;

  • LSTM讲解: 深度学习基础–LSTM学习笔记(李沐《动手学习深度学习》)

  • 欢迎收藏 + 关注,本人将会持续更新

文章目录

    • 1、数据导入和数据预处理
      • 1、数据导入
      • 2、数据统计
      • 3、数据分布分析
      • 4、相关性分析
    • 2、数据标准化和划分
    • 3、创建模型
    • 4、模型训练
      • 1、创建训练集
      • 2、创建测试集函数
      • 3、设置超参数
    • 5、模型训练
    • 6、模型结果展示
    • 7、预测

1、数据导入和数据预处理

1、数据导入

import torch  
import torch.nn as nn 
from torch.utils.data import DataLoader, TensorDataset
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns 
from sklearn.preprocessing import StandardScaler 
from sklearn.model_selection import train_test_split
#设置字体
from pylab import mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"]  # 显示中文
plt.rcParams['axes.unicode_minus'] = False		# 显示负号

# 数据不大,用CPU即可
device = 'cpu'

data_df = pd.read_excel('./dia.xls')

data_df.head()
卡号性别年龄高密度脂蛋白胆固醇低密度脂蛋白胆固醇极低密度脂蛋白胆固醇甘油三酯总胆固醇脉搏舒张压高血压史尿素氮尿酸肌酐体重检查结果是否糖尿病
0180544210381.252.991.070.645.31838304.99243.35010
1180544220311.151.990.840.503.98856304.72391.04710
2180544230271.292.210.690.604.19736105.87325.75110
3180544240330.932.010.660.843.60836002.40203.24020
4180544250361.172.830.830.734.83856704.09236.84300

2、数据统计

data_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1006 entries, 0 to 1005
Data columns (total 16 columns):
 #   Column      Non-Null Count  Dtype  
---  ------      --------------  -----  
 0   卡号          1006 non-null   int64  
 1   性别          1006 non-null   int64  
 2   年龄          1006 non-null   int64  
 3   高密度脂蛋白胆固醇   1006 non-null   float64
 4   低密度脂蛋白胆固醇   1006 non-null   float64
 5   极低密度脂蛋白胆固醇  1006 non-null   float64
 6   甘油三酯        1006 non-null   float64
 7   总胆固醇        1006 non-null   float64
 8   脉搏          1006 non-null   int64  
 9   舒张压         1006 non-null   int64  
 10  高血压史        1006 non-null   int64  
 11  尿素氮         1006 non-null   float64
 12  尿酸          1006 non-null   float64
 13  肌酐          1006 non-null   int64  
 14  体重检查结果      1006 non-null   int64  
 15  是否糖尿病       1006 non-null   int64  
dtypes: float64(7), int64(9)
memory usage: 125.9 KB
data_df.describe()
卡号性别年龄高密度脂蛋白胆固醇低密度脂蛋白胆固醇极低密度脂蛋白胆固醇甘油三酯总胆固醇脉搏舒张压高血压史尿素氮尿酸肌酐体重检查结果是否糖尿病
count1.006000e+031006.0000001006.0000001006.0000001006.0000001006.0000001006.0000001006.0000001006.0000001006.0000001006.0000001006.0000001006.0000001006.0000001006.0000001006.000000
mean1.838279e+070.59841050.2882701.1522012.7074750.9983111.8967204.85762480.81908576.8866800.1739565.562684339.34542764.1063621.6093440.444334
std6.745088e+050.49046416.9214870.3134260.8480700.7158912.4214031.02997312.54227012.7631730.3792601.64634284.56984629.3384370.7723270.497139
min1.805442e+070.00000020.0000000.4200000.8400000.1400000.3500002.41000041.00000045.0000000.0000002.210000140.80000030.0000000.0000000.000000
25%1.807007e+070.00000037.2500000.9200002.1000000.6800000.8800004.20000072.00000067.0000000.0000004.450000280.85000051.2500001.0000000.000000
50%1.807036e+071.00000050.0000001.1200002.6800000.8500001.3350004.78500079.00000076.0000000.0000005.340000333.00000062.0000002.0000000.000000
75%1.809726e+071.00000060.0000001.3200003.2200001.0900002.0875005.38000088.00000085.0000000.0000006.367500394.00000072.0000002.0000001.000000
max2.026124e+071.00000093.0000002.5000007.98000011.26000045.84000012.610000135.000000119.0000001.00000018.640000679.000000799.0000003.0000001.000000

3、数据分布分析

# 缺失值统计
data_df.isnull().sum()
卡号            0
性别            0
年龄            0
高密度脂蛋白胆固醇     0
低密度脂蛋白胆固醇     0
极低密度脂蛋白胆固醇    0
甘油三酯          0
总胆固醇          0
脉搏            0
舒张压           0
高血压史          0
尿素氮           0
尿酸            0
肌酐            0
体重检查结果        0
是否糖尿病         0
dtype: int64
# 数据分布、异常值分析
feature_name = {
    '性别': '性别',
    '年龄': '年龄',
    '高密度脂蛋白胆固醇': '高密度脂蛋白胆固醇',
    '低密度脂蛋白胆固醇': '低密度脂蛋白胆固醇',
    '极低密度脂蛋白胆固醇': '极低密度脂蛋白胆固醇',
    '甘油三酯': '甘油三酯',
    '总胆固醇': '总胆固醇',
    '脉搏': '脉搏',
    '舒张压': '舒张压',
    '高血压史': '高血压史',
    '尿素氮': '尿素氮',
    '肌酐': '肌酐',
    '体重检查结果': '体重检查结果',
    '是否糖尿病': '是否糖尿病'
}

# 子箱图 展示
plt.figure(figsize=(20, 20))

for i, (col, col_name) in enumerate(feature_name.items(), 1):
    plt.subplot(4, 4, i)
    # 绘制子箱图
    sns.boxplot(x=data_df["是否糖尿病"],y=data_df[col])
    # 设置标题
    plt.title(f'{col_name}的纸箱图', fontsize=10)
    plt.ylabel('数值', fontsize=12)
    plt.grid(axis='y', linestyle='--', alpha=0.7)
    
plt.show()


在这里插入图片描述

异常值分析(查阅资料后发现):

  1. 总数据较少;
  2. 特征参数受很多因素的影响,故这里假设没有异常值(数据多的时候可以进一步分析)

患糖尿病和不患糖尿病数据分布分析

  • 发现患病和不患病在:年龄、高密度蛋白固醇、低密度蛋白固醇、低密度蛋白固醇、甘油三肪、舒张压、高血压、尿素的相关因素等数据因素有关

4、相关性分析

plt.figure(figsize=(15, 10))
sns.heatmap(data_df.corr(), annot=True, fmt=".2f")
plt.show()


在这里插入图片描述

高密度蛋白胆固醇存在负相关,故删除该特征

2、数据标准化和划分

时间步长为1

# 特征选择
x = data_df.drop(['卡号', '高密度脂蛋白胆固醇', '是否糖尿病'], axis=1)
y = data_df['是否糖尿病']

# 数据标准化(数据之间差别大), 二分类问题,y不需要做标准化
sc = StandardScaler()
x = sc.fit_transform(x)

# 转换为tensors数据
x = torch.tensor(np.array(x), dtype=torch.float32)
y = torch.tensor(np.array(y), dtype=torch.int64)

# 数据划分, 训练:测试 = 8: 2
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2 ,random_state=42)

# 维度设置, [batch_size, seq, features], 当然不设置也没事,因为这样默认** 设置 seq 为 1**
x_train = x_train.unsqueeze(1)
x_test = x_test.unsqueeze(1)

# 查看维度
x_train.shape, y_train.shape
(torch.Size([804, 1, 13]), torch.Size([804]))
# 构建数据集
batch_size = 16

train_dl = DataLoader(TensorDataset(x_train, y_train),
                      batch_size=batch_size,
                      shuffle=True
                      )

test_dl = DataLoader(TensorDataset(x_test, y_test),
                     batch_size=batch_size,
                     shuffle=False
                     )
for X, Y in train_dl:
    print(X.shape)
    print(Y.shape)
    break 
torch.Size([16, 1, 13])
torch.Size([16])

3、创建模型

class Model_lstm(nn.Module):
    def __init__(self):
        super().__init__()
        
        '''
        模型结构:
            1、两层lstm
            2、一层linear 
        '''
        
        self.lstm1 = nn.LSTM(input_size=13, hidden_size=200,
                             num_layers=1, batch_first=True)
        self.lstm2 = nn.LSTM(input_size=200, hidden_size=200,
                             num_layers=1, batch_first=True)
        # 展开,分类
        self.lc1 = nn.Linear(200, 2)
        
    def forward(self, x):
        out, hidden1 = self.lstm1(x)
        out, _ = self.lstm2(out, hidden1)  # 将上一个层的最后隐藏层状态,作为lstm2的这一层的隐藏层状态
        out = self.lc1(out)
        return out
    
model = Model_lstm().to(device)

model
Model_lstm(
  (lstm1): LSTM(13, 200, batch_first=True)
  (lstm2): LSTM(200, 200, batch_first=True)
  (lc1): Linear(in_features=200, out_features=2, bias=True)
)
model(torch.randn(8, 1, 13)).shape
torch.Size([8, 1, 2])

4、模型训练

1、创建训练集

def train(dataloader, model, loss_fn, opt):
    size = len(dataloader.dataset)
    num_batch = len(dataloader)
    
    train_acc, train_loss = 0.0, 0.0 
    
    for X, y in dataloader:
        X, y = X.to(device), y.to(device)
        
        pred = model(X).view(-1, 2)
        loss = loss_fn(pred, y)
        
        # 梯度设置
        opt.zero_grad()
        loss.backward()
        opt.step()
        
        train_loss += loss.item()
        # 求最大概率配对
        train_acc += (pred.argmax(1) == y).type(torch.float).sum().item()
        
    train_acc /= size 
    train_loss /= num_batch
    
    return train_acc, train_loss 
        

2、创建测试集函数

def test(dataloader, model, loss_fn):
    size = len(dataloader.dataset)
    num_batch = len(dataloader)
    
    test_acc, test_loss = 0.0, 0.0 
    
    with torch.no_grad():
        for X, y in dataloader:
            X, y = X.to(device), y.to(device)
            
            pred = model(X).view(-1, 2)
            loss = loss_fn(pred, y)
            
            test_loss += loss.item()
            # 求最大概率配对
            test_acc += (pred.argmax(1) == y).type(torch.float).sum().item()
            
    test_acc /= size 
    test_loss /= num_batch 
    
    return test_acc, test_loss

3、设置超参数

learn_rate = 1e-4
opt = torch.optim.Adam(model.parameters(), lr=learn_rate)
loss_fn = nn.CrossEntropyLoss()

5、模型训练

epochs = 50

train_acc, train_loss, test_acc, test_loss = [], [], [], []

for i in range(epochs):
    model.train()
    epoch_train_acc, epoch_train_loss = train(train_dl, model, loss_fn, opt)
    
    model.eval()
    epoch_test_acc, epoch_test_loss = test(test_dl, model, loss_fn)
    
    train_acc.append(epoch_train_acc)
    train_loss.append(epoch_train_loss)
    test_acc.append(epoch_test_acc)
    test_loss.append(epoch_test_loss)
    
    # 输出
    template = ('Epoch:{:2d}, Train_acc:{:.1f}%, Train_loss:{:.3f}, Test_acc:{:.1f}%, Test_loss:{:.3f}')
    print(template.format(i + 1, epoch_train_acc*100, epoch_train_loss, epoch_test_acc*100, epoch_test_loss))
    
print("---------------Done---------------")
Epoch: 1, Train_acc:58.5%, Train_loss:0.677, Test_acc:75.7%, Test_loss:0.655
Epoch: 2, Train_acc:71.0%, Train_loss:0.643, Test_acc:77.2%, Test_loss:0.606
Epoch: 3, Train_acc:75.2%, Train_loss:0.590, Test_acc:79.7%, Test_loss:0.533
Epoch: 4, Train_acc:76.9%, Train_loss:0.524, Test_acc:80.2%, Test_loss:0.469
Epoch: 5, Train_acc:77.5%, Train_loss:0.481, Test_acc:79.7%, Test_loss:0.436
Epoch: 6, Train_acc:78.4%, Train_loss:0.470, Test_acc:79.7%, Test_loss:0.419
Epoch: 7, Train_acc:78.6%, Train_loss:0.452, Test_acc:80.7%, Test_loss:0.412
Epoch: 8, Train_acc:78.5%, Train_loss:0.449, Test_acc:80.7%, Test_loss:0.406
Epoch: 9, Train_acc:78.7%, Train_loss:0.444, Test_acc:80.7%, Test_loss:0.400
Epoch:10, Train_acc:79.0%, Train_loss:0.435, Test_acc:81.2%, Test_loss:0.395
Epoch:11, Train_acc:78.4%, Train_loss:0.428, Test_acc:81.2%, Test_loss:0.391
Epoch:12, Train_acc:79.1%, Train_loss:0.428, Test_acc:81.2%, Test_loss:0.388
Epoch:13, Train_acc:79.0%, Train_loss:0.421, Test_acc:80.7%, Test_loss:0.385
Epoch:14, Train_acc:79.2%, Train_loss:0.415, Test_acc:81.7%, Test_loss:0.382
Epoch:15, Train_acc:79.1%, Train_loss:0.415, Test_acc:81.7%, Test_loss:0.379
Epoch:16, Train_acc:79.7%, Train_loss:0.422, Test_acc:81.7%, Test_loss:0.377
Epoch:17, Train_acc:79.5%, Train_loss:0.410, Test_acc:81.7%, Test_loss:0.375
Epoch:18, Train_acc:79.2%, Train_loss:0.406, Test_acc:81.7%, Test_loss:0.374
Epoch:19, Train_acc:80.3%, Train_loss:0.407, Test_acc:82.2%, Test_loss:0.372
Epoch:20, Train_acc:80.1%, Train_loss:0.409, Test_acc:81.2%, Test_loss:0.370
Epoch:21, Train_acc:80.2%, Train_loss:0.397, Test_acc:80.7%, Test_loss:0.368
Epoch:22, Train_acc:81.0%, Train_loss:0.399, Test_acc:81.7%, Test_loss:0.367
Epoch:23, Train_acc:80.7%, Train_loss:0.396, Test_acc:81.2%, Test_loss:0.365
Epoch:24, Train_acc:81.0%, Train_loss:0.401, Test_acc:81.7%, Test_loss:0.363
Epoch:25, Train_acc:81.1%, Train_loss:0.392, Test_acc:82.2%, Test_loss:0.363
Epoch:26, Train_acc:81.2%, Train_loss:0.385, Test_acc:82.2%, Test_loss:0.362
Epoch:27, Train_acc:80.6%, Train_loss:0.392, Test_acc:82.2%, Test_loss:0.361
Epoch:28, Train_acc:80.5%, Train_loss:0.382, Test_acc:81.2%, Test_loss:0.358
Epoch:29, Train_acc:81.1%, Train_loss:0.386, Test_acc:81.7%, Test_loss:0.358
Epoch:30, Train_acc:80.7%, Train_loss:0.380, Test_acc:82.2%, Test_loss:0.358
Epoch:31, Train_acc:81.5%, Train_loss:0.378, Test_acc:81.7%, Test_loss:0.357
Epoch:32, Train_acc:80.6%, Train_loss:0.373, Test_acc:81.2%, Test_loss:0.356
Epoch:33, Train_acc:81.3%, Train_loss:0.373, Test_acc:81.7%, Test_loss:0.357
Epoch:34, Train_acc:80.8%, Train_loss:0.378, Test_acc:81.7%, Test_loss:0.354
Epoch:35, Train_acc:81.5%, Train_loss:0.372, Test_acc:81.2%, Test_loss:0.355
Epoch:36, Train_acc:81.5%, Train_loss:0.368, Test_acc:81.2%, Test_loss:0.354
Epoch:37, Train_acc:81.2%, Train_loss:0.368, Test_acc:80.7%, Test_loss:0.354
Epoch:38, Train_acc:81.2%, Train_loss:0.369, Test_acc:81.2%, Test_loss:0.353
Epoch:39, Train_acc:81.7%, Train_loss:0.365, Test_acc:81.2%, Test_loss:0.354
Epoch:40, Train_acc:81.5%, Train_loss:0.363, Test_acc:81.2%, Test_loss:0.355
Epoch:41, Train_acc:81.7%, Train_loss:0.358, Test_acc:81.2%, Test_loss:0.354
Epoch:42, Train_acc:81.7%, Train_loss:0.355, Test_acc:81.2%, Test_loss:0.353
Epoch:43, Train_acc:81.3%, Train_loss:0.353, Test_acc:80.7%, Test_loss:0.354
Epoch:44, Train_acc:82.0%, Train_loss:0.355, Test_acc:80.7%, Test_loss:0.354
Epoch:45, Train_acc:81.7%, Train_loss:0.353, Test_acc:79.7%, Test_loss:0.354
Epoch:46, Train_acc:82.1%, Train_loss:0.354, Test_acc:80.2%, Test_loss:0.354
Epoch:47, Train_acc:82.0%, Train_loss:0.349, Test_acc:80.2%, Test_loss:0.356
Epoch:48, Train_acc:82.1%, Train_loss:0.350, Test_acc:80.2%, Test_loss:0.356
Epoch:49, Train_acc:82.0%, Train_loss:0.345, Test_acc:80.7%, Test_loss:0.355
Epoch:50, Train_acc:81.8%, Train_loss:0.344, Test_acc:80.7%, Test_loss:0.355
---------------Done---------------

6、模型结果展示

from datetime import datetime
current_time = datetime.now()

epochs_range = range(epochs)

plt.figure(figsize=(12, 3))
plt.subplot(1, 2, 1)

plt.plot(epochs_range, train_acc, label='Training Accuracy')
plt.plot(epochs_range, test_acc, label='Test Accuracy')
plt.legend(loc='lower right')
plt.title('Training Accuracy')
plt.xlabel(current_time) 

plt.subplot(1, 2, 2)
plt.plot(epochs_range, train_loss, label='Training Loss')
plt.plot(epochs_range, test_loss, label='Test Loss')
plt.legend(loc='upper right')
plt.title('Training Loss')
plt.show()


在这里插入图片描述

7、预测

test_x = x_test[0].reshape(1, 1, 13)

pred = model(test_x.to(device)).reshape(-1, 2)
res = pred.argmax(1).item()

print(f"预测结果: {res}, (1: 患病; 0: 不患病)")
预测结果: 1, (1: 患病; 0: 不患病)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】_不带头非循环单向链表

目录 1. 链表的概念及结构 2. 链表的分类 3. 单链表的实现 3.1 SList.h头文件 3.2 SList.c源文件 3.3 Test_SList.c测试文件 关于线性表&#xff0c;已介绍顺序表&#xff0c;详见下文&#xff1a; 【数据结构】_顺序表-CSDN博客 本文介绍链表&#xff1b; 基于顺序表…

HippoRAG:受海马体启发的长时记忆模型,提升大语言模型的知识整合能力

论文地址&#xff1a;https://arxiv.org/pdf/2405.14831 1. 背景与挑战 1.1 哺乳动物大脑与长时记忆 进化优势: 哺乳动物的大脑进化出强大的长时记忆系统&#xff0c;能够存储大量关于世界的知识&#xff0c;并不断整合新信息&#xff0c;同时避免灾难性遗忘。知识整合能力: …

Juc22_什么是中断、interrupt、isInterrupted、interrupted方法源码解析、如何使用中断标识停止线程

目录 ①. 什么是中断 ②. 源码解读(中断的相关API) ③. 如何使用中断标识停止线程 ①. 什么是中断 ①. 一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,所以,Thread.stop、Thread.suspend、Thread. resume都已经被废弃了 ②. 在Java中没有办法立即停止…

网络安全 | F5-Attack Signatures详解

关注&#xff1a;CodingTechWork 关于攻击签名 攻击签名是用于识别 Web 应用程序及其组件上攻击或攻击类型的规则或模式。安全策略将攻击签名中的模式与请求和响应的内容进行比较&#xff0c;以查找潜在的攻击。有些签名旨在保护特定的操作系统、Web 服务器、数据库、框架或应…

项目概述与规划 (I)

项目概述与规划 (I) JavaScript的学习已经接近尾声了&#xff0c;最后我们将通过一个项目来讲我们在JavaScript中学习到的所有都在这个项目中展现出来&#xff0c;这个项目的DEMO来自于Udemy中的课程&#xff0c;作者是Jonas Schmedtmann&#xff1b; 项目规划 项目步骤 用户…

RabbitMQ 架构分析

文章目录 前言一、RabbitMQ架构分析1、Broker2、Vhost3、Producer4、Messages5、Connections6、Channel7、Exchange7、Queue8、Consumer 二、消息路由机制1、Direct Exchange2、Topic Exchange3、Fanout Exchange4、Headers Exchange5、notice5.1、备用交换机&#xff08;Alter…

基于java线程池和EasyExcel实现数据异步导入

基于java线程池和EasyExcel实现数据异步导入 2.代码实现 2.1 controller层 PostMapping("import")public void importExcel(MultipartFile file) throws IOException {importService.importExcelAsync(file);}2.2 service层 Resource private SalariesListener sa…

微信阅读网站小程序的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

【吉林乡镇界】面图层shp格式arcgis数据乡镇名称和编码wgs84无偏移内容测评

标题中的“吉林省乡镇界面图层shp格式arcgis数据乡镇名称和编码wgs84无偏移”揭示了这是一个地理信息系统&#xff08;GIS&#xff09;相关的数据集&#xff0c;主要用于描绘吉林省的乡镇边界。这个数据集包含了一系列的文件&#xff0c;它们是ArcGIS软件能够识别和处理的Shape…

71.在 Vue 3 中使用 OpenLayers 实现按住 Shift 拖拽、旋转和缩放效果

前言 在前端开发中&#xff0c;地图功能是一个常见的需求。OpenLayers 是一个强大的开源地图库&#xff0c;支持多种地图源和交互操作。本文将介绍如何在 Vue 3 中集成 OpenLayers&#xff0c;并实现按住 Shift 键拖拽、旋转和缩放地图的效果。 实现效果 按住 Shift 键&#…

Python NumPy(3):创建数组(2)

1 NumPy 从已有的数组创建数组 1.1 numpy.asarray numpy.asarray 类似 numpy.array&#xff0c;但 numpy.asarray 参数只有三个&#xff0c;比 numpy.array 少两个。 numpy.asarray(a, dtype None, order None) 参数描述a任意形式的输入参数&#xff0c;可以是&#xff0c…

qml Dialog详解

1、概述 Dialog是QML&#xff08;Qt Modeling Language&#xff09;中用于显示对话框的组件&#xff0c;它提供了一个模态窗口&#xff0c;通常用于与用户进行重要交互&#xff0c;如确认操作、输入信息或显示警告等。Dialog组件具有灵活的布局和样式选项&#xff0c;可以轻松…

二维数组一

目录 输出数组的第k行数输出数组的第k列数输出数组的每一行的和输出数组的每列的平均值最高成绩各个科目成绩的平均分求最大梯形的面积入门靶心数奇偶统计 输出数组的第k行数 题目描述 输入一个二维数组&#xff0c;显示他的第k行的值。 输入 第一行 n&#xff0c;m两个整数&…

单片机内存管理剖析

一、概述 在单片机系统中&#xff0c;内存资源通常是有限的&#xff0c;因此高效的内存管理至关重要。合理地分配和使用内存可以提高系统的性能和稳定性&#xff0c;避免内存泄漏和碎片化问题。单片机的内存主要包括程序存储器&#xff08;如 Flash&#xff09;和数据存储器&a…

计算机网络 (61)移动IP

前言 移动IP&#xff08;Mobile IP&#xff09;是由Internet工程任务小组&#xff08;Internet Engineering Task Force&#xff0c;IETF&#xff09;提出的一个协议&#xff0c;旨在解决移动设备在不同网络间切换时的通信问题&#xff0c;确保移动设备可以在离开原有网络或子网…

线性回归、协同过滤、基于内容过滤、主成分分析(PCA)

线性回归 使用item特征用户打分标签线性回归训练&#xff0c;最小化成本函数&#xff0c;得到每个用户的参数 协同过滤 协同过滤基于一个核心假设&#xff1a;相似的用户会有相似的兴趣&#xff0c;因此可以通过分析相似用户历史行为&#xff0c;来预测当前用户可能感兴趣的i…

引领产品创新: 2025 年 PM 效能倍增法则

本文讲述 PM 如何利用 AI 做到效率倍增&#xff0c;非常有借鉴意义&#xff0c;故而翻译于此。 原文链接&#xff1a;https://www.news.aakashg.com/p/the-ai-pms-playbook 在产品圈有一个广为流传的说法&#xff1a; “每个产品经理都应该成为 AI 产品经理。” 这个观点有一…

vscode无法格式化go代码的问题

CTRLshiftp 点击Go:Install/Update Tools 点击全选&#xff0c;OK&#xff01;

【外文原版书阅读】《机器学习前置知识》1.线性代数的重要性,初识向量以及向量加法

目录 ​编辑 ​编辑 1.Chapter 2 Why Linear Algebra? 2.Chapter 3 What Is a Vector? 个人主页&#xff1a;Icomi 大家好&#xff0c;我是Icomi&#xff0c;本专栏是我阅读外文原版书《Before Machine Learning》对于文章中我认为能够增进线性代数与机器学习之间的理解的…

对神经网络基础的理解

目录 一、《python神经网络编程》 二、一些粗浅的认识 1&#xff09; 神经网络也是一种拟合 2&#xff09;神经网络不是真的大脑 3&#xff09;网络构建需要反复迭代 三、数字图像识别的实现思路 1&#xff09;建立一个神经网络类 2&#xff09;权重更新的具体实现 3&am…