Эта функция вызывает MemoryError, Как справиться - PullRequest
0 голосов
/ 29 марта 2019

У меня есть файл и набор данных для генерации Matrix (лекарственное средство), набор данных не такой большой, всего 9000x строк, но я сталкиваюсь с MemoryError при использовании библиотеки алгоритмов. Есть ли способ запустить выборки в цикле (с помощью итераторов) или любой другой способ решить эту проблему.

Я пытался читать документацию, но не понял ее полностью. Любая помощь ценна.

def getParamter(real_matrix, multiple_matrix, testPosition):
    creator.create("FitnessMax", base.Fitness, weights=(1.0,))
    creator.create("Individual", array.array, typecode='d',
                   fitness=creator.FitnessMax)
    toolbox = base.Toolbox()
    # Attribute generator
    toolbox.register("attr_float", random.uniform, 0, 1)
    # Structure initializers
    variable_num = len(multiple_matrix)
    toolbox.register("individual", tools.initRepeat,
                     creator.Individual, toolbox.attr_float, variable_num)
    toolbox.register("population", tools.initRepeat, list, toolbox.individual)
    #################################################################################################
    real_labels = []
    for i in range(0, len(testPosition)):
        real_labels.append(real_matrix[testPosition[i][0], testPosition[i][1]])

    multiple_prediction = []
    for i in range(0, len(multiple_matrix)):
        predicted_probability = []
        predict_matrix = multiple_matrix[i]
        for j in range(0, len(testPosition)):
            predicted_probability.append(
                predict_matrix[testPosition[j][0], testPosition[j][1]])
        normalize = MinMaxScaler()
        predicted_probability = np.array(predicted_probability).reshape(-1, 1)
        predicted_probability = normalize.fit_transform(predicted_probability)
        multiple_prediction.append(predicted_probability)

    #################################################################################################
    print(len(real_labels), len(multiple_prediction))
    # real_labels = real_labels[0:1000]
    toolbox.register("evaluate", fitFunction,
                     parameter1=real_labels, parameter2=multiple_prediction)
    toolbox.register("mate", tools.cxTwoPoint)
    toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)
    toolbox.register("select", tools.selTournament, tournsize=3)

    random.seed(0)
    pop = toolbox.population(n=100)
    hof = tools.HallOfFame(1)
    stats = tools.Statistics(lambda ind: ind.fitness.values)
    stats.register("avg", numpy.mean)
    stats.register("std", numpy.std)
    stats.register("min", numpy.min)
    stats.register("max", numpy.max)

    # Below line is causing MemoryError
    pop, log = algorithms.eaSimple(pop, toolbox, cxpb=0.5, mutpb=0.2, ngen=50,
                                   stats=stats, halloffame=hof, verbose=True)
    pop.sort(key=lambda ind: ind.fitness, reverse=True)
    print(pop[0])
    return pop[0]

1 Ответ

0 голосов
/ 29 марта 2019

Я думаю, что проблема может заключаться во вложенных циклах for: вам следует избегать использования циклов for и предпочитать широковещательную трансляцию.

Я пытался повторить то, что вы сделали здесь:

multiple_prediction = []
    for i in range(0, len(multiple_matrix)):
        predicted_probability = []
        predict_matrix = multiple_matrix[i]
        for j in range(0, len(testPosition)):
            predicted_probability.append(
                predict_matrix[testPosition[j][0], testPosition[j][1]])
        normalize = MinMaxScaler()
        predicted_probability = np.array(predicted_probability).reshape(-1, 1)
        predicted_probability = normalize.fit_transform(predicted_probability)
        multiple_prediction.append(predicted_probability)

и вот что я придумал (возможно, я неправильно оценил ваш вклад):

import numpy as np
from sklearn.preprocessing import MinMaxScaler()

# dummy input
multiple_matrix = np.random.normal(size = (4,5,5))
testPosition = np.array([[1,2], [0,3], [3,1], [2,2]])

# scaler init
normalize = MinMaxScaler()

# the first dimension of multiple_matrix is the len(multiple_matrix)
x = multiple_matrix[:, testPosition[:,0], testPosition[:,1]]
multiple_prediction = normalize.fit_transform(x.T).T

Может быть, есть способ избежать двух транспозиций (.T), я не слишком долго пытался для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...