fizzbuzz的机器学习解法

标签: 机器学习 fizzbuzz
624人阅读 评论(0) 收藏 举报
分类:

转:

fizzbuzz是面试的常见问题,内容为:输出0到100的数字,但是3的倍数输出Fizz,5的倍数输出Buzz,同时是3和5的倍数的输出FizzBuzz。

通过训练一个分类器将结果分为4classes:

  • fizz
  • buzz
  • fizzbuzz
  • none

all in all,网络输入需要为二进制,我们需要将9表示为[1,0,0,1],我们取输入神经元为10个,达到1024的训练数据,避免作弊嫌疑.

def binary_encode(i, num_digits):
    return np.array([i >> d & 1 for d in range(num_digits)])

输出用四个神经元one-hot来表示即可:

if   i % 15 == 0: return np.array([0, 0, 0, 1])
elif i % 5  == 0: return np.array([0, 0, 1, 0])
elif i % 3  == 0: return np.array([0, 1, 0, 0])
else:             return np.array([1, 0, 0, 0])

这个时候,输入输出已经做好,取101至1024作为训练集

NUM_DIGITS = 10
trX = np.array([binary_encode(i, NUM_DIGITS) for i in range(101, 2 ** NUM_DIGITS)])
trY = np.array([fizz_buzz_encode(i)          for i in range(101, 2 ** NUM_DIGITS)])

定义输入参数(tensorflow)

NUM_HIDDEN = 100
X = tf.placeholder("float", [None, NUM_DIGITS])
Y = tf.placeholder("float", [None, 4])

def init_weights(shape):
    return tf.Variable(tf.random_normal(shape, stddev=0.01))

#初始化
w_h = init_weights([NUM_DIGITS, NUM_HIDDEN])

#隐含层输出
def model(X, w_h, w_o):
    h = tf.nn.relu(tf.matmul(X, w_h))
    return tf.matmul(h, w_o)

用交叉熵定义损失函数

py_x = model(X, w_h, w_o)

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(py_x, Y))
train_op = tf.train.GradientDescentOptimizer(0.05).minimize(cost)
#定义网络输出
predict_op = tf.argmax(py_x, 1)
def fizz_buzz(i, prediction):
    return [str(i), "fizz", "buzz", "fizzbuzz"][prediction]

下面用sdg训练


BATCH_SIZE = 128

# Launch the graph in a session
with tf.Session() as sess:
    tf.initialize_all_variables().run()

    for epoch in range(10000):
        # Shuffle the data before each training iteration.
        p = np.random.permutation(range(len(trX)))
        trX, trY = trX[p], trY[p]

        # Train in batches of 128 inputs.
        for start in range(0, len(trX), BATCH_SIZE):
            end = start + BATCH_SIZE
            sess.run(train_op, feed_dict={X: trX[start:end], Y: trY[start:end]})

        # And print the current accuracy on the training data.
        print(epoch, np.mean(np.argmax(trY, axis=1) ==
                             sess.run(predict_op, feed_dict={X: trX, Y: trY})))

    # And now for some fizz buzz
    numbers = np.arange(1, 101)
    teX = np.transpose(binary_encode(numbers, NUM_DIGITS))
    teY = sess.run(predict_op, feed_dict={X: teX})
    output = np.vectorize(fizz_buzz)(numbers, teY)

    print(output)

可以运行了

查看评论

FizzBuzz问题

问题:请依次打印从1至100的整数,在该数能被3整除的时候,打印"Fizz",能被5整除的时候打印"Buzz",如果既能被3又能被5整除的时候,打印"FizzBuzz"。解决代码:          ...
  • KOON
  • KOON
  • 2007-03-25 21:16:00
  • 5719

LintCode-Fizz Buzz问题

描述 给你一个整数n. 从 1 到 n 按照下面的规则打印每个数: 如果这个数被3整除,打印fizz. 如果这个数被5整除,打印buzz. 如果这个数能同时被3和5整除,打印fizz buzz...
  • qq_34312386
  • qq_34312386
  • 2017-04-22 20:15:36
  • 627

LintCode 9 Fizz Buzz 问题

题目:fizzBuzz要求:给你一个整数n. 从 1 到 n 按照下面的规则打印每个数: 1.如果这个数被3整除,打印fizz. 2.如果这个数被5整除,打印buzz. 3.如...
  • linglian0522
  • linglian0522
  • 2017-02-16 16:15:16
  • 725

Fizz Buzz

问题描述: 给你一个整数n. 从 1 到 n 按照下面的规则打印每个数: 如果这个数被3整除,打印fizz.如果这个数被5整除,打印buzz.如果这个数能同时被3和5整除,打印fizz buzz...
  • yanruoX7
  • yanruoX7
  • 2015-09-15 21:38:01
  • 330

lintcode-简单- Fizz Buzz 问题

给你一个整数n. 从 1 到 n 按照下面的规则打印每个数: 如果这个数被3整除,打印fizz.如果这个数被5整除,打印buzz. 如果这个数能同时被3和5整除,打印fizz bu...
  • zlj1217
  • zlj1217
  • 2017-02-16 13:27:28
  • 593

LeetCode-FizzBuzz经验总结

多维数组操作
  • u014793043
  • u014793043
  • 2017-01-02 11:59:22
  • 407

关于FizzBuzz问题

“编写程序把1-100的数字打印出来。不过,要把3的倍数打成"Fizz",把5的倍数打成"Buzz"。而如果一个数既是3的倍数。又是5的倍数时,就打成"Fizz-Buzz",其余的输出数字。...
  • u010202304
  • u010202304
  • 2014-12-28 14:12:42
  • 2893

我对FizzBuzz问题的小小思考

援引http://news.csdn.net/n/20070305/101739.html的文章,举个“FizzBuzz”问题的例子: 写一个程序打印1到100这些数字。但是遇到数字为3的倍...
  • ixidof
  • ixidof
  • 2012-06-27 18:34:53
  • 6251

一场奇怪的面试,TensorFlow 实现FizzBuzz

在某大神博客看到一篇翻译文章,实在有意思,原文链接:http://blog.topspeedsnail.com/archives/11010 话说Fizz Buzz是什么鬼? Fi...
  • dgh_dean
  • dgh_dean
  • 2017-01-16 17:14:52
  • 2344

经典面试题--FizzBuzz的面向对象版本

题目描述,给一个数n(n>1)。从1~n-1,打印该数字,并且,如果该数字能被3整除,打印Fizz;如果能被5整除,打印Buzz,如果能被15整除,打印FizzBuzz。 传统的写法一般是一...
  • al5hn
  • al5hn
  • 2015-11-23 17:39:31
  • 474
    个人资料
    持之以恒
    等级:
    访问量: 7万+
    积分: 1125
    排名: 4万+
    最新评论