当前位置: 首页 > 工具软件 > Fizz > 使用案例 >

人工智能-编程-Fizz Buzz

韦知
2023-12-01

题目描述:

写个程序来玩Fizz Buzz. 这是一个游戏。玩家从1数到100,如果数字被3整除,那么喊’fizz’,如果被5整除就喊’buzz’,如果两个都满足就喊’fizzbuzz’,不然就直接说数字。这个游戏玩起来就像是:

1 2 fizz 4 buzz fizz 7 8 fizz buzz 11 fizz 13 14 fizzbuzz 16 …

一.传统方法编程

def fizz_buzz(num):
    if num % 3 == 0 and num % 5 == 0:
        return "fizz buzz"
    elif num % 3 == 0:
        return "fizz"
    elif num % 5 == 0:
        return "buzz"
    else:
        return str(num)


for i in range(100):
    print("%d : %s" % (i+1, fizz_buzz(i+1)))
1 : 1
2 : 2
3 : fizz
4 : 4
5 : buzz
.......
96 : fizz
97 : 97
98 : 98
99 : fizz
100 : buzz

优点:

  1. 100% 正确解决当前问题
  2. 代码行数少
  3. 不依赖数据
  4. 有可解释性

二.AI编程

机器学习需要三步:

  1. 特征工程, 要尽量提取数据特征, 并用数字表示
  2. 数据训练, 对数据进行观察分析, 找到合适的算法
  3. 模型预测, 对模型的准确度进行分析和调优

KNN分类算法:


import numpy as np
from sklearn.neighbors import KNeighborsClassifier

"""
knn分类算法: 
 
"""

# 第一步:  特征工程

# 为训练集和测试集打标签
# 正常情况下需要人工打标签, 这里利用程序去打
# 按规则分为四类: 0, 1, 2, 3
# 注: 在任何问题下, 特征和标签都应该具象化为数字
def fizz_buzz_label_data(num):
    if num % 3 == 0 and num % 5 == 0:
        return 0
    elif num % 3 == 0:
        return 1
    elif num % 5 == 0:
        return 2
    else:
        return 3


# 建立特征工程
# 这一步非常重要, 利用规则提取每个数字的特征作
# 比如按以下方法提取特征和标签为:
# 1:         [1, 1] -> 3
# 2:         [2, 2] -> 3
# 3:         [0, 3] -> 1
# 4:         [1, 4] -> 3
# 5:         [2, 0] -> 2
# ........
# 15:       [0, 0] -> 0
def feature_engineer(num):
    return [num % 3, num % 5]


# 收集训练集和测试集, 训练集和测试集不能有冲突, 否则会导致结果预测不准确
# 在这里我们用 101- 200 的数字作为训练集
train_data_x = np.array([feature_engineer(i) for i in range(101, 201)])
train_data_y = np.array([fizz_buzz_label_data(i) for i in range(101, 201)])

# 第二步:  数据训练

# 我们先将 超参数 k 设为 5, 正常情况下, 需要对超参数进行调优
model = KNeighborsClassifier(n_neighbors=5)
model.fit(train_data_x, train_data_y)

# 第三步: 数据的预测和打分

# 建立测试集

test_data_x = np.array([feature_engineer(i) for i in range(1, 101)])
test_data_y = np.array([fizz_buzz_label_data(i) for i in range(1, 101)])

# 对训练集进行测试
predict_y = model.predict(test_data_x)
print("对测试集进行的预测: %s" % predict_y)

# 对模型进行打分
model_score = model.score(test_data_x, test_data_y)
print("模型分数 : %s" % model_score)


# 模型的使用
def predict_num(num):
    num_label = model.predict(np.array([feature_engineer(num)]))[0]
    if num_label == 0:
        return "fizz buzz"
    elif num_label == 1:
        return "fizz"
    elif num_label == 2:
        return "buzz"
    elif num_label == 3:
        return str(num)


for i in range(100):
    print("%d : %s" % (i + 1, predict_num(i + 1)))
对测试集进行的预测: [3 3 1 3 2 1 3 3 1 2 3 1 3 3 0 3 3 1 3 2 1 3 3 1 2 3 1 3 3 0 3 3 1 3 2 1 3
 3 1 2 3 1 3 3 0 3 3 1 3 2 1 3 3 1 2 3 1 3 3 0 3 3 1 3 2 1 3 3 1 2 3 1 3 3
 0 3 3 1 3 2 1 3 3 1 2 3 1 3 3 0 3 3 1 3 2 1 3 3 1 2]
模型分数 : 1.0
1 : 1
2 : 2
3 : fizz
4 : 4
5 : buzz
6 : fizz
........
98 : 98
99 : fizz
100 : buzz

特点:

  1. 测试准确度并非 100%
  2. 代码行数较多
  3. 依赖数据
  4. 无可解释性
 类似资料: