计算PCC,VIF,TOL,IG

新加一列——Label,滑坡点赋值为1,非滑坡点赋值为0,土地利用都是forest,没有参考价值,所以删去土地利用的列。

 去除带有空值的行,最后

正样本(滑坡)数量: 153
负样本(非滑坡)数量: 148

面向AI编程,计算PCC,VIF,TOL,IG

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import scipy.stats as stats                                                  # normaltest
from statsmodels.stats.outliers_influence import variance_inflation_factor   # VIF
from sklearn.feature_selection import mutual_info_classif                    # 信息增益

file_path = r"D:/pyfileTorch/Graduation_test_code/test_158/Landslide_NoLandslide.xlsx"
df = pd.read_excel(file_path)

# 缺失值占比较低(如 <5%),可以考虑删除
df = df.dropna()

# df.info()

label_counts = df['Label'].value_counts()
print("正样本(滑坡)数量:", label_counts.get(1, 0))
print("负样本(非滑坡)数量:", label_counts.get(0, 0))

# 计算皮尔逊相关系数(PCC)
print("\n📌 皮尔逊相关系数计算:")
pcc_results = {}
for col in df.columns:
    if col != "Label" and df[col].dtype in ['float64', 'int64']:  # 仅处理数值型变量
       corr,p_value = stats.pearsonr(df['Label'], df[col])
       pcc_results[col] = {"pcc":corr,"P-value":p_value}

# 转换为DataFrame并按绝对相关性排序
pcc_df = pd.DataFrame.from_dict(pcc_results,orient='index')
pcc_df = pcc_df.sort_values(by="pcc",key=abs,ascending=False)

print(pcc_df)

# 设置中文字体(SimHei)防止乱码
plt.rcParams['font.sans-serif'] = ['SimHei']  # 黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
# 可视化相关性热图
plt.figure(figsize=(10,6))
sns.heatmap(df.corr(numeric_only=True),annot=True,cmap="coolwarm",fmt=".2f")
plt.title("相关性热图")
plt.show()

# 计算VIF和容忍度(TOL)
print("\n📌 计算VIF和TOL:")
numeric_cols = [col for col in df.columns if col!="Label" and df[col].dtype in ['float64','int64']]
X = df[numeric_cols]

vif_data = pd.DataFrame()
vif_data["Variable"] = X.columns
vif_data["VIF"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
vif_data["Tolerance"] = 1 / vif_data["VIF"]
vif_data = vif_data.sort_values(by="VIF", ascending=False)
print(vif_data)

# 计算信息增益(IG)
print("\n📌 计算信息增益(IG):")
X = df[numeric_cols]
y = df["Label"]
ig_values = mutual_info_classif(X,y,discrete_features=False,random_state=42)

# 生成IG DataFrame
ig_df = pd.DataFrame({"Variable":numeric_cols,"Information Gain":ig_values})
ig_df = ig_df.sort_values(by="Information Gain",ascending=False)
print(ig_df)

# 可视化信息增益
plt.figure(figsize=(10,5))
sns.barplot(x="Information Gain",y="Variable",data=ig_df,hue="Variable", palette="viridis", legend=False)
plt.title("信息增益")
plt.show()

📌 皮尔逊相关系数计算:  
             pcc       P-value      
NDVI    0.446030  4.040643e-16      
径流强度指数  0.339710  1.447624e-09
高程      0.319816  1.384757e-08    
距水系     0.298895  1.254533e-07   
距道路     0.298421  1.316152e-07   
地形起伏度   0.258536  5.512872e-06 
年降雨量    0.241787  2.230360e-05  
剖面曲率    0.232283  4.721952e-05
坡度      0.208672  2.668991e-04
地形湿度指数 -0.176807  2.076835e-03
平面曲率   -0.173195  2.568635e-03
坡向      0.162032  4.830793e-03
POI核密度 -0.152097  8.212598e-03
距断层     0.047870  4.079382e-01
地形粗糙度   0.003136  9.567858e-01

📌 计算VIF和TOL:
   Variable         VIF  Tolerance
6     地形粗糙度  285.939160   0.003497
14     年降雨量  266.027514   0.003759
13     NDVI   25.087014   0.039861
7        坡度   13.297419   0.075203
5     地形起伏度   11.491313   0.087022
4    地形湿度指数   11.272922   0.088708
0        高程    7.495429   0.133415
2      平面曲率    5.996318   0.166769
1      剖面曲率    4.497164   0.222362
8        坡向    4.169299   0.239848
10      距水系    3.702025   0.270122
11      距断层    3.113677   0.321164
9       距道路    2.403011   0.416145
3    径流强度指数    2.318824   0.431253
12   POI核密度    1.630471   0.613320

📌 计算信息增益(IG):
   Variable  Information Gain
14     年降雨量          0.182637
5     地形起伏度          0.171043
13     NDVI          0.144006
7        坡度          0.131028
6     地形粗糙度          0.125067
4    地形湿度指数          0.100118
12   POI核密度          0.070008
0        高程          0.064968
1      剖面曲率          0.056498
8        坡向          0.049344
9       距道路          0.045589
3    径流强度指数          0.034531
2      平面曲率          0.031532
10      距水系          0.021523
11      距断层          0.017077

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值