import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVR
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error, r2_score
from sklearn.preprocessing import StandardScaler

# ==== 横向标准化函数（未用）====
def row_zscore_normalize(X):
    mean = X.mean(axis=1, keepdims=True)
    std = X.std(axis=1, keepdims=True) + 1e-8
    return (X - mean) / std

# ==== 文件路径 ====
xlsx_path = r"  "

# ==== 数据读取 ====
df = pd.read_excel(xlsx_path)
y = df.iloc[:, 0].values.reshape(-1, 1).astype(np.float32)
X = df.iloc[:, 1:].values.astype(np.float32)

# ==== 纵向归一化 ====
scaler_X = StandardScaler()
X_scaled = scaler_X.fit_transform(X)

scaler_y = StandardScaler()
y_scaled = scaler_y.fit_transform(y).flatten()

# ==== 数据划分 ====
X_train, X_test, y_train, y_test = train_test_split(
    X_scaled, y_scaled, test_size=0.4, random_state=32
)

# ==== 构建并训练 SVR 模型 ====
svr_model = SVR(kernel='rbf', C=20, epsilon=0.001)
svr_model.fit(X_train, y_train)

# ==== 预测 ====
pred_train_scaled = svr_model.predict(X_train)
pred_test_scaled = svr_model.predict(X_test)

# 反归一化
pred_train = scaler_y.inverse_transform(pred_train_scaled.reshape(-1, 1)).flatten()
pred_test = scaler_y.inverse_transform(pred_test_scaled.reshape(-1, 1)).flatten()
true_train = scaler_y.inverse_transform(y_train.reshape(-1, 1)).flatten()
true_test = scaler_y.inverse_transform(y_test.reshape(-1, 1)).flatten()

# ==== 指标 ====
mae_train = mean_absolute_error(true_train, pred_train)
mae_test = mean_absolute_error(true_test, pred_test)
r2_train = r2_score(true_train, pred_train)
r2_test = r2_score(true_test, pred_test)

# ==== 绘图 ====
plt.rcParams['font.family'] = 'Arial'
plt.rcParams['font.size'] = 14

plt.figure(figsize=(8, 6), dpi=150)
plt.scatter(true_train, pred_train, color=(155/255, 187/255, 1), label='Train', alpha=0.9, s=80)
plt.scatter(true_test, pred_test, color=(240/255, 155/255, 160/255), label='Test', alpha=0.9, s=80)

min_val = min(y.min(), pred_train.min(), pred_test.min())
max_val = max(y.max(), pred_train.max(), pred_test.max())
plt.plot([min_val, max_val], [min_val, max_val], 'k-', color='#9D9EA3', linewidth=2, label='Regression Line')

textstr = '\n'.join((
    f"Train MAE = {mae_train:.2f}",
    f"Train R² = {r2_train:.4f}",
    f"Test  MAE = {mae_test:.2f}",
    f"Test  R² = {r2_test:.4f}"
))

plt.text(0.05, 0.9, textstr,
         transform=plt.gca().transAxes,
         verticalalignment='top',
         horizontalalignment='left')

plt.xlabel(r'Experimental $\tau_{\mathrm{ign}}$ ($\mu$s)', fontsize=18)
plt.ylabel(r'Predicted $\tau_{\mathrm{ign}}$ ($\mu$s)', fontsize=18)
plt.legend(loc='lower right', fontsize=14, frameon=False)
plt.tick_params(axis='both', which='major', labelsize=16)
plt.tight_layout()
plt.savefig('train_fit_plot_SVR.png', dpi=500, bbox_inches='tight')
plt.show()



