gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:14:43 25 4
gpt4 key购买 nike

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

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

这是我的矩阵。数据看起来像是假设我确实使用矩阵名称加载了我的文件:

5.1000    3.5000    1.4000    0.2000
4.9000 3.0000 1.4000 0.2000
4.7000 3.2000 1.3000 0.2000
4.6000 3.1000 1.5000 0.2000
5.0000 3.6000 1.4000 0.2000
5.4000 3.9000 1.7000 0.4000
4.6000 3.4000 1.4000 0.3000
5.0000 3.4000 1.5000 0.2000
4.4000 2.9000 1.4000 0.2000
4.9000 3.1000 1.5000 0.1000
5.4000 3.7000 1.5000 0.2000
4.8000 3.4000 1.6000 0.2000
4.8000 3.0000 1.4000 0.1000
4.3000 3.0000 1.1000 0.1000
5.8000 4.0000 1.2000 0.2000
5.7000 4.4000 1.5000 0.4000
5.4000 3.9000 1.3000 0.4000
5.1000 3.5000 1.4000 0.3000
5.7000 3.8000 1.7000 0.3000
5.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

我正在尝试在不使用 MatLab 中任何现有功能的情况下创建 10 交叉折叠验证,并且由于我对 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 for test, 1:6 9:10 for train
  5. 5th fold : 9 10 for test, 1:8 for train

以下代码是此过程的示例:

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

关于MATLAB:不使用现有函数的 10 折交叉验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12630293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com