原文链接:https://mbd.baidu.com/newspage/data/landingshare?pageType=1&context=%7B%22nid%22%3A%22news_9119158847183908758%22%7D
原文标题:及时雨能量豆--如何使用scikits-learn机器学习库,分配能量豆?
新标题:
【注:本文作者原创作品,未经允许禁止抄袭。侵权必究!全网追踪】
那是一个阴森森的夜晚,很多植物们都回外地老家过春节了,只有土豆地雷和豌豆射手留守阵地。忽然,狂风大作,吹来一片片黑压压的乌云,伴随着轰隆隆的雷声,豆粒大的雨点不断的从天上掉下来。在大雨的掩护下,走来了一大群戴着领带的僵尸,他们有的空着手,有的拿铁锹,有的拿报纸,僵尸们数不胜数。
情况紧急!来不及细想,土豆地雷就以最快的速度,抵达草坪上的战斗位置。一瞬间,花园的草坪上,整整齐齐的铺满了土豆地雷。豌豆射手则在靠着房子的草地上,不停的发射豌豆子弹。
轰,轰,轰!一个又一个僵尸踩踏了土豆地雷,被炸的粉身碎骨。但是,僵尸们仍然前仆后继地扑了过来。僵尸们唱着歌,”西方黑,太阳降,月亮照着大僵王,僵王是我们的好博士,我要为他添光芒。转基因植物很可恶,我要把它消灭光。” 一个个僵尸,踩着被土豆地雷炸飞的同伴的尸体,前进,前进,再前进,终于来到了豌豆射手跟前。
这时,豌豆射手已经精疲力尽,弹尽粮绝了。他发射的豌豆子弹,像棉花一样,软软的,打在僵尸身上,简直就像是在挠痒痒。僵尸们眼看就要开始要手撕豌豆射手了。豌豆射手赶紧唱起了紧急情况下使用的《能量豆之歌》“能量豆,像朵花,我们都很喜欢它。摸摸能量豆,本领就变大。啦啦啦,啦啦啦!”
这时,天空中飞来一个飞碟瓜,在豌豆射手头上,扔下一大堆能量豆,就飞走了。豌豆射手吃了能量豆,立即爆发出了巨大的能量,“砰,砰,砰”,他瞬间发射了一堆豌豆子弹,撂倒了一排又一排的僵尸。这时,三重射手,双向射手,冰西瓜投手,玉米投手,火爆辣椒都先后赶到增援, 他们一起努力,终于打退了僵尸们的进攻.
战斗结束后,豌豆射手好奇地问飞碟瓜:"我收到能量豆,就像下了一场及时雨,你来的真是刚刚好呀!为什么我一唱《能量豆之歌》,你总是能够及时送来足够的能量豆? 其实我也知道,仓库里的能量豆很珍贵,好几个植物花园里的植物们,都很喜欢能量豆。你是否有什么秘诀,做到一收到请求,就能马上提供足够数量的能量豆呢?“
飞碟瓜笑哈哈的说:“这是一个好问题。简单来说,我是根据一个规则来投放能量豆的,就是,僵尸越密集的地方,我投放的能量豆就越多。”
“可是,虽然我知道你能时实时知道每个地方的僵尸的数量,但是,地球这么大,花园这么多,你是靠肉眼去判断哪个地方的僵尸密集程度大吗?”豌豆射手好奇的问道。
“当然不是啦。如果靠眼睛,我可就一天到晚无法睡觉,而且时间长了,判断有可能不准确。我使用的是python编程语言的scikit-learn机器学习库,它可以自动判定僵尸们的密集程度,从而协助合理分配能量豆,我就再也不会听到植物们说能量豆分配不公平的投拆了。”飞碟瓜说。
“那能告诉我具体一点的计算过程吗?” 豌豆射手问。
“可以”。你听好了。“飞碟瓜开始了详细的讲解。我先确定每个僵尸的位置坐标(横坐标和纵坐标),并且对其聚类,就是把那些距离很近的僵尸们,分配到同一个类里面。这只是机器学习库scikits-learn的众多技术中的其中一个应用领域。聚类分析是一种机器学习算法,它根据相似程度,把对象分组。
--
一、生成僵尸们的位置坐标位置数据。
经过侦察,得到僵尸们在星球上的经度和纬度的地理位置,生成横轴坐标和纵轴坐标。现在模拟生成在30个随机的僵尸的坐标位置。
import numpyimport sklearn.clusterimport pygameimport sysarrayPositions=numpy.random.randint(0,400,size=(30,2))
In [2]: arrayPositionsOut[2]: array([[ 62, 225],[ 55, 103], [146, 339], [148, 66], [134, 326], [ 2, 305], [126, 7],[395, 339], [233, 114], [ 57, 337], [ 84, 232], [280, 298],[ 84, 187], [189, 220], [ 22, 108], [116, 95], [232, 114], [386, 257], [128, 289], [ 22, 79], [143, 325], [346, 366], [362, 117], [269, 268], [221, 181],[ 23, 185], [266, 352], [214, 42], [394, 336], [142, 236]])
二、计算亲和度矩阵 (affinity metric)
在这里,亲和度矩阵就是指哪些僵尸们之间的距离比较近。在这里,我对源数据,采用了欧氏距离(Euclidean Distance),来计算亲和度矩阵。亲和度矩阵是指一个装载有亲和度数值的矩阵,在这里,亲和度数值, 用欧氏距离表示。
欧氏距离,源自欧氏空间中,两点间的距离公式:二维平面上两点a(x1,y1)与b(x2,y2)间的欧氏距离:
欧氏距离的公式
arrayPositions_norms=numpy.sum(arrayPositions **2,axis=1)arrayS=-arrayPositions_norms[:,numpy.newaxis]-arrayPositions_norms[numpy.newaxis,:]+2*numpy.dot(arrayPositions,arrayPositions.T)In [3]: arrayPositions_normsOut[3]: array([ 54469, 13634, 136237, 26260, 124232, 93029, 15925, 270946,67285, 116818, 60880, 167204, 42025, 84121, 12148, 22481, 66820, 215045, 99905, 6725, 126074, 253672, 144733, 144185, 81602, 34754, 194660, 47560, 268132, 75860])In [4]: arraySOut[4]: array([[ 0, -14933, -20052, -32677, -15385, -10000, -51620, -123885, -41562, -12569, -533, -52853, -1928, -16154, -15289, -19816, -41221, -106000, -8452, -22916, -16561, -100537, -101664, -44698, -27217, -3121, -57745, -56593, -122545, -6521], (因为数字太多,此处省略中间的大部分数字) [ -6521, -25258, -10625, -28936, -8164, -24361, -52697, -74618, -23165, -17426, -3380, -22888, -5765, -2465, -30784, -20557, -22984, -59977, -3005, -39049, -7922, -58516, -62561, -17153, -9266, -16762, -28832, -42820, -73504, 0]])
三、聚类分析
经过上一个步聚,可以把每一个僵尸的位置数据,分类到不同的类或者簇。类的标签,指明了相应的簇的号码。就是说,每一个僵尸,按照距离其他的僵尸的距离远近,分为若干个小组,并且给每个小组编号,并且把小组编号,附加在僵尸的标签上。
aff_pro=sklearn.cluster.AffinityPropagation().fit(arrayS)arrayLabels=aff_pro.labels_
In [5]: arrayLabelsOut[5]: array([4, 0, 4, 0, 4, 4, 0, 3, 2, 4, 4, 1, 4, 4, 0, 0, 2, 3, 4, 0, 4, 3,3, 1, 2, 0, 1, 2, 3, 4])
四、绘出多边形图
为分出来的每一个簇,画一个多边形。这个函数需要一个位置坐标的列表,设置颜色,以及一个平面.
listPolygon_points=[]for i in range(max(arrayLabels)+1):listPolygon_points.append([])for i,l in enumerate(arrayLabels): listPolygon_points[l].append(arrayPositions[i]) pygame.draw.polygon(screen,(255,0,0),listPoint)
In [9]: listPointOut[9]: [array([ 62, 225]),array([146, 339]), array([134, 326]), array([ 2, 305]), array([ 57, 337]), array([ 84, 232]), array([ 84, 187]), array([189, 220]), array([128, 289]), array([143, 325]), array([142, 236])]In [10]: listPolygon_pointsOut[10]: [[array([ 55, 103]), array([148, 66]), array([126, 7]), array([ 22, 108]), array([116, 95]), array([22, 79]), array([ 23, 185])], [array([280, 298]), array([269, 268]), array([266, 352])], [array([233, 114]), array([232, 114]), array([221, 181]), array([214, 42])], [array([395, 339]), array([386, 257]), array([346, 366]), array([362, 117]), array([394, 336])], [array([ 62, 225]), array([146, 339]), array([134, 326]), array([ 2, 305]), array([ 57, 337]), array([ 84, 232]), array([ 84, 187]), array([189, 220]), array([128, 289]), array([143, 325]), array([142, 236])]]
画出来的图,可能是这样子的:
显示僵尸的聚集程度图表
五、显示的主窗口的设置 pygame.init()screen=pygame.display.set_mode((400,400))screen.fill((255,255,255))boolLoop=Truewhile boolLoop:for listPoint in listPolygon_points: pygame.draw.polygon(screen,(255,0,0),listPoint) pygame.display.update() for objEvent in pygame.event.get(): if objEvent.type == pygame.QUIT: pygame.display.quit() pygame.quit() sys.exit boolLoop=False print ('exit success')
的代码
【注:本文作者原创作品,未经允许禁止抄袭。侵权必究!全网追踪】
领取专属 10元无门槛券
私享最新 技术干货