0
点赞
收藏
分享

微信扫一扫

【隔离中的代码(6)】首次实现完整python代码

无聊到学习 2022-03-18 阅读 45

技术要求:

  • 给定一个1000个数据的数据集,用来训练参数;
  • 拿来5个测试样本,测试训练的结果是否正确,注:测试结果含有GT。

完整代码:


# !usr/bin/env python3
# -*- coding:utf-8 -*-

"""
@author : 24nemo
 @date  : 2022年03月16日
"""

import operator
import random


class Creature(object):
    def __init__(self):

        self.b_1 = random.random() * 100
        self.b_2 = random.random() * 100
        self.target_score = random.randint(50, 100)
        self.accuracy = 0
        self.speaking_power = 0

    def print_target_score(self):
        print('target_score:', self.target_score)

    def born(self, b_1, b_2):
        if random.random() < 0.8:
            # self.a = a + (random.random() - 0.5) * a * 0.3
            self.b_1 = b_1 + (random.random() - 0.5) * b_1 * 0.3
            self.b_2 = b_2 + (random.random() - 0.5) * b_2 * 0.3

    def create_baby(self):
        creature = Creature()
        creature.born(self.b_1, self.b_2)
        return creature

    def train(self, dataset):
        iter_count = 0
        for iter in dataset:
            weight_score = iter[0] + iter[1] * self.b_1 + iter[2] * self.b_2
            if weight_score > self.target_score:
                if iter[3] == 1:
                    iter_count += 1
                else:
                    pass
            else:
                if iter[3] == 0:
                    iter_count += 1
                else:
                    pass
        # print('target_score:', self.target_score)
        self.accuracy = iter_count / len(dataset)

    def test(self, test_data):
        test_score = test_data[0] + test_data[1] * self.b_1 + test_data[2] * self.b_2
        if test_score > self.target_score:
            return 1
        else:
            return 0


class Generator():  # 先写节点,再写管理节点的类
    def __init__(self, epoch, num_creature):
        self.list = []
        self.epoch = epoch
        self.num_creature = num_creature
        for i in range(num_creature):
            self.list.append(Creature())

    def ask_train(self, dataset):  # 这个函数用来跑轮数
        for i in range(self.epoch):
            # new_para = []
            for creature in self.list:
                # new_para.append((creature.time_lapse(dataset), creature))  # 前面的参数表示,单个节点答对了多少次,后一参数记录这是那个节点
                creature.train(dataset)  # 前面的参数表示,单个节点答对了多少次,后一参数记录这是那个节点
            self.list.sort(key=operator.attrgetter('accuracy'))

            for ii in range(0, int(len(self.list) * 0.3), 1):
                del self.list[0]

            for ii in range(int(len(self.list) * 0.7), len(self.list), 1):
                self.list.append(self.list[ii].create_baby())

            sum_accuracy = 0
            for ii in range(len(self.list)):
                sum_accuracy += self.list[ii].accuracy
            for ii in range(len(self.list)):
                self.list[ii].speaking_power = self.list[ii].accuracy / sum_accuracy

    def ask_test(self, data):
        output_yes = 0
        output_no = 0
        for i in self.list:
            if i.test(data) == 0:
                output_no += i.speaking_power
            else:
                output_yes += i.speaking_power
        if output_no > output_yes:
            return 0
        else:
            return 1


def readdate(fileneme):
    file = open(fileneme)
    dataset = []
    for line in file:
        line.replace('\n', '')
        every_data_str = line.split(',')
        item = []
        for i in every_data_str:
            item.append(int(i))
        dataset.append(item)
    return dataset


generator = Generator(500, 500)

generator.ask_train(readdate('trainset.txt'))


testset = readdate('testset')
for i in testset:
    generator.ask_test(i)
    print(generator.ask_test(i))


演示效果:

  • 预测结果一次通过,成功!
    在这里插入图片描述

经验:

  • 应该说,旭哥跟我提想要实现的目标的时候,我是一头雾水的,尤其是昨天一晚上,和今天晚上中间提升需求的阶段;但是我硬着头皮往下写的时候,发现白天看的东西很有效果,我对于类的理解,以及对于遗传节点的想法,都有了很大程度的提升,好几个地方都是旭哥没有说出该怎么写,我就已经反应过来了,相比于昨天对算法和python类、面向对象编程的基础一头雾水的状态,好了太多了!
  • 另外,我对抽象问题的理解能力太弱了,其实旭哥提出的目标方案,是很容易实现的,但是由于我没有实现过任何头脑里的想法,就觉得要非常复杂的代码才能实现那些功能。而经过旭哥的拆解,把想法和目标变成程序语言,往往又是很简单几行代码就实现了的。
  • 有人带真是太快了,比我自己在那扣哧一年的收获还要大!不过还是摆正心态!
举报

相关推荐

0 条评论