技术要求:
- 给定一个1000个数据的数据集,用来训练参数;
- 拿来5个测试样本,测试训练的结果是否正确,注:测试结果含有GT。
完整代码:
"""
@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.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
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):
for creature in self.list:
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类、面向对象编程的基础一头雾水的状态,好了太多了!
- 另外,我对抽象问题的理解能力太弱了,其实旭哥提出的目标方案,是很容易实现的,但是由于我没有实现过任何头脑里的想法,就觉得要非常复杂的代码才能实现那些功能。而经过旭哥的拆解,把想法和目标变成程序语言,往往又是很简单几行代码就实现了的。
- 有人带真是太快了,比我自己在那扣哧一年的收获还要大!不过还是摆正心态!