基于机器学习的心脏病预测分析
本文基于1319条医疗记录,探讨了机器学习在心脏病预测中的应用。研究首先对数据进行预处理,包括处理极端异常值(如心率>1000、收缩压<50等)和特征标准化。通过箱线图分析发现,肌酸激酶同工酶和肌钙蛋白等关键指标存在合理波动。研究采用了多种机器学习模型(逻辑回归、决策树、随机森林等)进行预测分析,并评估了不同模型的性能表现。结果表明,机器学习可以有效识别心脏病高风险人群,为临床决策提供
在当今快节奏的生活中,心脏病已成为全球范围内的主要健康问题之一。早期诊断和预防对于降低心脏病的发病率和死亡率至关重要。随着机器学习技术的不断发展,我们可以通过分析大量的医疗数据来预测心脏病的发生风险,从而为医疗专业人士提供有力的决策支持。本文将介绍如何使用机器学习模型对心脏病进行预测分析,并探讨不同模型的性能和实际应用价值。
数据集介绍
本次分析使用了一个包含1319条记录的心脏病数据集,数据集涵盖了患者的年龄、性别、心率、血压、血糖、肌酸激酶同工酶(CK-MB)和肌钙蛋白等关键生理和生化指标。此外,数据集中还包含了患者的诊断结果(心脏病阳性或阴性)。通过对这些数据的分析,我们可以探索不同特征与心脏病之间的关系,并构建预测模型。
库导入及其数据读取
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt #画图
import matplotlib as mpl
import scipy.stats as stats
from scipy.stats import chi2_contingency
from sklearn.preprocessing import StandardScaler #标准化
from sklearn.model_selection import train_test_split #划分训练集和测试集
from sklearn.linear_model import LogisticRegression #回归线性模型
from sklearn.tree import DecisionTreeClassifier #决策树
from sklearn.ensemble import RandomForestClassifier #随机森林
from sklearn.svm import SVC #支持向量积
#from xgboost import XGBClassifier
from sklearn.metrics import classification_report, confusion_matrix, roc_curve, auc #评价指标
import warnings
warnings.filterwarnings('ignore') #忽略警告信息
mpl.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题)
data = pd.read_csv('Medicaldataset.csv')
data.head()
Age | Gender | Heart rate | Systolic blood pressure | Diastolic blood pressure | Blood sugar | CK-MB | Troponin | Result | |
---|---|---|---|---|---|---|---|---|---|
0 | 64 | 1 | 66 | 160 | 83 | 160.0 | 1.80 | 0.012 | negative |
1 | 21 | 1 | 94 | 98 | 46 | 296.0 | 6.75 | 1.060 | positive |
2 | 55 | 1 | 64 | 160 | 77 | 270.0 | 1.99 | 0.003 | negative |
3 | 64 | 1 | 70 | 120 | 55 | 270.0 | 13.87 | 0.122 | positive |
4 | 55 | 1 | 64 | 112 | 65 | 300.0 | 1.08 | 0.003 | negative |
#查看数据信息
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1319 entries, 0 to 1318
Data columns (total 9 columns):
Age 1319 non-null int64
Gender 1319 non-null int64
Heart rate 1319 non-null int64
Systolic blood pressure 1319 non-null int64
Diastolic blood pressure 1319 non-null int64
Blood sugar 1319 non-null float64
CK-MB 1319 non-null float64
Troponin 1319 non-null float64
Result 1319 non-null object
dtypes: float64(3), int64(5), object(1)
memory usage: 92.8+ KB
#删除重复值
data.duplicated().sum()
0
# 为数据集特征创建映射字典,中文便于理解
feature_map = {
'Age': '年龄',
'Heart rate': '心率',
'Systolic blood pressure': '收缩压',
'Diastolic blood pressure': '舒张压',
'Blood sugar': '血糖',
'CK-MB': '肌酸激酶同工酶',
'Troponin': '肌钙蛋白'
}
#绘制每个特征的统计分布图,查找是否存在离群点(异常值)
plt.figure(figsize=(20, 10))
for i, (col, col_name) in enumerate(feature_map.items(), 1):
plt.subplot(2, 4, i) #创建子图
plt.boxplot(data[col]) #画箱形图
plt.title(f'{col_name}的箱线图', fontsize=14)
plt.ylabel('数值', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
通过观察发现:心率、收缩压、舒张压存在极端异常值,虽然年龄、血糖、肌酸激酶同工酶、肌钙蛋白也存在离群点,但是这些离群点可能是真实反映,故不处理(急性心肌梗死情况下,肌酸激酶同工酶和肌钙蛋白会特别高),只处理那些极端异常值,删除心率大于1000的那个异常值点,删除收缩压小于50的那个点,删除舒张压大于140的那个点。
# 处理前的数据量
print(f"处理前数据量: {len(data)}")
# 删除心率大于1000的异常值
data = data[data['Heart rate'] <= 1000]
# 删除收缩压小于50的异常值
data = data[data['Systolic blood pressure'] >= 50]
# 删除舒张压大于140的异常值
data = data[data['Diastolic blood pressure'] <= 140]
print(f"处理后数据量: {len(data)}")
处理前数据量: 1319
处理后数据量: 1314
#检查舒张压和收缩压的关系,看看是否存在舒张压大于收缩压的情况。
wrong_bloodpressure = data[data['Diastolic blood pressure'] > data['Systolic blood pressure']]
print(f"发现舒张压大于收缩压的记录数: {len(wrong_bloodpressure)}")
发现舒张压大于收缩压的记录数: 6
考虑到可能是录入时候这6条数据录入反了,所以进行调换处理。
# 获取这些记录的索引
wrong_bloodpressure_index = wrong_bloodpressure.index
# 调换这些记录的收缩压和舒张压值
data.loc[wrong_bloodpressure_index, ['Systolic blood pressure', 'Diastolic blood pressure']] = data.loc[wrong_bloodpressure_index, ['Diastolic blood pressure', 'Systolic blood pressure']].values
#再次画图检查一下分布情况
plt.figure(figsize=(20, 10))
for i, (col, col_name) in enumerate(feature_map.items(), 1):
plt.subplot(2, 4, i)
plt.boxplot(data[col])
plt.title(f'处理后{col_name}的箱线图', fontsize=14)
plt.ylabel('数值', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
数据分析
通过数据可视化,我们发现了一些有趣的趋势。例如,男性患心脏病的比例高于女性,且年龄较大的患者更容易患心脏病。此外,心脏病患者的肌酸激酶同工酶和肌钙蛋白水平显著高于未患病者。这些发现为后续的模型构建提供了重要的背景信息。
data.describe().T
count | mean | std | min | 25% | 50% | 75% | max | |
---|---|---|---|---|---|---|---|---|
Age | 1314.0 | 56.198630 | 13.645583 | 14.000 | 47.000 | 58.000 | 65.0000 | 103.0 |
Gender | 1314.0 | 0.659817 | 0.473951 | 0.000 | 0.000 | 1.000 | 1.0000 | 1.0 |
Heart rate | 1314.0 | 75.987823 | 15.286893 | 20.000 | 64.000 | 74.000 | 85.0000 | 135.0 |
Systolic blood pressure | 1314.0 | 127.242770 | 26.019876 | 65.000 | 110.000 | 124.000 | 143.0000 | 223.0 |
Diastolic blood pressure | 1314.0 | 72.161339 | 13.833627 | 38.000 | 62.000 | 72.000 | 81.0000 | 128.0 |
Blood sugar | 1314.0 | 146.790487 | 75.013659 | 35.000 | 98.000 | 116.000 | 170.0000 | 541.0 |
CK-MB | 1314.0 | 15.322877 | 46.408436 | 0.321 | 1.660 | 2.850 | 5.8175 | 300.0 |
Troponin | 1314.0 | 0.361174 | 1.156510 | 0.001 | 0.006 | 0.014 | 0.0850 | 10.3 |
#可视化分析
#1.患者年龄分布
plt.figure(figsize=(20,15))
plt.subplot(3,3,1)
data['Age'].plot(kind='kde',color='red',label='核密度图')#绘制核密度图
data['Age'].plot(kind='hist',bins=12,secondary_y=True)#绘制直方图,,secondary_y=True添加第二个y轴显示人数
#plt.hist(data['Age'],bins=12)
plt.title('患者年龄分布')
plt.xlabel('年龄(岁)')
plt.ylabel('人数')
plt.grid(axis='y',linestyle='--')
#2.患者性别分布(饼图)
gender_counts=data['Gender'].value_counts() #数据统计
plt.subplot(3,3,2)
plt.pie(gender_counts,labels=['男','女'],autopct="%1.1f%%",startangle=75,colors=['#66b3ff','#ff9999'])
plt.title('患者性别分布')
plt.axis('equal') #使得饼图为圆形
#3.绘制患者心率分布
plt.subplot(3,3,3)
data['Heart rate'].plot(kind='kde',color='red',label='核密度图')#绘制核密度图
data['Heart rate'].plot(kind='hist',bins=12,secondary_y=True)#绘制直方图
#plt.hist(data['Heart rate'],bins=12)
plt.title('患者心率分布')
plt.xlabel('心率(次/分钟)')
plt.ylabel('人数')
plt.grid(axis='y',linestyle='--')
#4.绘制患者收缩压分布
plt.subplot(3,3,4)
data['Systolic blood pressure'].plot(kind='kde',color='red',label='核密度图')#绘制核密度图
data['Systolic blood pressure'].plot(kind='hist',bins=12,secondary_y=True)#绘制直方图
#plt.hist(data['Systolic blood pressure'],bins=12)
plt.title('患者收缩压分布')
plt.xlabel('收缩压(mmHg)')
plt.ylabel('人数')
plt.grid(axis='y',linestyle='--')
#5.绘制患者舒张压分布
plt.subplot(3,3,5)
data['Diastolic blood pressure'].plot(kind='kde',color='red',label='核密度图')#绘制核密度图
data['Diastolic blood pressure'].plot(kind='hist',bins=12,secondary_y=True)#绘制直方图
#plt.hist(data['Diastolic blood pressure'],bins=12)
plt.title('患者舒张压分布')
plt.xlabel('舒张压(mmHg)')
plt.ylabel('人数')
plt.grid(axis='y',linestyle='--')
#6.患者血糖分布
plt.subplot(3,3,6)
data['Blood sugar'].plot(kind='hist',bins=12,secondary_y=True)#绘制直方图
data['Blood sugar'].plot(kind='kde',color='red',label='核密度图')#绘制核密度图
#plt.hist(data['Blood sugar'],bins=12,density=True)
plt.title('患者血糖分布')
plt.xlabel('血糖(mg/dl)')
plt.ylabel('人数')
plt.grid(axis='y',linestyle='--')
#7.患者肌酸激酶同工酶水平
plt.subplot(3,3,7)
data['CK-MB'].plot(kind='kde',color='red',label='核密度图')#绘制核密度图
data['CK-MB'].plot(kind='hist',bins=12,secondary_y=True)#绘制直方图
#plt.hist(data['Systolic blood pressure'],bins=12)
plt.title('患者肌酸激酶同工酶水平')
plt.xlabel('肌酸激酶同工酶')
plt.ylabel('人数')
plt.grid(axis='y',linestyle='--')
#8.患者肌钙蛋白水平
plt.subplot(3,3,8)
data['Troponin'].plot(kind='kde',color='red',label='核密度图')#绘制核密度图
data['Troponin'].plot(kind='hist',bins=12,secondary_y=True)#绘制直方图
plt.title('患者肌钙蛋白水平')
plt.xlabel('肌钙蛋白')
plt.ylabel('人数')
plt.grid(axis='y',linestyle='--')
#9.患者患心脏病比例(饼图)
Result_counts=data['Result'].value_counts() #数据统计
plt.subplot(3,3,9)
plt.pie(Result_counts,labels=['患病','未患病'],autopct="%1.1f%%",startangle=75,colors=['#66b3ff','#ff9999'])
plt.title('患者患心脏病比例')
plt.axis('equal') #使得饼图为圆形
(-1.1122316573963205,
1.1162921653423643,
-1.1047385236129639,
1.1118761098947136)
患者基础人口特征:\ 性别分布:男性(1)共870人,女性(0)共449人\ 年龄分布:年龄范围14-103岁,平均56.2岁,集中在55-65岁区间
患者生理指标:\ 心率:平均76次/分钟,主要分布在65-85次/分钟\ 血压:收缩压平均127.3mmHg,舒张压平均72.1mmHg\ 血糖:平均146.8mg/dl,呈右偏分布\
患者心脏指标:\ CK-MB(肌酸激酶同工酶):平均15.3,大多数患者值较低\ 肌钙蛋白:平均0.36,大部分患者值集中在较低区间\
诊断结果:\ 阳性(positive)患者807例,阴性(negative)患者507例
心脏病影响因素分析
#可视化分析
fig=plt.figure(figsize=(20,16))
plt.subplots_adjust(wspace=0.3,hspace=0.4)#调整子图的间隔
#1.年龄与诊断结果关系
ax1=plt.subplot(3,3,1)
positive_ages = data[data['Result'] == 'positive']['Age']
negative_ages = data[data['Result'] == 'negative']['Age']
plt.boxplot([positive_ages, negative_ages], labels=['Positive', 'Negative'])
#data.boxplot(column='Age',by='Result',ax=ax1)#这种API需要data为DF格式,通过指定列column和by分组
plt.title('年龄与心脏病诊断结果的关系')
plt.xlabel('诊断结果')
plt.ylabel('年龄')
# 2.性别与诊断结果关系
positive_data=data.loc[data['Result']=='positive']
gender_positive_counts=positive_data['Gender'].value_counts()
plt.subplot(3, 3, 2)
plt.pie(gender_positive_counts,labels=['男','女'],autopct="%1.1f%%",startangle=75,colors=['#66b3ff','#ff9999'])
plt.title('性别与心脏病诊断结果的关系')
# 3. 心率与诊断结果关系
ax3 = plt.subplot(3, 3, 3)
positive_Heartrate = data[data['Result'] == 'positive']['Heart rate']
negative_Heartrate = data[data['Result'] == 'negative']['Heart rate']
plt.boxplot([positive_Heartrate, negative_Heartrate], labels=['Positive', 'Negative'])
ax3.set_title('心率与心脏病诊断结果的关系', fontsize=14)
ax3.set_xlabel('诊断结果', fontsize=12)
ax3.set_ylabel('心率 (次/分钟)', fontsize=12)
# 4. 收缩压与诊断结果关系
ax4 = plt.subplot(3, 3, 4)
data.boxplot(column='Systolic blood pressure',by='Result',ax=ax4)
ax4.set_title('收缩压与心脏病诊断结果的关系', fontsize=14)
ax4.set_xlabel('诊断结果', fontsize=12)
ax4.set_ylabel('收缩压 (mmHg)', fontsize=12)
# 5. 舒张压与诊断结果关系
ax5 = plt.subplot(3, 3, 5)
data.boxplot(column='Diastolic blood pressure',by='Result',ax=ax5)
ax5.set_title('舒张压与心脏病诊断结果的关系', fontsize=14)
ax5.set_xlabel('诊断结果', fontsize=12)
ax5.set_ylabel('舒张压 (mmHg)', fontsize=12)
# 6. 血糖与诊断结果关系
ax6 = plt.subplot(3, 3, 6)
data.boxplot(column='Blood sugar',by='Result',ax=ax6)
ax6.set_title('血糖与心脏病诊断结果的关系', fontsize=14)
ax6.set_xlabel('诊断结果', fontsize=12)
ax6.set_ylabel('血糖 (mg/dl)', fontsize=12)
# 7. CK-MB与诊断结果关系
ax7 = plt.subplot(3, 3, 7)
positive_CKMB = data[data['Result'] == 'positive']['CK-MB']
negative_CKMB = data[data['Result'] == 'negative']['CK-MB']
plt.boxplot([positive_CKMB, negative_CKMB], labels=['Positive', 'Negative'])
#data.boxplot(column='CK-MB',by='Result',ax=ax7)
ax7.set_title('CK-MB与心脏病诊断结果的关系', fontsize=14)
ax7.set_xlabel('诊断结果', fontsize=12)
ax7.set_ylabel('CK-MB', fontsize=12)
# 8. 肌钙蛋白与诊断结果关系
ax8 = plt.subplot(3, 3, 8)
data.boxplot(column='Troponin',by='Result',ax=ax8)
ax8.set_title('肌钙蛋白与心脏病诊断结果的关系', fontsize=14)
ax8.set_xlabel('诊断结果', fontsize=12)
ax8.set_ylabel('肌钙蛋白', fontsize=12)
plt.tight_layout()
plt.show()
心脏病患者的肌酸激酶同工酶和肌钙蛋白显著高于未患心脏病的人,而且高龄可能也会导致心脏病,男性患心脏病的比例高于女性,其他特征差异不是非常明显。
分类模型构建与预测
为了预测心脏病的发生,我们构建了多种机器学习模型,包括逻辑回归、决策树、随机森林、XGBoost和支持向量机(SVM)。我们使用了标准化后的数据进行训练,并通过划分训练集和测试集来评估模型的性能。
数据预处理
将目标变量转为01变量,并且把连续变量进行标准化处理,由于目标变量的不平衡程度相对温和(阳性61.4%,阴性38.6%),未达到需要强制平衡的临界水平(差异在60%以上才考虑平衡样本),将处理后的数据进行划分。
# 将"positive"/"negative"转换为1/0
data['Result_Binary'] = (data['Result'] == 'positive').astype(int)
features = ['Gender','Age', 'CK-MB', 'Troponin']
# 定义特征和目标变量
x = data[features].copy()
y = data['Result_Binary']
# 只对连续变量标准化
continuous_vars = ['Age', 'CK-MB', 'Troponin']
# 先把连续变量列转为float类型
x[continuous_vars] = x[continuous_vars].astype(float)
scaler = StandardScaler()#创建标准化模型
x.loc[:, continuous_vars] = scaler.fit_transform(x[continuous_vars])#进行标准化处理
# 划分训练集和测试集(80%/20%)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=15, stratify=y)
逻辑回归模型
逻辑回归是一种广泛应用于二分类问题的线性模型。在本次分析中,逻辑回归模型的平均准确率为83%,召回率为83%,F1分数为83%。虽然逻辑回归模型的性能相对较好,但在处理复杂的非线性关系时可能不够灵活。
模型预测基本步骤:\ 1.创建模型:模型= 模型函数(参数配置)\ 2.训练模型:模型.fit(x训练集,y训练集)\ 3.模型预测:模型.predict(x测试集)\ 4.模型评估:\ 模型报告:classification_report(y_test, y_pred)\ 混淆矩阵:confusion_matrix(y_test, y_pred))\ ROC曲线:roc_curve(y_test, y_prob)\
由于所有模型的训练、预测、评估都是一样的,古可以定义成一个函数
def evaluate_model(model, model_name, X_train, X_test, y_train, y_test): #模型对象、模型名称,x训练集,y训练集,x测试集
# 训练模型
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 打印分类报告
print(f"=== {model_name} 模型评估 ===")
print(classification_report(y_test, y_pred))#包含准确率、召回率、f1测度、支持率
# 绘制混淆矩阵
cm = confusion_matrix(y_test, y_pred) #返回混淆矩阵
plt.figure(figsize=(8, 6))
plt.imshow(cm,cmap='hot',interpolation='nearest')#热力图
plt.colorbar()#视觉映射
#添加标签
for i in range(2):
for j in range(2):
plt.text(j, i, f'{cm[i, j]:.2f}', ha='center', va='center', color='black')
plt.title(f'{model_name}模型混淆矩阵')
plt.show()
# 绘制ROC曲线
if hasattr(model, "predict_proba"):#hasattr用于检查对象是否具有指定的属性
y_prob = model.predict_proba(X_test)[:, 1]
else: # 对于SVM等没有predict_proba方法的模型
y_prob = model.decision_function(X_test) if hasattr(model, "decision_function") else y_pred
fpr, tpr, _ = roc_curve(y_test, y_prob) #roc曲线
roc_auc = auc(fpr, tpr) #auc面积
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC曲线(面积 = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlabel('假阳率')
plt.ylabel('真阳率')
plt.title(f'{model_name}模型ROC曲线')
plt.legend(loc="lower right")
plt.show()
return model, roc_auc
#逻辑回归模型
lr_model = LogisticRegression(random_state=15, class_weight='balanced')
lr_model, lr_auc = evaluate_model(lr_model, "逻辑回归", x_train, x_test, y_train, y_test)
=== 逻辑回归 模型评估 ===
precision recall f1-score support
0 0.70 0.97 0.81 101
1 0.98 0.73 0.84 162
avg / total 0.87 0.83 0.83 263
决策树模型
决策树模型通过构建树状结构来预测目标变量。在本次分析中,决策树模型的平均准确率为98%,召回率为98%,F1分数为98%。决策树模型的优点是易于理解和解释,但可能会出现过拟合的问题。
dt_model = DecisionTreeClassifier(random_state=15, class_weight='balanced')
dt_model, dt_auc = evaluate_model(dt_model, "决策树", x_train, x_test, y_train, y_test)
=== 决策树 模型评估 ===
precision recall f1-score support
0 0.98 0.98 0.98 101
1 0.99 0.99 0.99 162
avg / total 0.98 0.98 0.98 263
随机森林模型
随机森林是一种基于决策树的集成学习方法,通过构建多个决策树并结合它们的预测结果来提高模型的性能。在本次分析中,随机森林模型的平均准确率为97%,召回率为97%,F1分数为97%。随机森林模型在处理复杂的非线性关系时表现优异,且具有较强的抗过拟合能力。
rf_model = RandomForestClassifier(random_state=15, class_weight='balanced')
rf_model, rf_auc = evaluate_model(rf_model, "随机森林", x_train, x_test, y_train, y_test)
=== 随机森林 模型评估 ===
precision recall f1-score support
0 0.95 0.98 0.97 101
1 0.99 0.97 0.98 162
avg / total 0.97 0.97 0.97 263
XGBoost 模型
XGBoost是一种高效的梯度提升算法,广泛应用于各种机器学习竞赛中。在本次分析中,XGBoost模型的平均准确率为97%,召回率为97%,F1分数为97%。XGBoost模型在处理大规模数据集时表现出色,且具有自动处理缺失值和特征选择的能力。
xgb_model = XGBClassifier(random_state=15, scale_pos_weight=sum(y_train==0)/sum(y_train==1))
xgb_model, xgb_auc = evaluate_model(xgb_model, "XGBoost", x_train, x_test, y_train, y_test)
支持向量机SVM模型
支持向量机是一种基于最大间隔原理的分类模型,适用于高维数据集。在本次分析中,SVM模型的平均准确率为77%,召回率为76%,F1分数为77%。SVM模型在处理线性可分数据时表现良好,但在处理非线性数据时可能需要使用核技巧。
svm_model = SVC(random_state=15, class_weight='balanced', probability=True)
svm_model, svm_auc = evaluate_model(svm_model, "支持向量机", x_train, x_test, y_train, y_test)
=== 支持向量机 模型评估 ===
precision recall f1-score support
0 0.63 0.93 0.75 101
1 0.94 0.66 0.78 162
avg / total 0.82 0.76 0.77 263
树模型(决策树模型、随机森林模型、XGBoost模型)明显优于逻辑回归模型和SVM模型。
结论
本项目基于对心脏病发作数据集的系统分析,得出以下主要结论:
人群特征:患者年龄分布广泛,平均年龄56.2岁,男性比例高于女性,且男性患心脏病的风险显著高于女性。\ 生理与生化指标:心脏病患者的肌酸激酶同工酶(CK-MB)和肌钙蛋白(Troponin)水平均显著高于未患病者,年龄也是影响心脏病的重要因素。心率、血压、血糖等常规生理指标在两组间差异不显著。
模型预测:多种机器学习模型均能较好地区分心脏病患者与非患者,其中树模型(决策树、随机森林、XGBoost)表现优于逻辑回归和SVM,具有较高的预测准确性。\ 实际意义:本研究结果为心脏病的早期筛查和风险评估提供了数据支持,提示临床在关注传统生理指标的同时,应重视心脏生化指标的检测与分析。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)