随机森林max_depth对RMSE值得影响

时间: 2023-08-06 13:07:24 浏览: 43
随机森林中的max_depth参数代表决策树的最大深度,它对RMSE值的影响取决于数据集的特征和目标变量。一般来说,增加max_depth可以提高模型的拟合能力,因为决策树可以更深入地挖掘特征与目标变量之间的关系。但是,如果max_depth设置得过高,就会导致过拟合,模型在训练集上表现很好,但在测试集上表现很差。因此,需要通过交叉验证等方法来确定max_depth的最佳取值,以平衡模型的拟合能力和泛化能力,从而获得更好的RMSE值。
相关问题

怎么通过交叉验证等方法来确定max_depth的最佳取值?请给代码演示

确定max_depth的最佳取值可以使用网格搜索(Grid Search)结合交叉验证(Cross Validation)的方法。下面是一个简单的示例代码: ```python from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import GridSearchCV, KFold from sklearn.metrics import mean_squared_error import numpy as np # 加载数据集 X = np.load('X.npy') y = np.load('y.npy') # 定义随机森林模型和参数范围 rf = RandomForestRegressor(n_estimators=100, random_state=42) param_grid = {'max_depth': [3, 5, 7, 9, 11]} # 定义交叉验证方法 kf = KFold(n_splits=5, shuffle=True, random_state=42) # 网格搜索交叉验证 grid_search = GridSearchCV(rf, param_grid, cv=kf, scoring='neg_mean_squared_error') grid_search.fit(X, y) # 输出最佳参数和最佳得分 print("Best parameters: {}".format(grid_search.best_params_)) print("Best cross-validation score: {:.2f}".format(np.sqrt(-grid_search.best_score_))) # 输出最佳模型在测试集上的RMSE值 best_rf = grid_search.best_estimator_ y_pred = best_rf.predict(X_test) print("Test RMSE: {:.2f}".format(np.sqrt(mean_squared_error(y_test, y_pred)))) ``` 在以上代码中,首先加载数据集X和y,然后定义了随机森林模型rf和参数范围param_grid。接着,定义了交叉验证方法kf,其中n_splits表示将数据集分成几份,shuffle表示是否在分割前打乱数据集,random_state表示随机种子。然后,使用GridSearchCV进行网格搜索交叉验证,其中参数cv表示使用的交叉验证方法,scoring表示评价指标,这里使用负均方误差(neg_mean_squared_error)作为评价指标。最后,输出最佳参数和最佳得分,以及最佳模型在测试集上的RMSE值。

深度神经模糊随机森林python代码

