首页 > 解决方案 > Python 中的 List-Then-Eliminate 实现

问题描述

我正在尝试使用数据集实现 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))

标签: pythonalgorithmmachine-learning

解决方案


我建议对创建向量空间的函数进行编辑。从您的原始功能开始:

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

当您调用该函数时,您将完全迭代该范围以构建列表,然后再次迭代列表以过滤掉值。解决此问题的两种方法:

函数中的 if 语句

# 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)

使用这两种方法中的任何一种都需要注意的是,我在迭代它时不会编辑已经建立的对象。相反,我已经在创建空间之前进行了过滤,这样您就可以在第一时间获得您想要的东西。


推荐阅读