У меня есть некоторые данные, и я хочу разбить его на более мелкие группы, поддерживающие общий коэффициент. Я написал функцию, которая возьмет входной сигнал из двух массивов и вычислит отношение размера, а затем скажет мне, сколько групп я могу разбить на это (если все группы имеют одинаковый размер), вот функция:
def cross_validation_group(train_data, test_data):
import numpy as np
from calculator import factors
test_length = len(test_data)
train_length = len(train_data)
total_length = test_length + train_length
ratio = test_length/float(total_length)
possibilities = factors(total_length)
print possibilities
print possibilities[len(possibilities)-1] * ratio
super_count = 0
for i in possibilities:
if i < len(possibilities)/2:
pass
else:
attempt = float(i * ratio)
if attempt.is_integer():
print str(i) + " is an option for total size with " + str(attempt) + " as test size and " + str(i - attempt) + " as train size! This is with " + str(total_length/i) + " folds."
else:
pass
folds = int(raw_input("So how many folds would you like to use? If no possibilities were given that would be sufficient, type 0: "))
if folds != 0:
total_size = total_length/folds
test_size = float(total_size * ratio)
train_size = total_size - test_size
columns = train_data[0]
columns= len(columns)
groups = np.empty((folds,(test_size + train_size),columns))
i = 0
a = 0
b = 0
for j in range (0,folds):
test_size_new = test_size * (j + 1)
train_size_new = train_size * j
total_size_new = (train_size + test_size) * (j + 1)
cut_off = total_size_new - train_size
p = 0
while i < total_size_new:
if i < cut_off:
groups[j,p] = test_data[a]
a += 1
else:
groups[j,p] = train_data[b]
b += 1
i += 1
p += 1
return groups
else:
print "This method cannot be used because the ratio cannot be maintained with equal group sizes other than for the options you were givens"
Итак, мой вопрос заключается в том, как я могу сделать это так, чтобы третий вход в функцию представлял собой количество сгибов и менял функцию вокруг так, чтобы вместо того, чтобы выполнять итерацию, чтобы убедиться, что каждая группа имеет одинаковую сумму с правильное соотношение, оно будет иметь только соотношение, но варьируется в размерах?
Дополнение для @JamesHolderness
Итак, ваш метод почти идеален, но вот одна проблема:
с длиной 357 и 143 с 9 краями, это возвращаемый список:
[(39, 16), (39, 16), (39, 16), (39, 16), (39, 16), (39, 16), (39, 16), (39, 16), (39, 16)]
теперь, когда вы добавляете столбцы, вы получаете следующее: 351 144
351 отлично, потому что он меньше 357, но 144 не работает, потому что он больше 143! Причиной этого является то, что 357 и 143 являются массивами массивов, поэтому 144-я строка этого массива не существует...