### 回答1: 深度神经模糊随机森林(Deep Neural Fuzzy Random Forest,DNF-RF)是一种结合了模糊逻辑、神经网络和随机森林的机器学习算法。以下是一个使用Python实现DNF-RF的示例代码: ```python import numpy as np from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_squared_error import math # 定义模糊逻辑函数 def fuzzy_logic(x, a, b, c, d): if x <= a or x >= d: return 0 elif a < x <= b: return (x - a) / (b - a) elif b < x <= c: return 1 elif c < x < d: return (d - x) / (d - c) # 定义深度模糊神经网络模型 class DNF_NN(): def __init__(self, num_inputs, num_hidden_layers, num_hidden_nodes): self.num_inputs = num_inputs self.num_hidden_layers = num_hidden_layers self.num_hidden_nodes = num_hidden_nodes self.weights = [] self.biases = [] for i in range(num_hidden_layers+1): if i == 0: w = np.random.randn(num_inputs, num_hidden_nodes) b = np.random.randn(num_hidden_nodes) elif i == num_hidden_layers: w = np.random.randn(num_hidden_nodes, 1) b = np.random.randn(1) else: w = np.random.randn(num_hidden_nodes, num_hidden_nodes) b = np.random.randn(num_hidden_nodes) self.weights.append(w) self.biases.append(b) def predict(self, X): a = np.copy(X) for i in range(self.num_hidden_layers+1): z = np.dot(a, self.weights[i]) + self.biases[i] if i == self.num_hidden_layers: y = z else: y = np.zeros_like(z) for j in range(self.num_hidden_nodes): y[j] = fuzzy_logic(z[j], -1, -0.5, 0.5, 1) a = y return y # 定义深度模糊随机森林模型 class DNF_RF(): def __init__(self, num_trees, num_inputs, num_hidden_layers, num_hidden_nodes): self.num_trees = num_trees self.num_inputs = num_inputs self.num_hidden_layers = num_hidden_layers self.num_hidden_nodes = num_hidden_nodes self.trees = [] for i in range(num_trees): tree = DNF_NN(num_inputs, num_hidden_layers, num_hidden_nodes) self.trees.append(tree) def fit(self, X, y): for i in range(self.num_trees): indices = np.random.choice(X.shape[0], X.shape[0], replace=True) X_boot = X[indices] y_boot = y[indices] self.trees[i].fit(X_boot, y_boot) def predict(self, X): predictions = np.zeros((X.shape[0], self.num_trees)) for i in range(self.num_trees): predictions[:, i] = self.trees[i].predict(X).flatten() return np.mean(predictions, axis=1) # 测试代码 if __name__ == '__main__': # 生成示例数据 X = np.random.randn(1000, 5) y = np.sin(X[:,0]) + np.cos(X[:,1]) + np.tan(X[:,2]) + np.power(X[:,3], 2) + np.exp(X[:,4]) # 划分训练集和测试集 X_train = X[:800] X_test = X[800:] y_train = y[:800] y_test = y[800:] # 训练模型 model = DNF_RF(num_trees=10, num_inputs=5, num_hidden_layers=2, num_hidden_nodes=10) model.fit(X_train, y_train) # 测试模型 y_pred = model.predict(X_test) mse = mean_squared_error(y_test, y_pred) rmse = math.sqrt(mse) print('RMSE:', rmse) ``` 在上面的代码中,我们首先定义了一个模糊逻辑函数fuzzy_logic,它用于将输入映射到0和1之间的模糊值。然后定义了一个深度模糊神经网络模型DNF_NN,它包含了多个隐藏层和多个隐藏节点,每个节点都使用模糊逻辑函数进行激活。最后定义了一个深度模糊随机森林模型DNF_RF,它包含了多个DNF_NN模型,并且每个模型都使用不同的数据子集进行训练。在测试代码中,我们首先生成了一个示例数据集,并将其划分为训练集和测试集。然后使用DNF_RF模型对训练集进行训练,并使用测试集进行测试,输出了RMSE作为性能指标。 ### 回答2: 深度神经模糊随机森林(DNN fuzzy random forest)是一种应用于机器学习的算法,通过结合深度神经网络和模糊随机森林的特点来提高分类和回归任务的准确性和效率。下面是一个使用Python实现深度神经模糊随机森林的示例代码: ```python from sklearn.ensemble import RandomForestClassifier from sklearn.neural_network import MLPClassifier # 初始化深度神经网络分类器 dnn_clf = MLPClassifier(hidden_layer_sizes=(100, 100), activation='relu', solver='adam', random_state=42) # 初始化模糊随机森林分类器 frf_clf = RandomForestClassifier(n_estimators=100, max_depth=10, random_state=42) # 结合深度神经网络和模糊随机森林形成深度神经模糊随机森林分类器 dnn_frf_clf = RandomForestClassifier(n_estimators=100, max_depth=10, random_state=42, base_estimator=dnn_clf) # 训练模型 dnn_frf_clf.fit(X_train, y_train) # 预测结果 y_pred = dnn_frf_clf.predict(X_test) # 计算准确率 accuracy = np.mean(y_pred == y_test) # 打印结果 print("准确率:", accuracy) ``` 上述代码中,我们首先导入了需要的模块,包括`RandomForestClassifier`随机森林分类器和`MLPClassifier`深度神经网络分类器。然后,我们分别初始化了深度神经网络分类器`dnn_clf`和模糊随机森林分类器`frf_clf`,并选择适当的参数进行设置。接下来,我们使用`RandomForestClassifier`的`base_estimator`参数将深度神经网络分类器作为基分类器,形成深度神经模糊随机森林分类器`dnn_frf_clf`。通过调用`fit`方法,我们使用训练集`X_train`和`y_train`对模型进行训练。最后,我们使用测试集`X_test`对模型进行预测并计算准确率。 该示例代码仅为一个简单的实现示例,实际使用时可能需要根据具体问题进行参数的调整和优化。 ### 回答3: 深度神经模糊随机森林((Deep Neural Fuzzy Random Forest, DNFRF))是一种集成学习方法,结合深度神经网络和模糊集合理论的特点,用于解决分类和回归问题。以下是一份使用Python实现DNFRF的代码示例: ```python import numpy as np from sklearn.ensemble import RandomForestClassifier from skfuzzy import cmeans, cmeans_predict from keras.models import Sequential from keras.layers import Dense # 定义DNFRF类 class DNFRF: def __init__(self, n_clusters=2, n_estimators=100, fuzzy_c=2): self.n_clusters = n_clusters self.n_estimators = n_estimators self.fuzzy_c = fuzzy_c self.clusters = [] self.rf_models = [] self.fuzzy_models = [] def fit(self, X, y): # 构建模糊集合 cntr, u, u0, d, jm, p, fpc = cmeans(X.T, self.n_clusters, self.fuzzy_c, error=0.005, maxiter=1000) for i in range(self.n_clusters): # 获取每个模糊集合的样本 cluster_samples = X[np.argmax(u, axis=0) == i] cluster_labels = y[np.argmax(u, axis=0) == i] # 构建随机森林模型 rf_model = RandomForestClassifier(n_estimators=self.n_estimators) rf_model.fit(cluster_samples, cluster_labels) self.rf_models.append(rf_model) # 构建深度神经网络模型 nn_model = Sequential() nn_model.add(Dense(64, input_dim=X.shape[1], activation='relu')) nn_model.add(Dense(1, activation='sigmoid')) nn_model.compile(loss='binary_crossentropy', optimizer='adam') nn_model.fit(cluster_samples, cluster_labels, epochs=10, batch_size=32) self.fuzzy_models.append(nn_model) self.clusters.append(cluster_samples) def predict(self, X): y_pred = np.zeros((X.shape[0],)) for i in range(self.n_clusters): cluster_samples = self.clusters[i] rf_model = self.rf_models[i] fuzzy_model = self.fuzzy_models[i] # 使用随机森林模型进行预测 rf_pred = rf_model.predict(X) # 使用深度神经网络模型进行预测 fuzzy_pred = fuzzy_model.predict(X) # 对两个预测结果进行模糊合并 combined_pred = np.fmax(np.fmin(rf_pred, fuzzy_pred), np.fmin(1 - rf_pred, 1 - fuzzy_pred)) y_pred += combined_pred # 平均多个预测结果 y_pred /= self.n_clusters return y_pred ``` 以上是一个简单的DNFRF类的示例代码,其中包括了构建模糊集合、训练随机森林和深度神经网络模型、以及使用这些模型进行预测的步骤。通过调用`fit`函数可以进行模型的训练,调用`predict`函数可以进行分类或回归预测。请注意,这只是一个示例代码,具体实现可能因具体任务和数据而异。

相关推荐

from sklearn.ensemble import AdaBoostRegressor from sklearn.tree import DecisionTreeRegressor from sklearn.linear_model import LinearRegression from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import train_test_split import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.metrics import mean_squared_error as MSE from sklearn.metrics import mean_absolute_error as MAE # 从CSV文件中读取数据 data = pd.read_excel('battery.xlsx') # 分离X和y X = data.iloc[:, :-1].values y = data.iloc[:, -1].values X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) # 定义基础模型 linear_model = LinearRegression() decision_tree_model = DecisionTreeRegressor(max_depth=5) random_forest_model = RandomForestRegressor(n_estimators=100, max_depth=30, random_state=42) base_model = [linear_model, decision_tree_model, random_forest_model] # 定义AdaBoost回归器 ada_boost = AdaBoostRegressor(base_estimator=DecisionTreeRegressor(max_depth=5), n_estimators=100, learning_rate=0.1, random_state=42) # 训练模型 ada_boost.fit(X_train, y_train) # 预测并计算均方误差 y_pred = ada_boost.predict(X_test) print("MAE:", MAE(y_pred, y_test)) print("MSE:", MSE(y_pred, y_test)) print("RMSE:", np.sqrt(MSE(y_pred, y_test))) print("训练集R^2:", ada_boost.score(X_train, y_train)) print("测试集R^2:", ada_boost.score(X_test, y_test)) # 评估预测结果 plt.figure() plt.plot(range(len(y_pred)), y_pred, 'b', label = 'predict') plt.plot(range(len(y_pred)), y_test, 'r', label = 'test') plt.legend(loc = 'upper right') plt.ylabel("SOH") plt.show() 请告诉我这个代码是什么意思

