机器学习解幼儿园智力开发题2889=?

一、问题来源

有一天在网上看到这么一个幼儿园智力题:
题目
如果你之前没做过这个题的话,可以现场挑战一下。

……

……

……

好了时间到,
瞬间觉得这年头智商已经快赶不上幼儿园小朋友了……
言归正传,百度了一下找到了答案:

答案是5,题目的意思是数前面数字的圈圈:
0、6、9都只有有1个圈,所以都代表1;
1、2、3、4、5、7都没有圈,代表0;
8有两个圈,代表2.
把前面四个数字的圈数相加就是结果值!
题目的答案应该是:0+2+2+1=5

好吧,这个规律确实厉害!


二、用机器学习来求解

被这个题目虐完了之后想着那么用计算机目前最火爆的技术机器学习是否能直接解出来呢?好吧,说做就做。

第一步,制作数据集

用机器学习来做首先数据集得够大,前面的例子数据集就太小了一点,所以我们首先根据已经找到的规律生成一个更庞大的数据集。

由于四位数0000到9999一共10000个可以用的数据,而结果是预测2889的,所以我们就想着从3000到9999之间取数来构造,就随机从3000到9999之间取6000个数好了,这样从样本中就无法直接得到2889的值。

关于特征的标签的选取,等号左边按照数字拆分成4个特征向量,等号右边即为标签,比如3000=3,拆分后就是,特征向量[3,0,0,0],标签是3。

生成数据集的代码不多讲了,直接贴:

import pandas as pd
import random

num=range(10000)
data_all=[]
for i in num:
    row=[]
    row.append(i/1000)
    i%=1000
    row.append(i/100)
    i%=100
    row.append(i/10)
    i%=10
    row.append(i)
    data_all.append(row)

data=random.sample(data_all[3000:],6000)

for i in xrange(len(data)):
    label=0
    for j in xrange(4):
        if data[i][j]== 0 or data[i][j]==6 or data[i][j]==9:
            label+=1
        elif data[i][j]==8:
            label+=2
        else:
            pass
    data[i].append(label)

pd.DataFrame(data).to_csv("dataset.csv",header=None,index=False)

然后就能得到数据集dataset.csv文件了
打开随便看一下效果如下:
csv

第二步,分类预测

好啦,接下来就直接用机器学习的sklearn中的决策树来做看看效果即可,代码如下:

import pandas as pd

data=pd.read_csv("dataset.csv",header=None)

X=data.iloc[:,:-1]
y=data.iloc[:,-1]

from sklearn.cross_validation import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.1)

from sklearn.tree import DecisionTreeClassifier
dtc=DecisionTreeClassifier()
dtc.fit(X_train,y_train)
print 'dtc=',dtc.score(X_test,y_test)

print dtc.predict([[2,8,8,9]])

代码很简短,先从dataset.csv读取数据为data,然后拆分为特征X和标签y,为了评估分类准确性我们还将输入的数据分成训练集合测试集两个部分,用训练集训练模型,用测试集进行评估,最后输出得分,以及我们想要的2889的值,输出结果如下:
结果
可见,模型预测准确率还是相当不错的,由于每次训练集和测试集拆分是随机拆分,所以每次结果略有不同,不过基本在90%以上,预测值也很准确。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值