网站首页 > 技术文章 正文
在深入研究神经网络和深度学习模型之前,我们来看一看逻辑回归,它可以被看作是单层神经网络,甚至逻辑回归中通常使用的Sigmoid函数也被用作神经网络中的激活函数。
2.1.1 做好准备
逻辑回归是用于二分类/序数(离散的顺序)类别分类的监督机器学习方法。
2.1.2 怎么做
逻辑回归作为复杂神经网络模型的一个构建块,使用Sigmoid作为激活函数。逻辑函数(或Sigmoid)可表示如下:
前面的Sigmoid函数形成一个连续的曲线,其值为[0, 1],如图2-1所示。
逻辑回归模型的表达式可以写成如下:
此处,W是和X= [
]特征相关的权重,且b是模型的截距,也称为模型偏差。整个目标是针对给定的损失函数(如交叉熵)来优化W。为了获得
,带Sigmoid激活函数的逻辑回归模型的另一种表示如图2-2所示。
2.2 介绍数据集
本节将展示如何准备用来演示不同模型的数据集。
2.2.1 做好准备
逻辑回归是一个线性分类器,假定自变量和对数概率是线性关系。因此,在独立特征与对数概率呈线性关系的情况下,模型表现非常好。模型中可以包含更高阶的特征来捕捉非线性行为。我们来看看如何使用第1章提到的主要深度学习包建立逻辑回归模型。网络必须保持畅通,以便从UCI存储库中下载数据集。
2.2.2 怎么做
在本章中,来自UC Irvine机器学习库的占用检测(Occupancy Detection)数据集被用于构建逻辑回归和神经网络模型。它是一个主要用于二元分类的实验数据集,根据表2-1中描述的多变量预测变量来确定房间是被占用(1)或未被占用(0)。数据集的贡献者是来自UMONS的Luis Candanedo。
在https://archive.ics.uci.edu/ml/datasets/Occupancy+Detection+下载数据集。
有3个数据集可以下载,但是我们将使用datatraining.txt进行训练/交叉验证,并将datatest.txt用于测试目的。
数据集有7个属性(包括答案占用率),有20,560个实例。表2-1总结了属性信息。
2.3 使用H2O执行逻辑回归
广义线性模型广泛用于基于回归和分类的预测分析。这些模型使用最大似然来优化且支持更大的数据集良好扩展。在H2O中,广义线性模型可以灵活处理L1和L2惩罚(包括弹性网)。它支持因变量的高斯分布(Gaussian)、二项分布(Binomial)、泊松分布(Poisson)和伽马分布(Gamma)。它在处理分类变量、计算完整正则化和执行分布式n重交叉验证以控制模型过拟合方面是有效的。它具有使用分布式网格搜索来优化诸如弹性网络(α)之类的超参数以及处理预测器属性系数的上限和下限的特征。它也可以处理自动缺失值的插补。它使用Hogwild方法进行优化,即随机梯度下降的并行版本。
2.3.1 做好准备
第1章提供了在R中安装H2O的详细信息,以及使用其Web界面的工作示例。要开始建模,请在R环境中加载H2O软件包:
require(h2o)
然后,在8个内核上使用h2o.init()函数初始化一个单节点H2O实例,并在IP地址为localhost和端口号为54321上实例化相应的客户端模块:
localH2O = h2o.init(ip = "localhost", port = 54321, startH2O =
TRUE,min_mem_size = "20G",nthreads = 8)
H2O包依赖于Java JRE。因此,应该在执行初始化命令之前预先安装Java JRE。
2.3.2 怎么做
本小节将演示使用H2O构建广义线性模型的步骤。
1.现在,在R中加载占用的训练和测试数据集:
# 加载占用数据
occupancy_train <-
read.csv("C:/occupation_detection/datatraining.txt",stringsAsFactor
s = T)
occupancy_test <-
read.csv("C:/occupation_detection/datatest.txt",stringsAsFactors =
T)
2.以下自变量(x)和因变量(y)将被用于广义线性模型:
# 定义输入变量(x)和输出变量(y)
x = c("Temperature", "Humidity", "Light", "CO2", "HumidityRatio")
y = "Occupancy"
3.根据H2O的要求,将因变量转换为以下因子型变量:
# 将结果变量转换为因子变量
occupancy_train$Occupancy <- as.factor(occupancy_train$Occupancy)
occupancy_test$Occupancy <- as.factor(occupancy_test$Occupancy)
4.将数据集转换为H2OParsedData对象:
occupancy_train.hex <- as.h2o(x = occupancy_train,
destination_frame = "occupancy_train.hex")
occupancy_test.hex <- as.h2o(x = occupancy_test, destination_frame
= "occupancy_test.hex")
5.一旦数据被加载并被转换为H2OParsedData对象后,使用h2o.glm函数运行广义线性模型。在当前的环境中,我们打算进行5折交叉验证,弹性网格正则化(α = 5)和最优正则化强度(lamda_search = TRUE)等参数的训练:
# 训练模型
occupancy_train.glm <- h2o.glm(x = x, # 预测变量名的向量
y = y, # 响应/因变量的名字
training_frame =
occupancy_train.hex, # 训练数据集
seed = 1234567, # 随机数种子
family = "binomial", # 输出变量
lambda_search = TRUE, # 最佳正则化lambda
alpha = 0.5, # 弹性网络正则化
nfolds = 5 # 5折交叉验证
)
6.除上述命令外,还可以定义其他参数来微调模型性能。下面的举例并不包括所有的函数参数,但基于重要性涵盖了一部分。完整的参数列表可以在H2O软件包的文档中找到。
- 使用fold_assignment,指定生成交叉验证样本的策略,如随机抽样、分层抽样、取模抽样和自动(选择)。也可以通过指定列名称(fold_column)对特定属性执行采样。
- 可以选择通过使用weights_column指定每个观察值的权重,或使用balance_classes执行过密采样/过疏采样来处理倾斜结果(不平衡数据)。
- 可以选择使用missing_values_handling,通过均值插补或跳过观察值来处理缺失值。
- 可以选择使用non_negative限制系数为非负数,并使用beta_constraints约束它们的值。
- 如果采样数据的响应平均值不能反映真实(先前),就可以选择为采样数据提供y == 1的先验概率(逻辑回归)。
- 指定要考虑的交互的变量(interactions)。
2.3.3 工作原理
模型的性能可以通过多种指标进行评估,例如精确度、曲线下面积(Area Under Curve,AUC)、错误分类错误率(%)、错误分类的错误数、F1分数、精确度、召回率和特异性等。但是,在本章中,模型性能的评估是基于AUC的。
以下是训练模型训练的准确性和交叉验证的准确性:
# 训练的准确性(AUC)
> occupancy_train.glm@model$training_metrics@metrics$AUC
[1] 0.994583
# 交叉验证的准确性(AUC)
> occupancy_train.glm@model$cross_validation_metrics@metrics$AUC
[1] 0.9945057
现在,我们来评估模型用于测试数据时的性能。以下代码有助于预测测试数据的结果:
# 预测测试数据
yhat <- h2o.predict(occupancy_train.glm, occupancy_test.hex)
然后,根据实际测试结果评估AUC值,如下所示:
# 测试的准确性(AUC)
> yhat$pmax <- pmax(yhat$p0, yhat$p1, na.rm = TRUE)
> roc_obj <- pROC::roc(c(as.matrix(occupancy_test.hex$Occupancy)),
c(as.matrix(yhat$pmax)))
> auc(roc_obj)
Area under the curve: 0.9915
在H2O中,还可以从广义线性模型计算变量的重要性,如图2-3所示。
# 计算变量的重要性和性能
h2o.varimp_plot(occupancy_train.glm, num_of_features = 5)
2.4 使用TensorFlow执行逻辑回归
在本节中,我们将介绍TensorFlow在构建逻辑回归模型中的应用。该示例将使用与H2O模型构建中相同的数据集。
2.4.1 做好准备
关于安装TensorFlow,第1章提供了详细信息。本节的代码是在Linux上创建的,但可以在任何操作系统上运行。开始建模前,请在环境中加载TensorFlow软件包。R加载默认的TensorFlow环境变量,并且也将Python中的NumPy库加载到np变量。
library("tensorflow") # 加载TensorFlow
np <- import("numpy") # 加载numpy库
2.4.2 怎么做
使用R的标准函数导入数据,如下面的代码所示。
1.使用read.csv文件导入数据,并将其转换为矩阵格式,然后选择用于建模的特征值,如xFeatures和yFeatures中定义的。在TensorFlow中,下一步是设置一个图来执行优化:
# 加载输入和测试数据
xFeatures = c("Temperature", "Humidity", "Light", "CO2",
"HumidityRatio")
yFeatures = "Occupancy"
occupancy_train <-
as.matrix(read.csv("datatraining.txt",stringsAsFactors = T))
occupancy_test <-
as.matrix(read.csv("datatest.txt",stringsAsFactors = T))
# 用于建模和转换为数字值的子集特征
occupancy_train<-apply(occupancy_train[, c(xFeatures, yFeatures)],
2, FUN=as.numeric)
occupancy_test<-apply(occupancy_test[, c(xFeatures, yFeatures)], 2,
FUN=as.numeric)
# 数据维度
nFeatures<-length(xFeatures)
nRow<-nrow(occupancy_train)
2.在设置图形之前,我们使用以下命令重置图形:
# 重置图形
tf$reset_default_graph()
3.另外,我们启动一个交互式会话,因为它允许我们执行变量且无须引用会话到会话的对象:
# 启动会话作为交互式会话
sess<-tf$InteractiveSession()
4.在TensorFlow中定义逻辑回归模型。
# 设置逻辑回归图
x <- tf$constant(unlist(occupancy_train[, xFeatures]),
shape=c(nRow, nFeatures), dtype=np$float32) #
W <- tf$Variable(tf$random_uniform(shape(nFeatures, 1L)))
b <- tf$Variable(tf$zeros(shape(1L)))
y <- tf$matmul(x, W) + b
5.输入特征x被定义为常数,因为它将是系统的输入。权重W和偏差b被定义为变量,它们将在优化过程中被优化。设置y为x、W和b三个变量的函数。权重W被设置为初始化随机均匀分布,并且b被赋值为零。
6.为逻辑回归设置成本函数(cost function):
# 设置成本函数和优化器
y_ <- tf$constant(unlist(occupancy_train[, yFeatures]),
dtype="float32", shape=c(nRow, 1L))
cross_entropy<-
tf$reduce_mean(tf$nn$sigmoid_cross_entropy_with_logits(labels=y_,
logits=y, name="cross_entropy"))
optimizer <-
tf$train$GradientDescentOptimizer(0.15)$minimize(cross_entropy)
变量y_是响应变量。采用交叉熵作为损失函数,构建逻辑回归模型。损失函数传递给学习率为0.15的梯度下降优化器。在执行优化之前,初始化全局变量:
# 启动一个会话
init <- tf$global_variables_initializer()
sess$run(init)
7.为优化权重,使用交叉熵作为损失函数,执行梯度下降算法:
# 执行优化
for (step in 1:5000) {
sess$run(optimizer)
if (step %% 20== 0)
cat(step, "-", sess$run(W), sess$run(b), "==>",
sess$run(cross_entropy), "n")
}
2.4.3 工作原理
可以使用AUC来评估模型的性能:
# 训练的性能
library(pROC)
ypred <- sess$run(tf$nn$sigmoid(tf$matmul(x, W) + b))
roc_obj <- roc(occupancy_train[, yFeatures], as.numeric(ypred))
# 测试的性能
nRowt<-nrow(occupancy_test)
xt <- tf$constant(unlist(occupancy_test[, xFeatures]), shape=c(nRowt,
nFeatures), dtype=np$float32)
ypredt <- sess$run(tf$nn$sigmoid(tf$matmul(xt, W) + b))
roc_objt <- roc(occupancy_test[, yFeatures], as.numeric(ypredt)).
AUC可以使用pROC包中的plot.auc函数来可视化,如图2-4所示。训练和测试的性能非常相似。
plot.roc(roc_obj, col = "green", lty=2, lwd=2)
plot.roc(roc_objt, add=T, col="red", lty=4, lwd=2)
2.5 可视化TensorFlow图
TensorFlow图可以使用TensorBoard进行可视化。这是一个利用TensorFlow事件文件将TensorFlow模型可视化为图形的服务。TensorBoard中的图形模型可视化也用于调试TensorFlow模型。
2.5.1 做好准备
可以在终端中使用以下命令启动TensorBoard:
$ tensorboard --logdir home/log --port 6006
以下是TensorBoard的主要参数。
- —logdir:映射到目录以加载TensorFlow事件。
- —debug:增加日志冗长度。
- —host:定义主机,默认侦听其本地主机(127.0.0.1)。
- —port:定义TensorBoard将要服务的端口。
上述命令将在本地主机上6006端口启动TensorFlow服务,如图2-5所示。
TensorBoard上的选项卡捕获图形执行期间生成的相关数据。
2.5.2 怎么做
本小节介绍如何在TernsorBoard中显示TensorFlow模型和输出。
1.要可视化摘要和图表,可以使用摘要模块中的FileWriter命令导出TensorFlow中的数据。可以使用以下命令添加默认会话图:
# 为日志创建写对象
log_writer = tf$summary$FileWriter('c:/log', sess$graph)
图2-6显示了使用上述代码为逻辑回归创建的图。
2.同样,可以使用正确的摘要将其他变量摘要添加到TensorBoard中,如下面的代码所示:
# 给权重和偏差变量添加直方图摘要
w_hist = tf$histogram_summary("weights", W)
b_hist = tf$histogram_summary("biases", b)
摘要可以是确定模型如何执行非常有用的方法。例如,对于前面的情况,可以研究测试和训练的成本函数,以理解优化性能和收敛性。
3.为测试创建一个交叉熵评估。生成测试和训练的交叉熵成本函数的示例脚本如下:
# 为测试设置交叉熵
nRowt<-nrow(occupancy_test)
xt <- tf$constant(unlist(occupancy_test[, xFeatures]),
shape=c(nRowt, nFeatures), dtype=np$float32)
ypredt <- tf$nn$sigmoid(tf$matmul(xt, W) + b)
yt_ <- tf$constant(unlist(occupancy_test[, yFeatures]),
dtype="float32", shape=c(nRowt, 1L))
cross_entropy_tst<-
tf$reduce_mean(tf$nn$sigmoid_cross_entropy_with_logits(labels=yt_,
logits=ypredt, name="cross_entropy_tst"))
前面的代码类似于训练交叉熵计算,使用的数据集不同。可以通过设置函数来返回张量(tensor)对象,从而尽可能地减少工作量。
4.添加要收集的摘要变量:
# 添加摘要操作以收集数据
w_hist = tf$summary$histogram("weights", W)
b_hist = tf$summary$histogram("biases", b)
crossEntropySummary<-tf$summary$scalar("costFunction",
cross_entropy)
crossEntropyTstSummary<-tf$summary$scalar("costFunction_test",
cross_entropy_tst)
脚本定义了要记录在文件中的摘要事件。
5.打开写对象log_writer,将默认图形写入c:/log:
# 为日志创建写对象
log_writer = tf$summary$FileWriter('c:/log', sess$graph)
6.运行优化并收集摘要:
for (step in 1:2500) {
sess$run(optimizer)
# 在50次迭代之后评估训练和测试数据的性能
if (step %% 50== 0){
### 训练的性能
ypred <- sess$run(tf$nn$sigmoid(tf$matmul(x, W) + b))
roc_obj <- roc(occupancy_train[, yFeatures], as.numeric(ypred))
### 测试的性能
ypredt <- sess$run(tf$nn$sigmoid(tf$matmul(xt, W) + b))
roc_objt <- roc(occupancy_test[, yFeatures], as.numeric(ypredt))
cat("train AUC: ", auc(roc_obj), " Test AUC: ", auc(roc_objt),
"n")
# 保存偏差和权重的摘要
log_writer$add_summary(sess$run(b_hist), global_step=step)
log_writer$add_summary(sess$run(w_hist), global_step=step)
log_writer$add_summary(sess$run(crossEntropySummary),
global_step=step)
log_writer$add_summary(sess$run(crossEntropyTstSummary),
global_step=step)
} }
7.使用摘要模块中的merge_all命令将所有摘要收集到一个张量中:
summary = tf$summary$merge_all()
8.使用log_writer对象将摘要写入日志文件:
log_writer = tf$summary$FileWriter('c:/log', sess$graph)
summary_str = sess$run(summary)
log_writer$add_summary(summary_str, step)
log_writer$close()
2.5.3 工作原理
本小节介绍如何使用TensorBoard进行模型性能可视化。训练和测试的交叉熵记录在SCALARS选项卡中,如图2-7所示。
对于训练和测试的成本函数,目标函数表现出相似的行为。因此,对于给定情况,该模型似乎是稳定的,约1,600次迭代处收敛。
2.6 从多层感知器开始
本节将着重于将逻辑回归概念扩展到神经网络。
是受生物脑的神经元结构启发的计算范例。
2.6.1 做好准备
ANN是一组人工神经元,对数据执行简单的操作。这个神经元的输出被传递给另一个神经元。每个神经元产生的输出称为其激活函数。在图2-8中可以看到一个多层感知器模型的例子。
图2-8中的每个链接都与神经元处理的权重相关联。每个神经元都可以看作一个处理单元,进行输入处理,并将输出传递到下一层,如图2-9所示。
神经元的输出:在神经元进行的处理可能是一个非常简单的操作,如输入乘以权重,然后进行求和或变换运算,如Sigmoid激活函数。
2.6.2 怎么做
本小节涵盖了多层感知器中的类型激活函数。激活是ANN的关键组件之一,因为它根据给定的输入定义该节点的输出。构建神经网络时有许多不同的激活函数,如下所示。
- Sigmoid:Sigmoid激活函数是一个连续函数,也称为逻辑函数,具有1/(1+exp(-x))的形式。在训练过程中,Sigmoid函数有一个趋势,将反向传播项归零,导致响应饱和。在TensorFlow中,Sigmoid激活函数是使用tf.nn.sigmoid函数定义的。
- ReLU(Rectified Linear Unit,修正线性单元):神经网络中用于捕获非线性的最有名的连续但不平滑的激活函数之一。ReLU函数定义为max(0,x)。在TensorFlow中, ReLU激活函数被定义为tf.nn.relu。
- ReLU6:限制ReLU函数在数值6并被定义为min(max(0, x), 6),因此该值不会变得非常小或很大。在TensorFlow中,该函数定义为tf.nn.relu6。
- tanh:双曲正切函数(Hypertangent)是另一个在神经网络中用作激活函数的平滑函数,被绑定为[-1, 1],并被实现为tf.nn.tanh。
- softplus:因为它是ReLU的一个连续版本,所以存在差异,并被定义为log(exp(x)+1)。在TensorFlow中,softplus被定义为tf.nn.softplus。
2.6.3 更多内容
神经网络有以下3种主要的结构。
- 前馈人工神经网络(Feedforward ANN):一类神经网络模型,其中信息流从输入到输出是单向的,因此架构不会形成任何循环。前馈网络的示例如图2-10所示。
- 反馈人工神经网络(Feedback ANN):也被称为埃尔曼(Elman)循环网络,是一类神经网络,其中输出节点处的误差用作反馈来迭代地更新以使误差最小化。图2-11显示了一个单层反馈神经网络架构的示例。
- 横向人工神经网络(Lateral ANN):一类处于反馈和前馈神经网络之间的神经网络,神经元在层内相互作用。图2-12显示了一个横向神经网络架构的示例。
2.7 使用H2O建立神经网络
在本节中,我们将介绍H2O在建立神经网络中的应用。该示例将使用与逻辑回归相似的数据集。
2.7.1 做好准备
首先,我们用下面的代码加载所有需要的软件包:
# 加载所需的软件包
require(h2o)
然后,使用h2o.init()函数在8个内核上初始化单节点H2O实例,并在IP地址localhost和端口号54321上实例化相应的客户端模块:
# 初始化H2O实例(单节点)
localH2O = h2o.init(ip = "localhost", port = 54321, startH2O =
TRUE,min_mem_size = "20G",nthreads = 8)
2.7.2 怎么做
本小节将介绍如何使用H2O构建神经网络。
1.将占用训练和测试数据集加载到R中:
# 加载占用数据
occupancy_train <-
read.csv("C:/occupation_detection/datatraining.txt",stringsAsFactor
s = T)
occupancy_test <-
read.csv("C:/occupation_detection/datatest.txt",stringsAsFactors =T)
2.以下自变量(x)和因变量(y)将被用于模拟广义线性模型:
# 定义输入变量(x)和输出变量(y)
x = c("Temperature", "Humidity", "Light", "CO2", "HumidityRatio")
y = "Occupancy"
3.根据H2O的要求,将因变量转换为以下因子变量:
# 将结果变量转换为因子变量
occupancy_train$Occupancy <- as.factor(occupancy_train$Occupancy)
occupancy_test$Occupancy <- as.factor(occupancy_test$Occupancy)
4.将数据集转换为H2OParsedData对象。
# 将训练和测试数据集转换为H2O对象
occupancy_train.hex <- as.h2o(x = occupancy_train,
destination_frame = "occupancy_train.hex")
occupancy_test.hex <- as.h2o(x = occupancy_test, destination_frame
= "occupancy_test.hex")
5.一旦数据被加载并被转换为H2OParsedData对象后,使用h2o.deeplearning函数构建多层前馈神经网络。在当前设置中,使用以下参数来构建神经网络模型:
- 使用hidden设置5个神经元的单隐藏层;
- 使用epochs设置50次迭代;
- 自适应学习率(adaptive_rate)而不是固定学习率(rate);
- 基于ReLU的Rectifier激活函数;
- 使用nfold的5折交叉验证。
# H2O基于神经网络训练模型
occupancy.deepmodel <- h2o.deeplearning(x = x,
y = y,
training_frame = occupancy_train.hex,
validation_frame = occupancy_test.hex,
standardize = F,
activation = "Rectifier",
epochs = 50,
seed = 1234567,
hidden = 5,
variable_importances = T,
nfolds = 5,
adaptive_rate = TRUE)
6.除了使用H2O执行逻辑回归这节中描述的命令外,还可以定义其他参数来微调模型性能。下面的举例并没有包括所有的函数参数,但根据重要性介绍了一些。完整的参数列表可在H2O软件包的文档中找到。
- 可以选择使用预训练的自动编码器模型来初始化模型。
- 通过选项修改时间衰减因子(rho)和平滑因子(epsilon)来调整自适应学习率。在固定学习率(rate)的情况下,可以选择修改退火率(rate_annealing)和层间衰减因子(rate_decay)。
- 可以选择初始化权重和偏差,以及权重分布和数值范围。
- 停止标准基于分类情况下的误差率和关于回归的均方误差(classification_stop和regression_stop),也可选择执行提前停止。
- 可以选择使用具有诸如移动速率和正则化强度之类的参数的弹性平均方法来改善分布式模型收敛。
2.7.3 工作原理
模型的性能可以通过多种指标进行评估,如精确度、曲线下面积(AUC)、错误分类错误率(%)、错误分类错误数、F1分数、精确度、召回率、特异性等。但是,在本章中,模型性能的评估是基于AUC的。
以下是训练模型的训练和交叉验证的精确度。训练和交叉验证AUC(取小数点后3位)分别为0.984和0.982。
# 获得训练的精确度(AUC)
> train_performance <- h2o.performance(occupancy.deepmodel,train = T)
> train_performance@metrics$AUC
[1] 0.9848667
# 获得交叉验证的精确度(AUC)
> xval_performance <- h2o.performance(occupancy.deepmodel,xval = T)
> xval_performance@metrics$AUC
[1] 0.9821723
由于我们已经在模型中提供了测试数据(作为验证数据集),下面是它的性能。测试数据的AUC是0.990。
# 获得测试的精确度(AUC)
> test_performance <- h2o.performance(occupancy.deepmodel,valid = T)
> test_performance@metrics$AUC
[1] 0.9905056
本文截选自《深度学习实战手册 R语言版》
本书将深度学习和R语言两者结合起来,帮助你解决深度学习实战中所遇到的各种问题,并且教会你掌握深度学习、神经网络和机器学习的高级技巧。本书从R语言中的各种深度学习软件包和软件库入手,带领你学习复杂的深度学习算法。首先,从构建各种神经网络模型开始,而后逐步过渡到深度学习在文本挖掘和信号处理中的应用,同时还比较了CPU和GPU的性能。
阅读完本书,你将对深度学习的架构和不同的深度学习包有一个比较深入的理解,能够为你今后碰到的项目或问题找到合适的解决方案。
- 上一篇: CL0P组织利用Seed传输窃取的敏感数据 (上)
- 下一篇: RNN网络实现识别mnist数据集
猜你喜欢
- 2024-09-24 行业篇:自动驾驶场景下的数据标注类别分享
- 2024-09-24 AI预标注,人工智能基础数据服务行业的新引擎丨曼孚科技
- 2024-09-24 基于Movielens-1M数据集和相似性矩阵实现的电影推荐算法(附源码)
- 2024-09-24 AAAI 2022 | GAN的结构有“指纹”吗?从伪造图像溯源生成网络结构
- 2024-09-24 人工智能时代,数据标注产业将迎来黄金时期?丨曼孚科技
- 2024-09-24 R数据分析:如何用R做多重插补,实例操练
- 2024-09-24 AI攻城狮,你需要那个数据集的种子吗?
- 2024-09-24 RNN网络实现识别mnist数据集
- 2024-09-24 CL0P组织利用Seed传输窃取的敏感数据 (上)
- 2024-09-24 详解SEED数据服务平台(5):批改与批注
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)