MATLAB: 不使用现有函数进行10折交叉验证

我有一个矩阵(我想在MatLab中你称之为结构体)或数据结构:

  data: [150x4 double]labels: [150x1 double]

假设我加载了一个名为matrix的文件,以下是我的matrix.data的外观:

5.1000    3.5000    1.4000    0.20004.9000    3.0000    1.4000    0.20004.7000    3.2000    1.3000    0.20004.6000    3.1000    1.5000    0.20005.0000    3.6000    1.4000    0.20005.4000    3.9000    1.7000    0.40004.6000    3.4000    1.4000    0.30005.0000    3.4000    1.5000    0.20004.4000    2.9000    1.4000    0.20004.9000    3.1000    1.5000    0.10005.4000    3.7000    1.5000    0.20004.8000    3.4000    1.6000    0.20004.8000    3.0000    1.4000    0.10004.3000    3.0000    1.1000    0.10005.8000    4.0000    1.2000    0.20005.7000    4.4000    1.5000    0.40005.4000    3.9000    1.3000    0.40005.1000    3.5000    1.4000    0.30005.7000    3.8000    1.7000    0.30005.1000    3.8000    1.5000    0.3000

以下是我的matrix.labels的外观:

 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

我试图创建10折交叉验证,而不使用MatLab中的任何现有函数。由于我对MatLab的了解非常有限,我在继续进行时遇到了麻烦。任何帮助都将不胜感激。

这是我目前所做的,我确定这可能不是MatLab的方式,但我对MatLab非常新手。

function[output] = fisher(dataFile, number_of_folds)    data = load(dataFile);    %create random permutation indx    idx = randperm(150);    output = data.data(idx(1:15),:);end

回答:

这是我对这个交叉验证的看法。我使用magic(10)创建了虚拟数据,我也随机创建了标签。想法如下,我们获取数据和标签,并将它们与随机列结合起来。考虑以下虚拟代码。

>> data = magic(4)data =    16     2     3    13     5    11    10     8     9     7     6    12     4    14    15     1>> dataRowNumber = size(data,1)dataRowNumber =     4>> randomColumn = rand(dataRowNumber,1)randomColumn =    0.8147    0.9058    0.1270    0.9134>> X = [ randomColumn data]X =    0.8147   16.0000    2.0000    3.0000   13.0000    0.9058    5.0000   11.0000   10.0000    8.0000    0.1270    9.0000    7.0000    6.0000   12.0000    0.9134    4.0000   14.0000   15.0000    1.0000

如果我们根据第1列对X进行排序,我们的数据就会随机排序。这将为我们提供交叉验证的随机性。接下来的事情是根据交叉验证的百分比来划分X。对于一个案例来说,这很容易实现。假设75%是训练案例,25%是测试案例。我们这里的大小是4,那么3/4 = 75%,1/4是25%。

testDataset = X(1,:)trainDataset = X(2:4,:)

但是,对于N折交叉验证来说,实现这一点稍微困难一些。因为我们需要进行N次操作。为此需要使用for循环。对于5折交叉验证。我得到,在第一个f

  1. 第1折:1和2用于测试,3到10用于训练
  2. 第2折:3和4用于测试,1、2和5到10用于训练
  3. 第3折:5和6用于测试,1到4和7到10用于训练
  4. 第4折:7和8用于测试,1到6和9到10用于训练
  5. 第5折:9和10用于测试,1到8用于训练

以下代码是这个过程的一个示例:

data = magic(10);dataRowNumber = size(data,1);labels= rand(dataRowNumber,1) > 0.5;randomColumn = rand(dataRowNumber,1);X = [ randomColumn data labels];SortedData = sort(X,1);crossValidationFolds = 5;numberOfRowsPerFold = dataRowNumber / crossValidationFolds;crossValidationTrainData = [];crossValidationTestData = [];for startOfRow = 1:numberOfRowsPerFold:dataRowNumber    testRows = startOfRow:startOfRow+numberOfRowsPerFold-1;    if (startOfRow == 1)        trainRows = [max(testRows)+1:dataRowNumber];        else        trainRows = [1:startOfRow-1 max(testRows)+1:dataRowNumber];    end    crossValidationTrainData = [crossValidationTrainData ; SortedData(trainRows ,:)];    crossValidationTestData = [crossValidationTestData ;SortedData(testRows ,:)];end

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注