模拟生命_吸烟致癌?

 

上篇文章(致癌离我们远吗?)我们了解癌症基本常识,下面我们讨论一下癌细胞产生原因。

 

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

 

 

blob.png

 

 什么人容易患癌症?当诸多不利因素累积,超过一定量后,患癌症概率大。我们假设一个数据挖掘的分类器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下展示,生成闪烁的动态细胞图,细胞生死会不停变化,直到停止。

 做过蒙特卡洛试验的朋友会有感悟:决定一个系统走势是多因素构成,而非单一因素决定。

 

blob.png

  

程序调用了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个细胞决定)

 

blob.png

 经过计算机模拟生命,我们得到最终答案。癌症是由多因素共同决定的,而非单因素决定。当你的饮食,起居,办公环境,情绪,辐射,免疫力都很糟时,你要注意了,积极调整,更换环境,否则死神就可能来敲门了。

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

当然,下面是一个简化的例子,演示如何使用MATLAB进行线性回归模型来模拟孕期不吸烟可能带来的影响。这个例子假设我们有一个包含"吸烟"和"其他因素"作为自变量的CSV数据集,目标变量是"新生儿体重"。请注意,这只是一个基础示例,实际应用可能需要更复杂的数据处理和模型调整。 ```matlab % 加载数据 data = readtable('pregnancy_data.csv'); % 假设数据文件名为pregnancy_data.csv % 定义变量 smoking_status = data.SmokingStatus; % 'Smoker' or 'Non-Smoker' other_factors = data.OtherFactors; newborn_weight = data.NewbornWeight; % 检查数据是否适合线性回归 scatter(smoking_status, newborn_weight); % 如果有缺失值,选择合适的方式填充(比如平均值、中位数) if any(ismissing(newborn_weight)) newborn_weight = fillmissing(newborn_weight, 'linear'); end % 创建逻辑变量表示吸烟状态 smokers = strcmp(smoking_status, 'Smoker')'; % 划分训练集和测试集 cv = cvpartition(size(data, 1), 'HoldOut', 0.3); trainingData = data(training(cv), :); testingData = data(test(cv), :); % 训练线性回归模型 model = fitlm(trainingData, 'NewbornWeight ~ SmokingStatus + OtherFactors'); % 预测未吸烟情况 non_smokers_weight_pred = predict(model, table(ones(sum(~smokers)), other_factors(~smokers))); % 结果可视化 figure; scatter(smoking_status, newborn_weight, '.'); hold on; plot(non_smokers_weight_pred, 'o', 'MarkerFaceColor', 'red', 'MarkerSize', 12, 'DisplayName', 'Predicted Weight (No Smoking)'); xlabel('Smoking Status'); ylabel('Newborn Weight'); legend show; % 算出吸烟和不吸烟群体的平均体重差 mean_diff = mean(newborn_weight(smokers)) - mean(non_smokers_weight_pred); % 相关问题-- 1. 如何改进模型以更好地反映真实情况? 2. 该模型是否需要正则化以防止过拟合? 3. 这个预测结果是否可靠,取决于哪些因素? ``` 记得替换上述代码中的文件名和变量名称以匹配你的实际数据结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值