改成三分类预测代码n_trees = 100 max_depth = 10 forest = [] for i in range(n_trees): idx = np.random.choice(X_train.shape[0], size=X_train.shape[0], replace=True) X_sampled = X_train[idx, :] y_sampled = y_train[idx] X_fuzzy = [] for j in range(X_sampled.shape[1]): if np.median(X_sampled[:, j])> np.mean(X_sampled[:, j]): fuzzy_vals = fuzz.trapmf(X_sampled[:, j], [np.min(X_sampled[:, j]), np.mean(X_sampled[:, j]), np.median(X_sampled[:, j]), np.max(X_sampled[:, j])]) else: fuzzy_vals = fuzz.trapmf(X_sampled[:, j], [np.min(X_sampled[:, j]), np.median(X_sampled[:, j]), np.mean(X_sampled[:, j]), np.max(X_sampled[:, j])]) X_fuzzy.append(fuzzy_vals) X_fuzzy = np.array(X_fuzzy).T tree = RandomForestClassifier(n_estimators=1, max_depth=max_depth) tree.fit(X_fuzzy, y_sampled) forest.append(tree) inputs = keras.Input(shape=(X_train.shape[1],)) x = keras.layers.Dense(64, activation="relu")(inputs) x = keras.layers.Dense(32, activation="relu")(x) outputs = keras.layers.Dense(1, activation="sigmoid")(x) model = keras.Model(inputs=inputs, outputs=outputs) model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"]) y_pred = np.zeros(y_train.shape) for tree in forest: a = [] for j in range(X_train.shape[1]): if np.median(X_train[:, j]) > np.mean(X_train[:, j]): fuzzy_vals = fuzz.trapmf(X_train[:, j], [np.min(X_train[:, j]), np.mean(X_train[:, j]), np.median(X_train[:, j]), np.max(X_train[:, j])]) else: fuzzy_vals = fuzz.trapmf(X_train[:, j], [np.min(X_train[:, j]), np.median(X_train[:, j]), np.mean(X_train[:, j]), np.max(X_train[:, j])]) a.append(fuzzy_vals) fuzzy_vals = np.array(a).T y_pred += tree.predict_proba(fuzzy_vals)[:, 1] y_pred /= n_trees model.fit(X_train, y_pred, epochs=10, batch_size=32) y_pred = model.predict(X_test) mse = mean_squared_error(y_test, y_pred) rmse = math.sqrt(mse) print('RMSE:', rmse) print('Accuracy:', accuracy_score(y_test, y_pred))

改成三分类代码n_trees = 100 max_depth = 10 forest = [] for i in range(n_trees): idx = np.random.choice(X_train.shape[0], size=X_train.shape[0], replace=True) X_sampled = X_train[idx, :] y_sampled = y_train[idx] X_fuzzy = [] for j in range(X_sampled.shape[1]): if np.median(X_sampled[:, j])> np.mean(X_sampled[:, j]): fuzzy_vals = fuzz.trapmf(X_sampled[:, j], [np.min(X_sampled[:, j]), np.mean(X_sampled[:, j]), np.median(X_sampled[:, j]), np.max(X_sampled[:, j])]) else: fuzzy_vals = fuzz.trapmf(X_sampled[:, j], [np.min(X_sampled[:, j]), np.median(X_sampled[:, j]), np.mean(X_sampled[:, j]), np.max(X_sampled[:, j])]) X_fuzzy.append(fuzzy_vals) X_fuzzy = np.array(X_fuzzy).T tree = RandomForestClassifier(n_estimators=1, max_depth=max_depth) tree.fit(X_fuzzy, y_sampled) forest.append(tree) inputs = keras.Input(shape=(X_train.shape[1],)) x = keras.layers.Dense(64, activation="relu")(inputs) x = keras.layers.Dense(32, activation="relu")(x) outputs = keras.layers.Dense(1, activation="sigmoid")(x) model = keras.Model(inputs=inputs, outputs=outputs) model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"]) y_pred = np.zeros(y_train.shape) for tree in forest: a = [] for j in range(X_train.shape[1]): if np.median(X_train[:, j]) > np.mean(X_train[:, j]): fuzzy_vals = fuzz.trapmf(X_train[:, j], [np.min(X_train[:, j]), np.mean(X_train[:, j]), np.median(X_train[:, j]), np.max(X_train[:, j])]) else: fuzzy_vals = fuzz.trapmf(X_train[:, j], [np.min(X_train[:, j]), np.median(X_train[:, j]), np.mean(X_train[:, j]), np.max(X_train[:, j])]) a.append(fuzzy_vals) fuzzy_vals = np.array(a).T y_pred += tree.predict_proba(fuzzy_vals)[:, 1] y_pred /= n_trees model.fit(X_train, y_pred, epochs=10, batch_size=32) y_pred = model.predict(X_test) mse = mean_squared_error(y_test, y_pred) rmse = math.sqrt(mse) print('RMSE:', rmse) print('Accuracy:', accuracy_score(y_test, y_pred))

