写个程序来玩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
- 100% 正确解决当前问题
- 代码行数少
- 不依赖数据
- 有可解释性
- 特征工程, 要尽量提取数据特征, 并用数字表示
- 数据训练, 对数据进行观察分析, 找到合适的算法
- 模型预测, 对模型的准确度进行分析和调优
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
- 测试准确度并非 100%
- 代码行数较多
- 依赖数据
- 无可解释性