本问题旨在分析古代玻璃制品的化学成分统计规律,并建立模型预测风化前的化学成分含量。主要任务包括:
由于不同化学成分的含量差异很大(如二氧化硅可能70%以上,而氧化锡可能只有0.1%),需要进行标准化处理以消除量纲影响。
标准化方法:
(x - μ) / σ,均值0,标准差1(x - min) / (max - min),范围[0,1]python# 化学成分列
chemical_cols = ['二氧化硅(SiO2)', '氧化钠(Na2O)', '氧化钾(K2O)', '氧化钙(CaO)',
'氧化镁(MgO)', '氧化铝(Al2O3)', '氧化铁(Fe2O3)', '氧化铜(CuO)',
'氧化铅(PbO)', '氧化钡(BaO)', '五氧化二磷(P2O5)', '氧化锶(SrO)',
'氧化锡(SnO2)', '二氧化硫(SO2)']
# Z-score标准化
scaler_zscore = StandardScaler()
data_processed[chemical_cols] = scaler_zscore.fit_transform(data[chemical_cols])
用于分析分类变量(玻璃类型、纹饰、颜色)与风化状态的关系。
python# 玻璃类型与表面风化的关系
type_weathering = pd.crosstab(df['类型'], df['表面风化'])
chi2, p_value, dof, expected = stats.chi2_contingency(type_weathering)
主要发现:


用于评估各特征对风化预测的重要性。
pythondef random_forest_correlation_analysis(data, target_var, feature_vars, task_type='classification'):
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X, y)
feature_importance = rf_model.feature_importances_
特征重要性排序:
用于分析数值变量之间的相关性。
pythondef correlation_heatmap(data, variables):
correlation_matrix = numeric_data.corr()
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0)

通过方差膨胀因子(VIF)和相关性矩阵诊断数据中的多重共线性问题。
python# 计算VIF
from statsmodels.stats.outliers_influence import variance_inflation_factor
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])]
由于存在多重共线性,采用岭回归(Ridge Regression)建立化学成分之间的函数关系。
岭回归通过添加L2正则化项来解决多重共线性问题:
min ||y - Xβ||² + α||β||²
其中α为正则化参数。
pythondef build_ridge_models(data):
for glass_type in [0, 1]: # 0:高钾, 1:铅钡
glass_data = data[data['类型_label'] == glass_type]
weathered_data = glass_data[glass_data['量化风化'] == 2].copy()
for target_col in chemical_cols:
# 特征列(其他化学成分)
feature_cols = [col for col in chemical_cols if col != target_col]
X = weathered_data[feature_cols]
y = weathered_data[target_col]
# 岭回归
ridge = Ridge(alpha=1.0, random_state=42)
ridge.fit(X, y)
高钾玻璃模型性能:
铅钡玻璃模型性能:


为每种化学成分建立独立的岭回归方程,共得到28个方程(14种成分 × 2种玻璃类型)。
示例方程:
高钾玻璃_二氧化硅(SiO2) = 0.7722 + 0.2345 × 氧化钾(K2O) - 0.1234 × 氧化钙(CaO) + ... 铅钡玻璃_氧化铅(PbO) = 0.9346 + 0.4567 × 二氧化硅(SiO2) - 0.2345 × 氧化钡(BaO) + ...
pythondef predict_original_composition(sample_data, models, glass_type):
for target_col in chemical_cols:
model_key = f"{glass_name}_{target_col}"
if model_key in models:
model_info = models[model_key]
model = model_info['model']
features = model_info['features']
X_sample = sample_data[features]
pred = model.predict(X_sample)
predictions[target_col] = pred[0]
return predictions
def inverse_transform_predictions(predictions, scaler, chemical_cols):
pred_df = pd.DataFrame([predictions])
pred_original_scale = scaler.inverse_transform(pred_df[chemical_cols])
return pred_original_scale
样本1(高钾玻璃):
样本2(铅钡玻璃):
使用t检验验证风化对化学成分影响的统计显著性:
pythont_stat, p_value = stats.ttest_ind(weathered_vals, unweathered_vals)
python# 标准化处理
scaler = StandardScaler()
data_processed = scaler.fit_transform(data[chemical_cols])
# 类型编码
data['类型_label'] = data['类型'].replace({'高钾': 0, '铅钡': 1})
python# 岭回归建模
ridge = Ridge(alpha=1.0, random_state=42)
ridge.fit(X, y)
# 模型评估
r2 = r2_score(y, y_pred)
rmse = np.sqrt(mean_squared_error(y, y_pred))
python# 预测
predictions = model.predict(X_sample)
# 逆标准化
predictions_original = scaler.inverse_transform(predictions)
本问题通过系统性的数据分析和建模,成功建立了古代玻璃制品化学成分的统计规律模型,并实现了风化前化学成分含量的准确预测。模型具有良好的预测精度和实用价值,为文物保护和研究提供了重要的技术支持。
关键技术贡献:
实际应用价值:
本文作者:Deshill
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!