以下这段代码是关于CatBoost模型的超参数调整,但里面好像不是在五倍交叉验证下做的分析,请问应该怎么加上五倍交叉验证呢?import os import time import pandas as pd from catboost import CatBoostRegressor from hyperopt import fmin, hp, partial, Trials, tpe,rand from sklearn.metrics import r2_score, mean_squared_error from sklearn.model_selection import train_test_split from sklearn.model_selection import KFold, cross_val_score as CVS, train_test_split as TTS 自定义hyperopt的参数空间 space = {"iterations": hp.choice("iterations", range(1, 30)), "depth": hp.randint("depth", 16), "l2_leaf_reg": hp.randint("l2_leaf_reg", 222), "border_count": hp.randint("border_count", 222), 'learning_rate': hp.uniform('learning_rate', 0.001, 0.9), } data = pd.read_csv(r"E:\exercise\synthesis\synthesis_dummy_2.csv") #验证随机森林填补缺失值方法是否有效 X = data.iloc[:,1:] y = data.iloc[:,0] Xtrain,Xtest,Ytrain,Ytest = TTS(X_wrapper,y,test_size=0.2,random_state=100) def epoch_time(start_time, end_time): elapsed_secs = end_time - start_time elapsed_mins = elapsed_secs / 60 return elapsed_mins, elapsed_secs 自动化调参并训练 def cat_factory(argsDict): estimator = CatBoostRegressor(loss_function='RMSE', random_seed=22, learning_rate=argsDict['learning_rate'], iterations=argsDict['iterations'], l2_leaf_reg=argsDict['l2_leaf_reg'], border_count=argsDict['border_count'], depth=argsDict['depth'], verbose=0) estimator.fit(Xtrain, Ytrain) val_pred = estimator.predict(Xtest) mse = mean_squared_error(Ytest, val_pred) return mse

最新推荐

recommend-type

python之MSE、MAE、RMSE的使用

我就废话不多说啦,直接上代码吧! target = [1.5, 2.1, 3.3, -4.7, -2.3, 0.75] prediction = [0.5, 1.5, 2.1, -2.2, 0.1, -0.5] error = [] for i in range(len(target)): error.append(target[i] - prediction...
recommend-type

用AIDA模型,分析知乎、小红书和Facebook的广告效果.docx

用AIDA模型,分析知乎、小红书和Facebook的广告效果.docx
recommend-type

pd27.py1111111111111

pd27.py1111111111111
recommend-type

234_基于微信小程序的车位预约系统的设计与实施-源码.zip

提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

hive中 的Metastore

Hive中的Metastore是一个关键的组件,它用于存储和管理Hive中的元数据。这些元数据包括表名、列名、表的数据类型、分区信息、表的存储位置等信息。Hive的查询和分析都需要Metastore来管理和访问这些元数据。 Metastore可以使用不同的后端存储来存储元数据,例如MySQL、PostgreSQL、Oracle等关系型数据库,或者Hadoop分布式文件系统中的HDFS。Metastore还提供了API,使得开发人员可以通过编程方式访问元数据。 Metastore的另一个重要功能是跟踪表的版本和历史。当用户对表进行更改时,Metastore会记录这些更改,并且可以让用户回滚到
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依