博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
感悟:决定一个系统走势是多因素构成,而非单一因素决定。
阅读量:6926 次
发布时间:2019-06-27

本文共 2747 字,大约阅读时间需要 9 分钟。

例如癌症,医生常说抽烟致癌,不要抽烟,但实际生活中抽烟长寿的人不少,我的姨婆九十多岁了,每日抽烟喝酒,身体也不错。决定癌症的因素很多,例如遗传,饮食,起居时间,居住环境,化工污染等等。下图转自一份医学研究,说明没有任何食物百分之百致癌或抑制癌症。

 

 什么人容易患癌症?当诸多不利因素累积,超过一定量后,患癌症概率大。我们假设一个数据挖掘的分类器cancer,分类器由六个因素组成,当六个因素得分总和超过3时为癌症,得分总和小于3时为非癌症。

1表示是,0表示否。 抽烟=1分,非均衡饮食=1分,喝酒=1分,睡眠不足7小时=1分,环境污染=1分,情绪抑郁=1分;反之亦然不抽烟=0分,不喝酒=0分,睡眠充足=0分,环境无污染=0分,情绪良好=0分。张三抽烟,非均衡饮食,抽烟,喝酒,睡眠不足,环境污染,情绪良好,总分为1+1+1+1+1+0=5分,总得分大于3,分类器判断张三患癌症概率高。李四不抽烟,不喝酒,睡眠充足,环境无污染,情绪不好,总分为0+0+0+0+0+1=1分,总得分小于3,分类器判断李四患癌症概率低(例子只是假设,方便大家理解分类器原理)。

根据分类器原理,我们用python来可视化细胞生死,模拟生命。从一个随机初始化的二维方形网格开始,网格中的每一个细胞状态可能是生或死,由其相邻8个细胞决定。在这个规则下可以使用卷积进行计算,我们需要scipy工具完成卷积计算。

Anaconda下展示,生成闪烁的动态细胞图,细胞生死会不停变化,直到停止。

 

程序调用了python的pygame,numpy,scipy三个模块。Pygame用于写游戏;numpy用于矩阵运算;scipy是numpy的高级版本,用于更高级的自然科学应用,例如信号处理,傅里叶分析。

此函数用于 绘制十字架。

def draw_cross(pixar):

   (posx,posy)=pygame.mouse.get_pos()

   pixar[posx,:]=1

   pixar[:,posy]=1

此函数用于随机初始化网格

def random_init(n):

   return np.random.random_integers(0,1,(n,n)) 

所有代码最终汇集于文章末尾。

(放大可视化的细胞集合图,每一个细胞状态可能是生或死,由其相邻8个细胞决定)

 

代码来自Ivan Idris物理博士的分享,经本人测试,可以完美运行,如果有问题可以发邮件给我231469242@qq.com

运行环境:

Python2.7 +Windows32位

源码分享:

# -*- coding: utf-8 -*-

import os,pygame

from pygame.locals import*

import numpy as np

from scipy import ndimage

def get_pixar(arr,weights):

   states=ndimage.convolve(arr,weights,mode='wrap')

   bools=(states==13)|(states==12)|(states==3)

   return bools.astype(int)

#绘制十字架

def draw_cross(pixar):

   (posx,posy)=pygame.mouse.get_pos()

   pixar[posx,:]=1

   pixar[:,posy]=1

 #随机初始化网格  

def random_init(n):

   return np.random.random_integers(0,1,(n,n))

def draw_pattern(pixar,pattern):

   print pattern

   if pattern=="glider":

      coords=[(0,1),(1,2),(2,0),(2,1),(2,2)]

   elif pattern=="block":

      coords=[(3,3),(3,2),(2,3),(2,2)]

   elif pattern=="exploder":

      coords=[(0,1),(1,2),(2,0),(2,1),(2,2),(3,4)]

   elif pattern=="fpentomino":

      coords=[(2,3),(3,2),(4,2),(3,3),(3,4)]

   pos=pygame.mouse.get_pos()

   xs=np.arange(0,pos[0],10)

   ys=np.arange(0,pos[1],10)

   for x in xs:

      for y in ys:

         for i,j in coords:

            pixar[x+i,y+j]=1

def main():

    pygame.init()

    N=400

    pygame.display.set_mode((N,N))

    pygame.display.set_caption("cell simulization")

    screen=pygame.display.get_surface()

    pixar=random_init(N)

    weights=np.array([[1,1,1],[1,10,1],[1,1,1]])

    cross_on=False

    while True:

       pixar=get_pixar(pixar,weights)

       if cross_on:

          draw_cross(pixar)

       pygame.surfarray.blit_array(screen,pixar*255**3)

       pygame.display.flip()

       for event in pygame.event.get():

          if event.type ==QUIT:

             return

          if event.type ==MOUSEBUTTONDOWN:

             cross_on=not_cross_on

          if event.type ==KEYDOWN:

             if event.key==ord('r'):

                pixar=random_init(N)

                print "Random init"

             if event.key==ord("g"):

                draw_pattern(pixar,'glider')

             if event.key==ord("b"):

                draw_pattern(pixar,'block')

             if event.key==ord("e"):

                draw_pattern(pixar,'exploder')

             if event.key==ord("f"):

                draw_pattern(pixar,'fpentomino')

main()        

End.

 

转载地址:http://upkjl.baihongyu.com/

你可能感兴趣的文章
XML基础之Jdom和DOM4J解析(转)
查看>>
Ad Hoc Distributed Queries的启用与关闭
查看>>
安全的“野指针”
查看>>
EXCEL实战技巧与数据分析(一)基础应用
查看>>
使用NIFTI指令画nii图像
查看>>
利用缓存、Timer间隔时间发送微信的实例,很有用的例子
查看>>
CentOS7使用firewalld打开关闭防火墙与端口
查看>>
UIPageViewController
查看>>
在线UI设计
查看>>
2017最好的JavaScript框架、库和工具 — SitePoint
查看>>
Linux 集群
查看>>
R语言推特twitter转发可视化分析
查看>>
模仿也是提高,纯css小技巧实现头部进度条
查看>>
js 改变只读属性的值
查看>>
nodejs vue SyntaxError:Block-scoped declarations (let,const,function,class) not yet supported
查看>>
PHP JQUERY JSON 实现瀑布流
查看>>
英雄所见略同——每个人都有的一套价值体系观念
查看>>
oracle学习5
查看>>
Demo学习: Dialogs Anonymous Callback
查看>>
Android使用GestureDetector实现手势滑动效果
查看>>