感悟:決定一個系統走勢是多因素構成,而非單一因素決定。
例如癌癥,醫生常說抽煙致癌,不要抽煙,但實際生活中抽煙長壽的人不少,我的姨婆九十多歲了,每日抽煙喝酒,身體也不錯。決定癌癥的因素很多,例如遺傳,飲食,起居時間,居住環境,化工汙染等等。下圖轉自一份醫學研究,說明沒有任何食物百分之百致癌或抑制癌癥。
什麽人容易患癌癥?當諸多不利因素累積,超過一定量後,患癌癥概率大。我們假設一個數據挖掘的分類器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.
感悟:決定一個系統走勢是多因素構成,而非單一因素決定。