灰色关联度分析方法教程!代码+实际数据+案例讲解
灰色关联度分析法(Grey Relational Analysis)是灰色系统分析方法的一种,它可以得出各因素对系统影响程度的优劣关系。
本文含有:Python代码+原始数据+权威参考文献。
一、前言
- 灰色关联分析的目的是寻求系统中各个因素的主要关系,找出影响目标值的重要因素,从而掌握事物的主要特征。
- 灰色关联分析法通过研究数据关联性大小(母序列与子特征序列之间的关联程度),通过关联度(即关联性大小)进行度量数据之间的关联程度,从而辅助决策的一种研究方法。
二、灰色关联度分析步骤
2.1 实操步骤
- 确定特征数列和母数列:选择一个或多个参考数据列(母序列)和若干个比较数据列(子序列)。
- 数据去量纲化:通过初值化、均值化等方法对数据进行预处理,以消除量纲和数量级的影响。不同的去量纲化处理方法会直接影响结果分析。
- 计算关联系数:通过公式计算每个子序列与母序列的关联系数。
- 计算关联度:对关联系数进行加权平均,得到关联度。
- 分析结果:根据关联度的大小,分析各因素对系统的影响程度。
2.2 关键数学公式
2.3.1 计算灰色关联系数公式
ξ
i
,
0
=
Δ
min
+
ρ
Δ
max
Δ
t
(
i
,
0
)
+
ρ
Δ
max
,
i
=
1
,
2
,
⋯
,
m
\xi_{i, 0}=\frac{\Delta_{\min }+\rho \Delta_{\max }}{\Delta_{t(i, 0)}+\rho \Delta_{\max }}, \quad i=1,2, \cdots, m
ξi,0=Δt(i,0)+ρΔmaxΔmin+ρΔmax,i=1,2,⋯,m
式中:
- ξ i , 0 \xi_{i, 0} ξi,0—灰色关联系数;
- Δ min \Delta_{\min } Δmin—两个序列(子序列与母序列)数值差值的绝对值的最小值;
- Δ max \Delta_{\max } Δmax—两个序列(子序列与母序列)数值差值的绝对值的最大值;
- ρ \rho ρ—称为分辨系数,其作用在于提高灰关联系数之间的差异显著性,一般取0.5;
- Δ t ( i , 0 ) \Delta_{t(i, 0)} Δt(i,0)—两个序列数值差值的绝对值,即同一观测时刻(同一行)子序列与母序列观测值之间差值的绝对值;
2.3.2 计算关联度公式
R
i
,
0
=
1
n
∑
t
=
1
n
ξ
i
,
0
R_{i, 0}=\frac{1}{n} \sum_{t=1}^{n} \xi_{i, 0}
Ri,0=n1t=1∑nξi,0
式中:
- R i , 0 R_{i, 0} Ri,0—为子序列 i i i 与母序列 0 0 0 的灰色关联度;
- ξ i , 0 \xi_{i, 0} ξi,0—灰色关联系数;
- n n n—为序列的长度,即观测数据个数;
- t t t—为序列中数据的序号;
关联度是一个有界的数,取值范围在0.1~1之间。子因素与主因素之间的关联度愈接近于1,表明它们之间的关系愈紧密,或者说,该子因素对主因素的影响愈大,反之亦然。将各关联度 R i , 0 R_{i, 0} Ri,0 ( i = 1 , 2 , . . . , m ) (i=1,2,...,m) (i=1,2,...,m)按大小排成一行,即为各子序列对母序列的关联序;若依次分别取各子序列作母序列,计算与其他数列的关联度,并排列成矩阵,便形成关联矩阵。
2.3.3 计算各指标相对于系统评价的权重系数公式(可选)
a
i
=
R
i
,
0
∑
i
=
1
m
R
i
,
0
a_{i}=\frac{R_{i, 0}}{\sum_{i=1}^{m} R_{i, 0}}
ai=∑i=1mRi,0Ri,0
式中:
- a i a_{i} ai—为归一化后的权重系数;
- R i , 0 R_{i, 0} Ri,0—为子序列 i i i 与母序列 0 0 0 的灰色关联度;
- m m m—为序列的总数量,即有多少个数据序列(子序列+母序列);
- i i i—为序列的序数;
三、案例分析
3.1 背景简介
案例选自论文《克拉玛依油田中三叠统克下组油气产能评价》石勇等人,原始数据参见论文表 1。
- 论文摘要简述:对沉积储层特征进行详细分析,将影响油层产能的地质参数和工程参数同储层物性进行灰色关联分析,对未开采区域的油层产能进行评价。文中通过现阶段储层资料来确定评价参数,再利用灰色关联分析法对目的产油层进行初步评价,结合综合评价,对剩余油的开发提供合理指导。
- 灰色关联法在产油层评价中较为常见,可以利用影响油层产能的各种因素之间的关系,来建立产油层的综合评价度量1。该方法在应用过程中包括子、母序列的确定、计算关联度、计算权重系数以及计算综合评价因子2。
3.2 产油层评价参数的确定
- 油层勘探阶段主要选取
地质参数
; - 进入油层开发阶段时,多数
工程参数
对于产油层也有较大程度影响3;
因此,基于未开采区域的剩余油勘探开发特征,选取9个评价指标
对产油层进行综合评价,包括渗透率、孔隙度、埋藏深度、粒径、砂地比、射开油层厚度、挤液强度、加砂强度和采油强度3。
3.3 灰色关联分析过程
3.3.1 确定子、母序列
- 将某一个能够主要反映被评判事物性质的指标,其数据按一定顺序排列,称为关联分析的母序列;
- 其余在一定程度上能反映被评判事物性质的指标,其数据排成序列为子序列1
在开发阶段,渗透率相对于其他的评价指标而言,无疑是产油层主要的影响因素 4-5。在 9 个评价指标确立的基础上,渗透率数据构成母序列,其余数据构成子序列,原始数据见表1。
3.3.2 计算关联系数和关联度
1)数据去量纲化
为对储层进行更合理的评价,需将数据进行去量纲化,利用初值化处理对子、母序列的数据进行去量纲化2,结果见表2。
井号 | 孔隙度 | 埋藏深度 | 粒径 | 砂地比 | 射开油层厚度 | 挤液强度 | 加砂强度 | 采油强度 | 渗透率 |
---|---|---|---|---|---|---|---|---|---|
80488井 | 0.88 | 1.00 | 1.00 | 1.00 | 1.00 | 0.36 | 0.36 | 0.21 | 0.37 |
80550井 | 1.00 | 1.00 | 1.00 | 0.93 | 0.36 | 0.25 | 1.00 | 0.33 | 1.00 |
85451井 | 0.87 | 0.97 | 0.82 | 0.96 | 1.00 | 1.00 | 0.04 | 1.00 | 0.25 |
85480井 | 0.88 | 0.98 | 1.00 | 0.80 | 0.62 | 0.35 | 0.32 | 0.39 | 0.26 |
B802井 | 0.92 | 0.93 | 0.98 | 0.95 | 0.94 | 0.40 | 0.43 | 0.21 | 0.75 |
B804井 | 0.90 | 0.97 | 0.92 | 0.60 | 0.41 | 0.81 | 0.68 | 0.32 | 0.39 |
对原始数据进行初值化处理,使用序列数据中的最大初始值作为除数, 处理后的值 = 序列数据 / 最大初始值 处理后的值=序列数据 / 最大初始值 处理后的值=序列数据/最大初始值,来消除不同变量之间的量级(单位差异)。处理后数据接近1,使得所有的变量都在同等的水平上,“公平” 的参与后续处理。
Python代码
初值化处理
def normalize_data(df):
"""
对 DataFrame 进行初值化处理
具体过程是获取每列数据的最大值,然后将该列的其他值除以这个最大值,得到的结果替换掉该列的值。
最大值不能为0。
:param df: 需要处理的 DataFrame
:return: 处理后的 DataFrame
"""
for col in df.columns:
max_value = df[col].max()
if max_value != 0:
df[col] = df[col] / max_value
df = df.round(2) # 保留两位小数
return df
2)计算关联系数
在对数据进行去量纲后,需要计算母序列所代表的关键指标同子序列代表的其他指标之间的关联系数。对去量纲化的数据矩阵,利用 公式 2.3.1
对关联系数进行求取,选取分辨系数为0.5。关联系数结果见 表3。
井号 | 孔隙度 | 埋藏深度 | 粒径 | 砂地比 | 射开油层厚度 | 挤液强度 | 加砂强度 | 采油强度 |
---|---|---|---|---|---|---|---|---|
80488井 | 0.3780 | 0.3636 | 0.3700 | 0.4315 | 0.3930 | 1.0000 | 0.9412 | 0.8318 |
80550井 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 0.3892 | 0.3422 | 1.0000 | 0.4258 |
85451井 | 0.3333 | 0.3333 | 0.3936 | 0.3991 | 0.3511 | 0.3422 | 0.4324 | 0.3956 |
85480井 | 0.3333 | 0.3333 | 0.3333 | 0.4749 | 0.5374 | 0.8280 | 0.7273 | 0.8812 |
B802井 | 0.6458 | 0.6667 | 0.6167 | 0.7658 | 0.6991 | 0.5310 | 0.3333 | 0.4863 |
B804井 | 0.3780 | 0.3830 | 0.4111 | 0.7522 | 1.0000 | 0.4843 | 0.3556 | 1.0000 |
3)计算关联度
利用 公式 2.3.2
计算各子序列指标与母序列关联度,关联度结果见表 4。关联度中越接近 1 的指标,对渗透率的影响越大。因此,从关联度大小可发现,采油强度对于渗透率的影响最大,其次是砂地比和加砂强度,说明S2-4
和S2-5
油层产能受采油强度影响最大。
相关过程值 | 孔隙度 | 埋藏深度 | 粒径 | 砂地比 | 射开油层厚度 | 挤液强度 | 加砂强度 | 采油强度 | 渗透率 |
---|---|---|---|---|---|---|---|---|---|
关联度 | 0.5114 | 0.5133 | 0.5208 | 0.6372 | 0.5616 | 0.5880 | 0.6316 | 0.6701 | 1.0000 |
Python代码
计算母序列和子序列之间的灰色关联系数和关联度
def grey_relate(x, y, r=0.5):
"""
计算母序列和子序列之间的灰色关联系数和关联度。
:param x:子序列(比较序列)
:param y:母序列(参考序列)
:param r:分辨率系数,默认值为0.5。
:return:tuple类型,包含关联系数列表和关联度。
"""
# 确保输入数据为numpy数组
x = np.array(x)
y = np.array(y)
# 计算绝对差值矩阵
diff_matrix = np.abs(x - y)
# 计算最小值和最大值
min_diff = np.min(diff_matrix)
max_diff = np.max(diff_matrix)
# 计算关联系数
relate_coefficients = (min_diff + r * max_diff) / (diff_matrix + r * max_diff)
# 计算关联度
relate_degree = np.mean(relate_coefficients)
# 保留四位小数
relate_coefficients = np.round(relate_coefficients, 4)
relate_degree = np.round(relate_degree, 4)
return relate_coefficients.tolist(), float(relate_degree)
3.3.3 计算评价指标权重系数
最终利用 公式 2.3.3
求取储层评价指标的权重系数,得到反映影响油层产能因素的相关权重系数2。通过对各评价参数的权重系数进行计算,结果如表 5 所示。
相关过程值 | 孔隙度 | 埋藏深度 | 粒径 | 砂地比 | 射开油层厚度 | 挤液强度 | 加砂强度 | 采油强度 | 渗透率 |
---|---|---|---|---|---|---|---|---|---|
关联度 | 0.5114 | 0.5133 | 0.5208 | 0.6372 | 0.5616 | 0.5880 | 0.6316 | 0.6701 | 1.0000 |
权重系数 | 0.0908 | 0.0911 | 0.0924 | 0.1131 | 0.0997 | 0.1044 | 0.1121 | 0.1189 | 0.1775 |
根据权重系数对 9 个评价指标进行排序,渗透率 > 采油强度 > 砂地比 > 加砂强度 > 挤液强度 > 射开油层厚度 > 粒径 > 埋藏深度 > 孔隙度,说明产油层受工程参数的影响要大于地质参数的影响。
Python代码
计算评价指标权重系数
def calculate_weights(degree_list):
"""
计算灰色关联度列表的权重系数。
:param degree_list: 灰色关联度列表。
:return: 权重系数列表。
"""
# 计算列表中所有元素的总和
total_sum = sum(degree_list)
# 检查总和是否为0,以避免除以零
if total_sum == 0:
raise ValueError("The sum of the elements in the list is zero, cannot compute weights.")
# 计算每个指标的权重系数
weight_coefficients = [element / total_sum for element in degree_list]
# 保留四位小数
weights = np.round(weight_coefficients, 4)
return weights
3.3.4 计算综合评价因子
为对产油储层进行合理划分,需要引用综合评价因子 Q
,计算方式是将去量纲化数据同相应的权重系数进行相乘,然后相加,即为各观测样本的综合评价因子。最终根据综合评价因子 Q 高低进行排序,对储层进行分类评价2。
根据综合评价因子的大小,将未动用区 S2-4
和 S2-5
产油层分为两类,见表 6:
井号 | 综合评价因子 | 储层分类 |
---|---|---|
80488井 | 0.64 | I I I |
80550井 | 0.77 | I I I |
85451井 | 0.72 | I I I |
85480井 | 0.58 | I I II II |
B802井 | 0.71 | I I I |
B804井 | 0.63 | I I I |
- I I I 类储层综合评价因子在 ( 0.60 , 1.00 ] (0.60, 1.00] (0.60,1.00],采油强度、加砂强度以及挤液强度较强,产能较高;
- I I II II类储层综合评价因子在 ( 0.40 , 0.60 ] (0.40,0.60] (0.40,0.60],采油强度、加砂强度以及挤液强度降低,产能中等;
- 整体反映未动用区油层开发潜力较大。
Python代码
计算样本的综合评价因子
def calculate_cef(df, weights):
"""
计算样本的综合评价因子
:param df: DataFrame 标准化后的样本数据df
:param weights: 样本评价指标权重系数列表
:return: 综合评价因子列表
"""
cef = np.sum(weights * df, axis=1) # 各评价参数数值乘以权重系数后相加
# 保留两位小数
cef = np.round(cef, 2)
return cef.tolist()
3.4 结论
利用灰色关联分析法对未开采区 S2-4
和 S2-5
产油层进行综合评价,发现:
- 采油强度、加砂强度和挤液强度等工程参数对于储层产能影响较大;
- 依据产能高低,将未动用区
S2-4
和S2-5
产油层分为两类,产油层整体开发潜力较大。
3.5 完整代码
整理到gitee仓库:https://gitee.com/modongi/data-analysis/tree/master/grey_correlation_degree_analysis
四、灰色关联度分析的注意事项
注意事项、灰色关联度分析的优缺点
在进行灰色关联度分析时,需要注意以下几点:
- 数据要求:数据必须大于0,否则会出现“抵消”现象。
- 量纲处理:选择合适的量纲处理方法,如初值化、均值化等。
- 分辨系数:分辨系数通常取0.5,以增强区分能力。
- 母序列选择:母序列的选择应基于研究目的,通常结合实际情况、理论分析和专家经验等确定。
五、最后
在探索的道路上,请相信自己的判断,大胆假设,小心求证。
以上就是本文的全部内容,欢迎点赞评论,指出不足,笔者由衷感谢!~
涂乙,谢传礼,刘超,等. 灰色关联分析法在青东凹陷储层评价中的应用[J]. 天然气地球科学,2012,23(2):381-386. doi:10.3969/j.issn.1005-8141.2016.04.011. ↩︎ ↩︎
赵加凡,陈小宏,张勤. 灰关联分析在储层评价中的应用[J]. 勘探地球物理进展,2003,26(4):282-286. ↩︎ ↩︎ ↩︎ ↩︎
石 勇,方志斌,卢炳雄,等. 克拉玛依油田中三叠统克下组油气产能评价[J]. 西南石油大学学报(自然科学版),2024,46(2):41-52. ↩︎ ↩︎
杨德永,李超. 储层评价中的大样本聚类方法[J]. 石油实验地质,1991,13(3):281-286. ↩︎
张琴,朱筱敏,钟大康,等. 储层“主因素定量”评价方法的应用—以东营凹陷下第三系碎屑岩为例[J]. 天然气工业,2006,26(10):21-23,170. doi: 10.3321/j.-issn:1000-0976.2006.10.007 ↩︎