遗传算法 - 适应度函数和规则优化

时间:2016-02-06 18:16:54

标签: machine-learning artificial-intelligence genetic-algorithm genetic-programming

假设我有一组训练示例,其中A_i是属性,输出为Iris-setosa

数据集中的值为

A1, A2, A3, A4      outcome
3   5   2   2       Iris-­setosa
3   4   2   2       Iris­-setosa
2   4   2   2       Iris­-setosa
3   6   2   2       Iris­-setosa
2   5   3   2       Iris­-setosa
3   5   2   2       Iris­-setosa
3   5   2   3       Iris­-setosa
4   6   2   2       Iris­-setosa
3   7   2   2       Iris­-setosa

从分析中,属性的范围是:

A1 ----> [2,3,4]
A2 ----> [4,5,6,7]
A3 ----> [2,3]
A4 ----> [2,3]

我定义了:

A1 ----> [Low(2),Medium(3),High(4)]
A2 ----> [Low(4,5),Medium(6),High(7)]
A3 ----> [Low(<2),Medium(2),High(3)]
A4 ----> [Low(<2),Medium(2),High(3)]

我的设置如下:

A1,         A2,         A3,         A4          outcome
Medium      Low         Medium      Medium      Iris-setosa     
Medium      Low         Medium      Medium      Iris-setosa
Low         Low         Medium      Medium      Iris-setosa
Medium      Medium      Medium      Medium      Iris-setosa
Low         Low         High        Medium      Iris-setosa
Medium      Low         Medium      Medium      Iris-setosa
Medium      Low         Medium      High        Iris-setosa
High        Medium      Medium      Medium      Iris-setosa
Medium      High        Medium      Medium      Iris-setosa

我知道我必须定义健身功能。这个问题是什么?在我的实际问题中,有 50 训练示例,但这是一个类似的问题。

如何使用GA优化规则?我怎么编码?

假设我输入(4,7,2,3),优化如何帮助我对输入是否为Iris-setosa进行分类?

感谢您的耐心等待。

3 个答案:

答案 0 :(得分:0)

您描述的任务称为one-class classification

通过从仅包含该类对象的训练集中学习,在所有元素中识别特定类的元素是

  

...与传统的分类问题不同,并且比传统的分类问题更困难,传统的分类问题试图用包含来自所有类的对象的训练集来区分两个或更多个类。

一种可行的方法是人工建立异常类数据并使用两类模型进行训练,但可能很棘手

生成人工异常数据时,您需要比目标数据更广泛的可能值(您必须确保目标数据在所有属性方向上都被包围)。

生成的两级训练数据集往往不平衡 大。

反正:

答案 1 :(得分:0)

好的,如果您只是想知道如何编程健身功能......假设训练数据是元组列表:

training_data = list((3,6,3,5),(8,3,1,2),(3,5,2,4)...)

为A1,A2等元素创建一个参考集,如下所示,假设第一个元组告诉我们所有其他元素的长度(这样你的训练数据中可以有任意数量的元组):

A=[]
for x in training_data[0]:
    res_list = set()
    res_list.update(x[index] for x in training_data)
    A.append(res_list)
    index+=1

现在您可以轻松引用所有参考数据(A [0],A [1]等的集合)。让我们做一个健身函数,它取一个元组并返回一个健身分数,这个分数将帮助GA收敛于正确的答案(如果是正确的元素则为1-4,如果在training_data中则为5+)。玩弄得分,但这些应该可以正常工作。

def fitness_function(target):
    # Assume target is a tuple of same length as reference data
    global A, training_data
    score = 0
    # Give a point for each element that is in the data set
    index = 0
    for t in target:
        if t in A[index]:
            score+=1
        index += 1 
    # Give 5 points if entire tuple is exact match
    if target in training_data:
        score+=5
    return score

答案 2 :(得分:0)

这里有一个多类别的分类问题,可以通过遗传编程和相关技术来解决。

我认为数据来自着名的Iris数据集:https://en.wikipedia.org/wiki/Iris_flower_data_set

如果您需要快速入门,可以使用我的方法的源代码:多表达式编程(基于遗传编程),可以从这里下载:https://github.com/mepx/mep-basic-src

src文件夹中有一个C ++源名称mep_multi_class.cpp,它可以“解决”iris数据集。只需使用iris.txt文件调用read_training_data函数(也可以从github的dataset文件夹中下载)。

或者,如果您不熟悉C ++,可以直接尝试具有简单用户界面的MEPX软件:http://www.mepx.org。也可以从github下载带有iris数据集的项目。