Реализация списка-затем-исключения в Python - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь реализовать алгоритм List-Then-Eliminate, используя набор данных.Тем не менее, я получаю неправильное векторное пространство в конце.Я не могу понять, в чем проблема.

По сути, я перебираю все обучающие экземпляры.Для каждой гипотезы я использую последние 5 битов, чтобы проверить, совпадает ли обучающий экземпляр, x, и затем сравниваю c(x)

. Любая помощь будет оценена.Ниже мой код.

def gen_vector_space(k):
    return [''.join(x) for x in itertools.product('01', repeat=k)]

#basically values from 0-65536 in binary
vector_space = gen_vector_space(pow(2,4)) 

for train_inst in train_data:

result = train_inst[-1]
d = train_inst[:-1]

for h in vector_space:
    if h[-5:-1] == d:
        if (h[-1] != result):
            vector_space.remove(h)
print(len(vector_space))

1 Ответ

0 голосов
/ 22 февраля 2019

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

def create_space(k):
    return [''.join(x) for x in itertools.product('01', repeat=k)]

Когда вы вызываете эту функцию, вы полностью перебираете этот диапазон, чтобы построить список, а затем повторяете список снова , чтобы отфильтровать значения.Два подхода к решению этой проблемы:

Если операторы в функции

# Redefine your function to only return values that matter to you

def create_space(k, d, result):
    """
    This will filter out your limits, takes result and d as params
    """
    vector_space = []

    for x in itertools.product('01', repeat=k):
        if x[-5:-1]==d and x[-1]!= result:
            vector_space.append(x)

    return vector_space

# define k, d, and result here

vector_space = create_space(k, d, result)

Генераторный подход

Или ключевое слово yield будет вычислять значения по одному за раз, поэтому выповторяем только один раз:

def create_space(k):
    for x in itertools.product('01', repeat=k):
        yield x


vector_space = []

# define d and result here

for x in create_space(k):
    if x[-5:-1]==d and x[-1]!= result:
        vector_space.append(x)

Следует отметить, что при любом из этих подходов я не редактирую уже установленный объект, пока перебираю его.Вместо этого я включил фильтрацию до того, как пространство было создано, так что вы получите именно то, что вы хотите с первого раза.

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