使用sklearn进行机器学习案例(1)

news2024/11/25 0:23:03

文章目录

    • 案例一. 加州房价预测
    • 案例二. MNIST手写数字识别
    • 案例三. 波士顿房价预测

案例一. 加州房价预测

线性回归通过对训练集进行训练,拟合出一个线性方程,使得预测值与实际值之间的平均误差最小化。这个过程可以使用梯度下降法等优化算法来实现。即通过最小化预测值(线性函数)与实际值之间的误差(成本函数)来训练出的模型。
sklearn中提供了可直接调用的线性回归算法模型LinearRegression()

案例一将加州房价数据集的80%用作训练集,其余20%用作测试集,通过给出的数据样本进行推理,得到一个函数模型后,就可以用于推断加州其他地区的房价(中位数)。

Python代码:

import pandas as pd #导入Pandas,用于数据读取和处理
# 读入房价数据,示例代码中的文件地址为internet链接,读者也可以下载该文件到本机进行读取
# 如,当数据集和代码文件位于相同本地目录,路径名应为"./house.csv",或直接放"house.csv"亦可
df_housing = pd.read_csv("https://raw.githubusercontent.com/huangjia2019/house/master/house.csv")
df_housing.head #显示加州房价数据的部分信息
X = df_housing.drop("median_house_value",axis = 1) #构建特征集X,去掉"median_house_value",其余赋给X
y = df_housing.median_house_value #构建标签集y,将df_housing.median_house_value单独赋给y

from sklearn.model_selection import train_test_split #导入数据集拆分工具
X_train, X_test, y_train, y_test = train_test_split(X, y,
         test_size=0.2, random_state=0) #以80%/20%的比例进行数据集的拆分

from sklearn.linear_model import LinearRegression #导入线性回归算法模型
model = LinearRegression() #使用线性回归算法
model.fit(X_train, y_train) #用训练集数据,训练模型,拟合函数,确定参数

y_pred = model.predict(X_test) #预测测试集的y值
print('房价中位数的真值(测试集)', y_test)
print('预测的房价中位数(测试集)', y_pred)

print("给预测评分:", model.score(X_test, y_test)) #评估预测结果

import matplotlib.pyplot as plt #导入matplotlib画图库
#用散点图显示家庭收入中位数和房价中位数的分布
plt.scatter(X_test.median_income, y_test, color='brown', s=10)
#画出回归函数(从特征到预测标签)
plt.plot(X_test.median_income, y_pred, color='green', linewidth=0.1)
plt.xlabel('Median Income') #X轴-家庭收入中位数
plt.ylabel('Median House Value') #Y轴-房价中位数
plt.show() #显示房价分布和习得的函数图形

在这里插入图片描述
训练结果:

房价中位数的真值(测试集) 3873     171400.0
3625     189600.0
3028     500001.0
13814    229400.0
15398    163400.0
           ...   
1363     212500.0
7947     210500.0
14574    142900.0
10009    128300.0
9149      84700.0
Name: median_house_value, Length: 3400, dtype: float64
预测的房价中位数(测试集) [211157.06335416 218581.64298576 465317.31295563 ... 201751.23969632
 160873.51846958 138847.26913351]
给预测评分: 0.6321014171579509

案例二. MNIST手写数字识别

import numpy as np # 导入NumPy数学工具箱
import pandas as pd # 导入Pandas数据处理工具箱
from keras.datasets import mnist #从Keras中导入mnist数据集
#读入训练集和测试集
(X_train_image, y_train_lable), (X_test_image, y_test_lable) =  mnist.load_data()

print("特征集张量形状:", X_train_image.shape) #用shape方法显示张量的形状
print("第一个数据样本:\n", X_train_image[0]) #注意Python的索引是从0开始的
print("第一个数据样本的标签:", y_train_lable[0])

from tensorflow.keras.utils import to_categorical # 导入keras.utils工具箱的类别转换工具
X_train = X_train_image.reshape(60000,28,28,1) # 给标签增加一个维度
X_test = X_test_image.reshape(10000,28,28,1) # 给标签增加一个维度
y_train = to_categorical(y_train_lable, 10) # 特征转换为one-hot编码
y_test = to_categorical(y_test_lable, 10) # 特征转换为one-hot编码
print("数据集张量形状:", X_train.shape) # 特征集张量的形状
print("第一个数据标签:",y_train[0]) # 显示标签集的第一个数据

