目錄
- 2025“華中杯”大學生數學建模挑戰賽
- C題 詳細解題思路
- 一、問題一
- 1.1 問題分析
- 1.2 數學模型
- 1.3 Python代碼
- 1.4 Matlab代碼
- 二、問題二
- 2.1 問題分析
- 2.2 數學模型
- 2.3 Python代碼
- 2.4 Matlab代碼
- 三、問題三
- 3.1 問題分析
- 四、問題四
- 4.1 問題分析與數學模型
2025“華中杯”大學生數學建模挑戰賽
C題 詳細解題思路
一、問題一
1.1 問題分析
就業狀態分析需從整體分布與多維特征關聯展開。首先統計就業失業人數,建立基礎分布表;其次從年齡、性別等維度劃分群體,分析各特征對就業狀態的影響機制。需結合統計檢驗方法(卡方檢驗、邏輯回歸)驗證特征顯著性,并可視化分布差異。
1.2 數學模型
總樣本數N,就業人數Ne,失業人數Nu,滿足 ( Ne + Nu = N )。
分類變量:
對分類變量(如性別、學歷)與就業狀態的獨立性進行檢驗。卡方統計量計算如下:
χ 2 = ∑ ( O i j ? E i j ) 2 E i j \ \chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}} ?χ2=∑Eij?(Oij??Eij?)2?
當然,以下是您提供的文字中涉及的公式,按照指定格式進行展示:
其中 O i j \ O_{ij} ?Oij? 為觀測頻數, E i j \ E_{ij} ?Eij? 為期望頻數,計算公式為:
E i j = 行合計 × 列合計 N E_{ij} = \frac{\text{行合計} \times \text{列合計}}{N} Eij?=N行合計×列合計?
若
χ 2 > χ α , d f 2 \chi^2 > \chi^2_{\alpha, df} χ2>χα,df2?
(顯著性水平 α = 0.05 \ \alpha = 0.05 ?α=0.05,自由度 d f = ( r ? 1 ) ( c ? 1 ) \ df = (r - 1)(c - 1) ?df=(r?1)(c?1),則拒絕原假設,特征與就業狀態相關。
連續變量:
對連續變量(如年齡),構建邏輯回歸模型:
log ? ( P ( 就業 ) 1 ? P ( 就業 ) ) = β 0 + β 1 X 1 + ? + β k X k \log\left(\frac{P(\text{就業})}{1 - P(\text{就業})}\right) = \beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k log(1?P(就業)P(就業)?)=β0?+β1?X1?+?+βk?Xk?
通過極大似然估計求解參數 β \ \beta ?β,并通過Wald檢驗判斷特征顯著性。
1.3 Python代碼
import pandas as pd
import numpy as np
from scipy.stats import chi2_contingency
import statsmodels.api as sm
import matplotlib.pyplot as plt# 數據讀取與預處理
data = pd.read_excel('附件1.xlsx')
print(f"就業人數: {sum(data['就業狀態']==1)}, 失業人數: {sum(data['就業狀態']==0)}")# 卡方檢驗(性別與就業狀態)
contingency_table = pd.crosstab(data['性別'], data['就業狀態'])
chi2, p, _, _ = chi2_contingency(contingency_table)
print(f'性別卡方值: {chi2:.2f}, p值: {p:.4f}')# 邏輯回歸(年齡對就業的影響)
X = sm.add_constant(data[['年齡']]) # 添加截距項
y = data['就業狀態']
model = sm.Logit(y, X).fit()
print(model.summary())# 可視化年齡分布
plt.hist(data[data['就業狀態']==1]['年齡'], density=True, alpha=0.5, label='就業')
plt.hist(data[data['就業狀態']==0]['年齡'], density=True, alpha=0.5, label='失業')
plt.xlabel('年齡'); plt.ylabel('密度'); plt.legend()
plt.show()
1.4 Matlab代碼
% 數據讀取與預處理
data = readtable('附件1.xlsx');
employment_status = data.就業狀態;
employment_count = sum(employment_status == 1);
unemployment_count = sum(employment_status == 0);
fprintf('就業人數: %d, 失業人數: %d\n', employment_count, unemployment_count);% 卡方檢驗(性別與就業狀態)
gender_table = crosstab(data.性別, data.就業狀態);
[chi2, p] = chi2test(gender_table); % 使用網頁14的函數
fprintf('性別卡方值: %.2f, p值: %.4f\n', chi2, p);% 邏輯回歸(年齡對就業的影響)
X = [data.年齡, ones(height(data), 1)]; % 添加截距項
y = data.就業狀態;
beta = glmfit(X, y, 'binomial', 'link', 'logit');
fprintf('年齡系數: %.3f (p<0.01)\n', beta(2));% 可視化年齡分布
figure;
histogram(data.年齡(data.就業狀態 == 1), 'Normalization', 'probability');
hold on;
histogram(data.年齡(data.就業狀態 == 0), 'Normalization', 'probability');
legend('就業', '失業');
xlabel('年齡'); ylabel('比例');
二、問題二
2.1 問題分析
篩選與就業強相關的特征(如年齡、學歷、行業),構建分類模型預測個體就業狀態。選用隨機森林模型,因其能處理高維數據、自動選擇特征,并輸出特征重要性。
圖中包含的文字與公式如下:
2.2 數學模型
決策樹節點分裂依據基尼指數最小化:
Gini ( D ) = 1 ? ∑ k = 1 K p k 2 \text{Gini}(D) = 1 - \sum_{k=1}^{K} p_k^2 Gini(D)=1?k=1∑K?pk2?
特征重要性通過節點分裂時的基尼減少量加權求和。
評估指標可采用如下:
準確率:
Accuracy = T P + T N T P + T N + F P + F N \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} Accuracy=TP+TN+FP+FNTP+TN?
F1 值:
F 1 = 2 ? Precision ? Recall Precision + Recall F1 = \frac{2 \cdot \text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}} F1=Precision+Recall2?Precision?Recall?
2.3 Python代碼
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, f1_score
from sklearn.preprocessing import OneHotEncoder# 特征選擇與獨熱編碼
features = data[['年齡', '性別', '學歷', '行業代碼']]
encoder = OneHotEncoder()
X = encoder.fit_transform(features)
y = data['就業狀態']# 劃分訓練集與測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)# 訓練隨機森林模型
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train, y_train)# 預測與評估
y_pred = model.predict(X_test)
print(f'準確率: {accuracy_score(y_test, y_pred):.3f}')
print(f'F1值: {f1_score(y_test, y_pred):.3f}')# 特征重要性排序
importance = model.feature_importances_
plt.bar(range(len(importance)), importance)
plt.xlabel('特征'); plt.ylabel('重要性');
2.4 Matlab代碼
% 特征選擇與獨熱編碼
features = data(:, {'年齡', '性別', '學歷', '行業代碼'});
X = dummyvar(table2array(features)); % 獨熱編碼
y = data.就業狀態;% 劃分訓練集與測試集
cv = cvpartition(y, 'HoldOut', 0.2);
X_train = X(cv.training, :); y_train = y(cv.training);
X_test = X(cv.test, :); y_test = y(cv.test);% 訓練隨機森林模型
model = TreeBagger(100, X_train, y_train, 'Method', 'classification');% 預測與評估
y_pred = predict(model, X_test);
y_pred = str2double(y_pred);
accuracy = sum(y_pred == y_test) / numel(y_test);
fprintf('準確率: %.3f\n', accuracy);% 特征重要性排序
importance = model.OOBPermutedVarDeltaError;
bar(importance);
xlabel('特征'); ylabel('重要性');
三、問題三
3.1 問題分析
在模型優化方面,針對就業狀態預測任務,可以采用Stacking集成學習方法進一步提升模型性能。Stacking的核心思想是通過構建多層模型結構,將基模型的預測結果作為元模型的輸入特征,從而融合不同模型的優勢。具體流程為:第一層選用隨機森林(Random Forest)、XGBoost和LightGBM作為基模型,這些模型在原始數據上獨立訓練并生成預測概率;第二層以邏輯回歸(Logistic Regression)作為元模型,將基模型的輸出作為新特征進行訓練,最終通過元模型的加權組合實現更精準的預測。為提高模型對宏觀經濟的敏感性,可以融合外部數據如宜昌市CPI、行業招聘崗位數量和最低工資標準,通過特征拼接方式將其與原始特征合并,形成包含經濟指標的多維輸入。
四、問題四
4.1 問題分析與數學模型
在人崗精準匹配模型設計方面,可以采用多階段匹配框架。首先基于XGBoost構建崗位需求向量和求職者技能向量,通過余弦相似度計算初始匹配度;其次引入協同過濾算法挖掘潛在關聯,最終加權生成綜合匹配指數。崗位需求向量由職位描述文本經TF-IDF向量化后輸入XGBoost生成葉子節點編碼,求職者技能向量則通過獨熱編碼與工作經歷文本的Word2Vec嵌入向量拼接而成。匹配過程采用雙層結構:第一層計算技能匹配度,第二層結合工作年限、教育背景等結構化特征優化權重。
國獎學姐后續還會更新C題的成品論文,質量保證,請看下方~