1. 程式人生 > >感悟:決定一個系統走勢是多因素構成,而非單一因素決定。

感悟:決定一個系統走勢是多因素構成,而非單一因素決定。

.get key eve while src 一個數 遺傳 隨機 初始化

例如癌癥,醫生常說抽煙致癌,不要抽煙,但實際生活中抽煙長壽的人不少,我的姨婆九十多歲了,每日抽煙喝酒,身體也不錯。決定癌癥的因素很多,例如遺傳,飲食,起居時間,居住環境,化工汙染等等。下圖轉自一份醫學研究,說明沒有任何食物百分之百致癌或抑制癌癥。

技術分享

什麽人容易患癌癥?當諸多不利因素累積,超過一定量後,患癌癥概率大。我們假設一個數據挖掘的分類器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物理博士的分享,經本人測試,可以完美運行,如果有問題可以發郵件給我[email protected]

運行環境:

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.

感悟:決定一個系統走勢是多因素構成,而非單一因素決定。