from keras import models # 导入Keras模型, 和各种神经网络的层
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
model = models.Sequential() # 用序贯方式建立模型
model.add(Conv2D(32, (3, 3), activation='relu', # 添加Conv2D层
                 input_shape=(28,28,1))) # 指定输入数据样本张量的类型
model.add(MaxPooling2D(pool_size=(2, 2))) # 添加MaxPooling2D层
model.add(Conv2D(64, (3, 3), activation='relu')) # 添加Conv2D层
model.add(MaxPooling2D(pool_size=(2, 2))) # 添加MaxPooling2D层
model.add(Dropout(0.25)) # 添加Dropout层
model.add(Flatten()) # 展平
model.add(Dense(128, activation='relu')) # 添加全连接层
model.add(Dropout(0.5)) # 添加Dropout层
model.add(Dense(10, activation='softmax')) # Softmax分类激活,输出10维分类码
# 编译模型
model.compile(optimizer='rmsprop', # 指定优化器
              loss='categorical_crossentropy', # 指定损失函数
              metrics=['accuracy']) # 指定验证过程中的评估指标

model.fit(X_train, y_train, # 指定训练特征集和训练标签集
          validation_split = 0.3, # 部分训练集数据拆分成验证集
          epochs=5, # 训练轮次为5轮
          batch_size=128) # 以128为批量进行训练

score = model.evaluate(X_test, y_test) # 在测试集上进行模型评估
print('测试集预测准确率:', score[1]) # 打印测试集上的预测准确率

pred = model.predict(X_test[0].reshape(1, 28, 28, 1)) # 预测测试集第一个数据
print(pred[0],"转换一下格式得到:",pred.argmax()) # 把one-hot码转换为数字
import matplotlib.pyplot as plt # 导入绘图工具包
plt.imshow(X_test[0].reshape(28, 28),cmap='Greys') # 输出这个图片
plt.show() #显示图片

训练结果:

