我有一个矩阵(我想在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和2用于测试,3到10用于训练
- 第2折:3和4用于测试,1、2和5到10用于训练
- 第3折:5和6用于测试,1到4和7到10用于训练
- 第4折:7和8用于测试,1到6和9到10用于训练
- 第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