特征集张量形状: (60000, 28, 28)
第一个数据样本:
 [[  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   3  18  18  18 126 136
  175  26 166 255 247 127   0   0   0   0]
 [  0   0   0   0   0   0   0   0  30  36  94 154 170 253 253 253 253 253
  225 172 253 242 195  64   0   0   0   0]
 [  0   0   0   0   0   0   0  49 238 253 253 253 253 253 253 253 253 251
   93  82  82  56  39   0   0   0   0   0]
 [  0   0   0   0   0   0   0  18 219 253 253 253 253 253 198 182 247 241
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0  80 156 107 253 253 205  11   0  43 154
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0  14   1 154 253  90   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0 139 253 190   2   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0  11 190 253  70   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0  35 241 225 160 108   1
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0  81 240 253 253 119
   25   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0  45 186 253 253
  150  27   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  16  93 252
  253 187   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 249
  253 249  64   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0  46 130 183 253
  253 207   2   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0  39 148 229 253 253 253
  250 182   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0  24 114 221 253 253 253 253 201
   78   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0  23  66 213 253 253 253 253 198  81   2
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0  18 171 219 253 253 253 253 195  80   9   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0  55 172 226 253 253 253 253 244 133  11   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0 136 253 253 253 212 135 132  16   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]]
第一个数据样本的标签: 5
数据集张量形状: (60000, 28, 28, 1)
第一个数据标签: [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
Epoch 1/5
329/329 [==============================] - 9s 27ms/step - loss: 1.0503 - accuracy: 0.8201 - val_loss: 0.1492 - val_accuracy: 0.9578
Epoch 2/5
329/329 [==============================] - 12s 35ms/step - loss: 0.1949 - accuracy: 0.9464 - val_loss: 0.0734 - val_accuracy: 0.9794
Epoch 3/5
329/329 [==============================] - 11s 35ms/step - loss: 0.1417 - accuracy: 0.9618 - val_loss: 0.0663 - val_accuracy: 0.9834
Epoch 4/5
329/329 [==============================] - 12s 35ms/step - loss: 0.1132 - accuracy: 0.9697 - val_loss: 0.0683 - val_accuracy: 0.9818
Epoch 5/5
329/329 [==============================] - 11s 34ms/step - loss: 0.0917 - accuracy: 0.9745 - val_loss: 0.0669 - val_accuracy: 0.9817
313/313 [==============================] - 1s 3ms/step - loss: 0.0638 - accuracy: 0.9826
测试集预测准确率: 0.9825999736785889
1/1 [==============================] - 0s 41ms/step
[1.5436295e-13 3.0449864e-12 3.0315375e-11 3.1523032e-13 8.0739130e-15
 9.7735735e-15 1.6785966e-18 1.0000000e+00 6.6133326e-15 1.2456733e-09] 转换一下格式得到: 7

在这里插入图片描述
其中onehot编码[[0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]]显示为[1.5436295e-13 3.0449864e-12 3.0315375e-11 3.1523032e-13 8.0739130e-15 9.7735735e-15 1.6785966e-18 1.0000000e+00 6.6133326e-15 1.2456733e-09] 是因为默认采用了科学计数法形式显示,当数值非常小时会用浮点数精确表示。要想取消这样表示可通过:np.set_printoptions(suppress=True) # 取消科学计数法的形式显示 来设置。

案例三. 波士顿房价预测

更换案例一的数据集为波士顿房价,数据集存在于keras及很多其它框架内部,可以通过下述语句导入
from keras.datasets import boston_housing #从Keras中导入Boston Housing数据集,使用案例一的线性回归模型对波士顿房价数据训练集进行房价中位数的预测。

由于keras中调用了tensorflow(相当于精简版的tf),所以要先pip install tensorflow

Boston Housing
该数据集包含美国人口普查局收集的美国马萨诸塞州波士顿住房价格的有关信息, 数据集很小,只有506个案例。
数据集都有以下14个属性:
0-CRIM–城镇人均犯罪率 ------【城镇人均犯罪率】
1-ZN - 占地面积超过25,000平方英尺的住宅用地比例。 ------【住宅用地所占比例】
2-INDUS - 每个城镇非零售业务的比例。 ------【城镇中非商业用地占比例】
3-CHAS - Charles River虚拟变量(如果是河道,则为1;否则为0 ------【查尔斯河虚拟变量,用于回归分析】
4-NOX - 一氧化氮浓度(每千万份) ------【环保指标】
5-RM - 每间住宅的平均房间数 ------【每栋住宅房间数】
6-AGE - 1940年以前建造的自住单位比例 ------【1940年以前建造的自住单位比例 】
7-DIS -波士顿的五个就业中心加权距离 ------【与波士顿的五个就业中心加权距离】
8-RAD - 径向高速路的可达性指数 ------【距离高速公路的便利指数】
9-TAX - 每10,000美元的全额物业税率 ------【每一万美元的不动产税率】
10-PTRATIO - 城镇的学生与教师比例 ------【城镇中教师学生比例】
11-B - 1000(Bk - 0.63)^ 2其中Bk是城镇黑人的比例 ------【城镇中黑人比例】
12-LSTAT - 人口状况下降% ------【房东属于低等收入阶层比例】
13-MEDV - 自有住房的中位数报价, 单位1000美元 ------【自住房屋房价中位数】

同样是将0-12赋值给X_train作为训练集中的特征集,13给y_train作为标签集

import numpy as np # 导入NumPy数学工具箱
import pandas as pd # 导入Pandas数据处理工具箱
from keras.datasets import boston_housing #从Keras中导入Boston Housing数据集
#读入训练集和测试集
(X_train, y_train), (X_test, y_test) = boston_housing.load_data()

print ("数据集张量形状:", X_train.shape) #shape方法显示张量的形状
print ("第一个数据样本:\n", X_train[0]) #注意Python的索引是从0开始的
print ("第一个数据样本的标签:", y_train[0])

from sklearn.linear_model import LinearRegression #导入线性回归算法模型
model = LinearRegression() #使用线性回归算法
model.fit(X_train, y_train) #用训练集数据,训练机器,拟合函数,确定参数

y_pred = model.predict(X_test) #预测测试集的Yprint ('房价的真值(测试集)',y_test)
print ('预测的房价(测试集)',y_pred)

print("给预测评分:", model.score(X_test, y_test)) #评估预测结果

训练结果:

数据集张量形状: (404, 13)
第一个数据样本:
 [  1.23247   0.        8.14      0.        0.538     6.142    91.7
   3.9769    4.      307.       21.      396.9      18.72   ]
第一个数据样本的标签: 15.2
房价的真值(测试集) [ 7.2 18.8 19.  27.  22.2 24.5 31.2 22.9 20.5 23.2 18.6 14.5 17.8 50.
 20.8 24.3 24.2 19.8 19.1 22.7 12.  10.2 20.  18.5 20.9 23.  27.5 30.1
  9.5 22.  21.2 14.1 33.1 23.4 20.1  7.4 15.4 23.8 20.1 24.5 33.  28.4
 14.1 46.7 32.5 29.6 28.4 19.8 20.2 25.  35.4 20.3  9.7 14.5 34.9 26.6
  7.2 50.  32.4 21.6 29.8 13.1 27.5 21.2 23.1 21.9 13.  23.2  8.1  5.6
 21.7 29.6 19.6  7.  26.4 18.9 20.9 28.1 35.4 10.2 24.3 43.1 17.6 15.4
 16.2 27.1 21.4 21.5 22.4 25.  16.6 18.6 22.  42.8 35.1 21.5 36.  21.9
 24.1 50.  26.7 25. ]
预测的房价(测试集) [ 9.69267239 21.05859431 20.94145461 34.25223414 25.95902598 20.56741038
 28.15310405 25.07113862 20.30519458 22.82489511 20.29027213 18.07938917
 16.46141024 35.31166595 19.41369959 19.34727116 24.58140904 21.01346252
 19.99079236 23.79286427 12.20780045 17.14218992 22.51468752 12.92570511
 21.18070615 23.94073547 33.46176314 24.2631555  13.35213096 20.71939252
 23.45082103 19.1486881  36.09743765 23.47113531 19.03141995  5.92425733
 14.02090469 22.96425377 16.01731242 27.09134249 22.06997029 28.61755389
 17.75679772 34.75579014 31.29455712 24.73234165 31.12655323 18.09268992
 22.62638989 24.21208909 30.5854317  18.71860574 10.50163617 13.73779292
 34.4022841  27.53140317 18.08151522 40.05101982 37.63271513 24.64021422
 25.73823434 20.64369987 20.33514699 21.38393124 24.63485497 23.53071805
 17.42141466 26.76911736  3.83782148 11.97063636 24.2602519  23.67191799
 23.66639182  8.4403269  28.52690962 20.94071229 20.44489658 24.77678169
 33.77299778  7.02038331 24.55379254 36.73923493 16.09878612 18.14663987
 20.48899554 18.7928142  22.45683561 26.19154506 23.36585592 28.89583791
 17.48243942 16.05642916 26.69532678 28.1393996  35.04164989 20.05308052
 36.25269116 38.51475052 25.13506119 41.49062194 34.65500235 25.33950895]
给预测评分: 0.7213535934621558

参考文献:
[1] 黄佳——《零基础学机器学习》

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

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

相关文章

使用curl命令传输数据

文章目录 一、curl命令二、举例和注意事项Reference 一、curl命令 curl是传输数据的命令行工具,可以通过命令行发送HTTP请求和接收HTTP响应。它的名字是“client for URLs”,意为URL的客户端,表示该工具主要用于处理URL相关的任务。curl可以…

Mysql数据库对表的基本操作

一.表基本操作 1.当前数据库内创建表 2.查看表 3.删除表 4.修改表结构 5.复制表(结构) 二.表约束创建 1.约束的作用 2.约束的类型 3.演示 一.表基本操作 1.当前数据库内创建表 CREATE TABLE 表名( 列名 列数据类型, 列名 列…

如何在华为OD机试中获得满分?Java实现【寻找关键钥匙】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

使用compose desktop构建桌面应用

使用compose desktop构建桌面应用时遇到的一些坑 官方指导移步:多平台开发说明,我这里只写一些自己遇到问题 我在mac机器开发,然后使用githubAction构建的win平台的包,现记录一下遇到的问题 构建文件build.gradle编写不同平台的程…

SAM-MM-配额协议字段解析

1、有效起始日:配额协议的生效日期,系统默认为当前创建日期,灰色,不可更改; 2、有效至:配额协议的失效日期,要手动填一个日期; 3、最小数量拆分:如果要按照配额比例&am…

.NET面向AI编程——SK框架(SemanticKernel)的简易入门实践

前言:随着ChatGPT开始在各个领域遍地开花,有关的应用也开始层出不穷。随着微软开源SK框架,无疑是给.NET开发者带来面向AI应用的新机遇。以下内容,通过创建一个简单的prompt开始,开发一个使用SK框架进行开发的入门教程&…

xss跨站之waf绕过及安全修复(28)

手工探针xss绕过waf规则 打开靶场 写入跨站测试语句发现拦截 这里就做一个最经典的方法,做一个关键字拆分来确立拦截的是什么东西。 去掉最后字符串,访问还是拦截,再去掉alert(1),访问还是拦截&#xff…

八大排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序、基数排序(上)

目录 前言 直接插入排序(Insertion Sort) 一、概念及其介绍 二、过程图示 三、代码 四、复杂度 希尔排序(Shell Sort) 一、概念 二、实现思路 三、图示过程 四、代码 4.1代码 4.2运行结果 4.3解释 五、复杂度 堆排…

华为诺亚实验室VanillaNet学习笔记

华为诺亚实验室VanillaNet学习笔记 VanillaNet: the Power of Minimalism in Deep Learning Abstract 基础模型的核心理念是“多而不同”,计算机视觉和自然语言处理领域的惊人成功就是例证。然而,优化的挑战和变压器模型固有的复杂性要求范式向简单性…

Linux:finalshell虚拟机与真实机的上传和下载;rz、sz

使用命令rz上传的速度会比拖拽上传的速度慢

Day3:Windows网络编程-UDP

对比TCP与UDP的通信区别 UDP Server没有listen()和accept() TCP Server #include <iostream> #include <WinSock2.h> // 包含网络库 #pragma comment(lib,"ws2_32.lib") using namespace std;int main() {// 1. 初始化套接字 初始化套接字库cout <&l…

Qt编写视频监控系统76-Onvif跨网段组播搜索和单播搜索的实现

一、前言 在视频监控行业一般会用国际onvif工具来测试设备是否支持onvif协议&#xff0c;工具的名字叫ONVIF Device Manager&#xff08;还有个工具叫ONVIF Device Test Tool&#xff0c;专用于程序员测试各种数据交互&#xff09;&#xff0c;可以自行搜索下载&#xff0c;此…

linux网桥简单理解和持久化配置

文章目录 前言一、Linux 网桥是什么&#xff1f;二、网桥主要作用三、网桥配置命令及安装(CentOS系统)1 网桥配置命令2.持久化网桥配置 前言 linux bridge是网络虚拟化中非常重要的一种设备&#xff0c;今天就来学习下linux bridge的相关知识 一、Linux 网桥是什么&#xff1…

Allegro操作规范

光绘输出操作规范 1.1添加钻孔表 添加钻孔表的具体步骤为: 1.通过屏幕右边的Visibility选项的Views列表,将Drill层打开 2.将Visibility选项中的PIN和Via选项都选中,见下图所示: 1.2添加钻孔文件 参数设好之后关闭NC Drill/Parameters窗口,输出数控机床钻孔文件的命…

企业域名与企业邮箱:提升企业形象的必备选择

在商业中&#xff0c;你最不想做的就是把注意力从业务上移开&#xff0c;去担心一些小事——比如电子邮件。大多数免费的企业电子邮件账户偷工减料&#xff0c;因此无法交付货物。在Zoho我们围绕您的需求设计了我们的平台&#xff0c;以创建优于其他工作电子邮件地址的电子邮件…

jQuery-从左到右、从右到左

<!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <title>从左到右、从右到左</title> <style type"text/css"> select { …

采购申请审批测试

采购申请审批的配置并不难&#xff0c;但是总会有原因导致业务无审批策略&#xff0c;而且这个配置也比较脆弱&#xff0c;有时同步也会出现问题&#xff0c;小编利用这篇操作记录下测试结果。 1、项目类别的审批策略分类 下图是审批策略分类-项目类别不给值&#xff0c;测试…

LAMP架构中的安装论坛

前言&#xff1a;本次操作依赖于LAMP的环境已经配置完全&#xff0c;网站也是依赖于开发人员现有的网站包框架&#xff0c;实施在LAMP已搭建好的环境进行安装部署 目录 一、对mysql进行操作 创建数据库&#xff0c;并进行授权 二、解压论坛压缩包 三、初步访问安装 解决…

少年,你可听说过MVCC?

&#xff1a;切&#xff01;这谁没听过&#xff0c;不就是多版本并发控制么~ 早在亘古时期&#xff0c;修真界就流传着一门mysql功法&#xff0c;将其修至小乘境界&#xff0c;足以纵横一方。。。不乏也有走火入魔者&#xff0c;为祸一方~ Serializable篇 强制事务排序&#…

【MCS-51】中断系统原理及应用

中断是单片机中一个十分重要的功能&#xff0c;它的出现能够让我们的单片机在顺序执行命令时&#xff0c;具备应对特殊情况的能力。 目录 &#x1f319;通信方式 &#x1f343;无条件传送 &#x1f343;有条件传送 &#x1f343;DMA通信 &#x1f343;中断传送 &#x1…