學(xué)建模C題復(fù)盤:成分?jǐn)?shù)據(jù)降維聚類與分類建模全流程)
簡(jiǎn)介面向數(shù)學(xué)建模競(jìng)賽參與者這份2022年全國(guó)大學(xué)生數(shù)學(xué)建模C題完整方案以PDF文檔形式呈現(xiàn)聚焦古代玻璃制品的成分分析與鑒別。內(nèi)容覆蓋數(shù)據(jù)預(yù)處理、特征工程、主成分分析、因子分析、敏感性分析與灰色關(guān)聯(lián)度分析等核心環(huán)節(jié)完整呈現(xiàn)從問題重述、數(shù)據(jù)探索到建模求解的論文正文并包含對(duì)應(yīng)代碼實(shí)現(xiàn)可幫助讀者快速理解風(fēng)化效應(yīng)下文物成分分析的典型思路與模型搭建方法。壓縮包內(nèi)共1個(gè)PDF文件大小約3.55MB便于下載與查閱。目前已有927人學(xué)習(xí)下載適合正備戰(zhàn)國(guó)賽、需要參考完整建模流程和論文寫作框架的讀者。PDF中還提供了基于風(fēng)化系數(shù)判別的數(shù)據(jù)處理細(xì)節(jié)以及鉛鋇玻璃A紋、C紋等亞類劃分的敏感性討論具有較強(qiáng)的實(shí)操參考價(jià)值。1. 2022全國(guó)大學(xué)生數(shù)學(xué)建模C題這題為什么成了當(dāng)年“文檔寫得完模型跑不動(dòng)”的分水嶺如果你參加過2022年的全國(guó)大學(xué)生數(shù)學(xué)建模競(jìng)賽尤其是選了C題大概率會(huì)有一種感覺題目讀起來不難數(shù)據(jù)量也不大但真正動(dòng)手時(shí)每一步都在考驗(yàn)?zāi)銓?duì)“成分?jǐn)?shù)據(jù)”這種特殊結(jié)構(gòu)的理解。C題給定的是一批古代玻璃制品的成分檢測(cè)結(jié)果要求通過成分比例推斷其類型和風(fēng)化規(guī)律。表面上是分類和聚類問題實(shí)際上卻把降維、歸一化、不完整數(shù)據(jù)處理和模型穩(wěn)定性全部揉在了一起。很多隊(duì)伍最后論文寫得厚但評(píng)委一問靈敏度分析就露餡問題就出在中間有一環(huán)模型是黑匣子。這篇筆記把當(dāng)時(shí)我們隊(duì)伍從拿到題目到提交完整文檔和代碼的完整路徑拆給你包括每個(gè)參數(shù)怎么設(shè)、每個(gè)坑怎么繞以及最后那份能站住腳的論文是如何從代碼里長(zhǎng)出來的。2. 拆題與建模路線從賽題文本到第一版可用模型2.1 題目數(shù)據(jù)長(zhǎng)什么樣成分?jǐn)?shù)據(jù)的三個(gè)直覺陷阱2022年C題的數(shù)據(jù)核心是一張成分檢測(cè)表每一行代表一件文物樣本列是各種金屬氧化物的百分比含量比如硅、鋁、鐵、鉀、鈣等最后一列是類別標(biāo)簽高鉀類或鉛鋇類。第一眼看上去這就是一個(gè)常規(guī)的分類任務(wù)但如果你直接拿原始百分比去訓(xùn)練模型會(huì)踩到三個(gè)陷阱。第一個(gè)陷阱是“閉合效應(yīng)”。所有成分加總接近100%任何一個(gè)成分升高其他成分必然相對(duì)下降。這種內(nèi)在的負(fù)相關(guān)不是真實(shí)屬性而是數(shù)據(jù)格式帶來的假象。如果直接算歐氏距離或做協(xié)方差分析得到的相關(guān)性會(huì)誤導(dǎo)聚類。處理方式是先做對(duì)數(shù)比變換比如中心對(duì)數(shù)比變換即CLR打破閉合約束再進(jìn)入建模流程。第二個(gè)陷阱是零值。部分樣本的某些成分未檢出表中填0。直接CLR變換時(shí)log(0)會(huì)報(bào)錯(cuò)需要用乘法替換或零填充策略。常見做法是用該成分在全體樣本中的最小檢出值的一半替換而不是簡(jiǎn)單填均值因?yàn)樘罹禃?huì)嚴(yán)重壓縮該維度的方差。第三個(gè)陷阱是標(biāo)簽不平衡。類別可能不是均衡分布高鉀類樣本明顯少于鉛鋇類如果直接訓(xùn)練分類器少數(shù)類會(huì)被淹沒。需要在下游模型里處理類別權(quán)重或者用分層采樣保證驗(yàn)證集的類別比例與全集一致。2.2 建模路線選擇為什么先降維再聚類和分類這道題的核心矛盾是變量多、樣本少、變量之間高度相關(guān)。十幾項(xiàng)成分指標(biāo)雖然維度不算高但相關(guān)性強(qiáng)直接聚類時(shí)距離計(jì)算會(huì)被冗余維度帶偏。所以標(biāo)準(zhǔn)技術(shù)路線是先做降維主成分分析配合數(shù)據(jù)變換再在低維空間做聚類分析最后用判別分析或隨機(jī)森林做分類再加靈敏度分析檢驗(yàn)穩(wěn)定性。我們最終選的技術(shù)棧是Python pandas scikit-learn沒有用深度學(xué)習(xí)原因是樣本量只有幾十個(gè)神經(jīng)網(wǎng)絡(luò)在小樣本表格數(shù)據(jù)上不僅沒有優(yōu)勢(shì)還容易過擬合且難以解釋。而競(jìng)賽評(píng)審非??粗乜山忉屝跃垲愔行摹⒅鞒煞州d荷、判別函數(shù)系數(shù)都是能直接寫進(jìn)論文的素材。主成分分析在這里不僅是為降維而降維它還能幫你回答題目里一個(gè)關(guān)鍵問題哪些成分是區(qū)分玻璃類型的主要變量。你看主成分載荷矩陣載荷絕對(duì)值大的成分就是劃分類型的核心指標(biāo)這個(gè)信息在論文里是重要的模型解釋段落。2.3 把賽題翻譯成數(shù)學(xué)語言目標(biāo)函數(shù)的落點(diǎn)賽題分成幾個(gè)小問第一問要求對(duì)文物樣本進(jìn)行分類第二問要求分析不同類別之間的成分差異第三問要求預(yù)測(cè)未知樣本的類別。翻譯成數(shù)學(xué)語言就是無監(jiān)督聚類探索類別結(jié)構(gòu) 有監(jiān)督分類建立判別規(guī)則 統(tǒng)計(jì)檢驗(yàn)驗(yàn)證類別差異顯著性。我們模型的目標(biāo)函數(shù)不是最小化損失而是讓聚類結(jié)果和分類結(jié)果在業(yè)務(wù)語義上一致。如果聚類分出來的群體無法解釋哪怕輪廓系數(shù)再高這篇論文也站不住。所以在建模時(shí)我們不只看聚類指標(biāo)還會(huì)對(duì)每個(gè)簇的成分均值做對(duì)比分析確認(rèn)高鉀類和鉛鋇類在主要成分上有顯著差異。這一步直接決定了后面所有分析的可靠性也決定了評(píng)委買不買賬。3. 數(shù)據(jù)預(yù)處理與特征降維用Python把原始成分表變成干凈可用的特征矩陣3.1 缺失值處理與成分?jǐn)?shù)據(jù)的對(duì)數(shù)比變換拿到原始表格后我習(xí)慣先做一次徹底的數(shù)據(jù)體檢直接看缺失比例、零值比例和每列分布。下面的代碼是一個(gè)可復(fù)現(xiàn)的預(yù)處理流程。import pandas as pd import numpy as np # 讀取原始成分?jǐn)?shù)據(jù) df pd.read_csv(glass_data.csv) # 查看每一列的缺失值和零值比例 print(df.isnull().sum()) print((df 0).sum()) # 成分列名列表不含ID和類別標(biāo)簽 comp_cols [c for c in df.columns if c not in [id, type, sub_type]] # 零值處理用該成分非零最小值的一半替換 for col in comp_cols: non_zero df.loc[df[col] 0, col] if len(non_zero) 0: replace_val non_zero.min() / 2 df[col] df[col].replace(0, replace_val) print(缺失值和零值處理完成)這段代碼的核心邏輯是逐列掃描零值用非零最小值的一半填充。選最小值的一半而不是均值是為了保留該成分的方差信息。如果你用均值填充相當(dāng)于人為制造了一個(gè)常見值聚類時(shí)所有樣本在該維度上的差異都會(huì)被壓縮最后導(dǎo)致聚類結(jié)果偏保守。接下來是中心對(duì)數(shù)比變換CLR。這個(gè)變換能有效打破成分?jǐn)?shù)據(jù)的閉合效應(yīng)讓每個(gè)樣本的特征值不再受“總和為100%”的約束。from sklearn.preprocessing import StandardScaler # 提取成分矩陣并做CLR變換 comp_matrix df[comp_cols].values 1e-10 # 防止log(0) log_matrix np.log(comp_matrix) row_means log_matrix.mean(axis1, keepdimsTrue) clr_matrix log_matrix - row_means # 標(biāo)準(zhǔn)化供后續(xù)PCA使用 clr_df pd.DataFrame(clr_matrix, columnscomp_cols) scaler StandardScaler() clr_scaled scaler.fit_transform(clr_df)CLR的本質(zhì)是讓每個(gè)樣本的數(shù)值都減去該樣本所有成分的對(duì)數(shù)均值相當(dāng)于把“總量差異”去掉只保留“構(gòu)成差異”。加1e-10是防御性寫法確保對(duì)數(shù)運(yùn)算穩(wěn)定。標(biāo)準(zhǔn)化放在CLR之后而不是之前這個(gè)順序不能顛倒。先CLR再標(biāo)準(zhǔn)化才能保證每個(gè)成分維度在后續(xù)PCA中有公平的權(quán)重。3.2 主成分分析降維選擇主成分?jǐn)?shù)量時(shí)的兩個(gè)參考標(biāo)準(zhǔn)PCA的核心參數(shù)是主成分?jǐn)?shù)量。常見的做法是取累計(jì)方差貢獻(xiàn)率到85%以上但我建議同時(shí)參考特征值的“陡坡圖”scree plot。當(dāng)特征值曲線從陡峭下降轉(zhuǎn)為平緩的那個(gè)拐點(diǎn)就是主成分個(gè)數(shù)的最佳位置。在2022年C題這種場(chǎng)景下我們最終取了3個(gè)主成分累計(jì)方差貢獻(xiàn)率約88%效果很理想。from sklearn.decomposition import PCA import matplotlib.pyplot as plt pca PCA(n_componentslen(comp_cols)) pca.fit(clr_scaled) var_ratio pca.explained_variance_ratio_ # 畫累計(jì)方差貢獻(xiàn)率圖 cum_ratio np.cumsum(var_ratio) plt.plot(range(1, len(var_ratio) 1), cum_ratio, o-) plt.axhline(y0.85, colorred, linestyle--) plt.xlabel(主成分?jǐn)?shù)量) plt.ylabel(累計(jì)方差貢獻(xiàn)率) plt.title(PCA累計(jì)方差貢獻(xiàn)率) plt.show()運(yùn)行這段代碼后你會(huì)發(fā)現(xiàn)前2個(gè)主成分已經(jīng)能解釋約65%的方差第3個(gè)加入后才到88%。取3個(gè)主成分的原因是二維投影雖然好畫圖但丟失了部分可用的判別信息取4個(gè)以上則邊際收益明顯下降且會(huì)引入噪聲。一個(gè)容易被忽略的檢查點(diǎn)是主成分載荷的方向。建議把前3個(gè)主成分的載荷矩陣打印出來看看每個(gè)主成分主要由哪幾個(gè)成分驅(qū)動(dòng)方便在論文里解釋主成分的業(yè)務(wù)含義。loadings pd.DataFrame( pca.components_[:3].T, indexcomp_cols, columns[PC1, PC2, PC3] ) print(loadings)如果PC1上氧化硅的載荷是負(fù)的大值氧化鉛是正的大值說明第一主成分基本代表了“硅鉛置換”的結(jié)構(gòu)差異這正是高鉀類與鉛鋇類最本質(zhì)的區(qū)分維度。這一句話寫進(jìn)論文比堆十個(gè)數(shù)據(jù)指標(biāo)更有說服力。3.3 在降維之后保留原始維度的重要性一個(gè)很多隊(duì)伍會(huì)犯的錯(cuò)誤是降維后只用主成分做聚類論文里卻依然拿原始成分解釋類別差異導(dǎo)致圖表和文字脫節(jié)。我的建議是雙軌并行聚類在低維空間做但每個(gè)簇的特征畫像用原始成分的均值和中位數(shù)描述。這樣既有數(shù)學(xué)嚴(yán)謹(jǐn)性又有業(yè)務(wù)可讀性。# 把前三個(gè)主成分加到原數(shù)據(jù)中 pca_3 PCA(n_components3) pca_result pca_3.fit_transform(clr_scaled) df[PC1] pca_result[:, 0] df[PC2] pca_result[:, 1] df[PC3] pca_result[:, 2] # 按類別查看原始成分均值 group_summary df.groupby(type)[comp_cols].mean() print(group_summary)這段代碼輸出的是每個(gè)類別在所有成分上的均值寫完論文里的統(tǒng)計(jì)表直接復(fù)制。低維聚類、原始維度解釋兩條腿走路評(píng)委想挑毛病都難找切入點(diǎn)。4. 聚類與分類建模從K-means到判別分析的完整流水線4.1 聚類數(shù)怎么選輪廓系數(shù)與業(yè)務(wù)可解釋性的取舍聚類數(shù)K在2022年C題里是第一個(gè)分水嶺。K2時(shí)輪廓系數(shù)最高正好對(duì)應(yīng)賽題里的兩個(gè)已知類型K3或K4時(shí)輪廓系數(shù)會(huì)稍微下降但能把某個(gè)大類進(jìn)一步細(xì)分成亞型。題目本身要求識(shí)別亞類型所以K不能只看數(shù)學(xué)指標(biāo)還要看細(xì)分出來的簇在成分均值和工藝特征上是否講得通。from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score sil_scores [] K_range range(2, 7) for k in K_range: km KMeans(n_clustersk, random_state42, n_init10) labels km.fit_predict(pca_result) score silhouette_score(pca_result, labels) sil_scores.append(score) for k, s in zip(K_range, sil_scores): print(fK{k}, 輪廓系數(shù){s:.4f})運(yùn)行這段代碼后一般會(huì)看到K2時(shí)輪廓系數(shù)最高K3和K4略有下降。此時(shí)不要直接選K2因?yàn)轭}目問的是“亞類”K2只回答了主類。建議把K3和K4的畫出來對(duì)比選擇簇內(nèi)樣本數(shù)比較均衡且每個(gè)簇的成分均值有明顯梯度的那個(gè)K。在我們的案例里K3最合適兩個(gè)對(duì)應(yīng)主類別另一個(gè)是鉛鋇類里的高硅亞組工藝含義明確。4.2 監(jiān)督分類建模線性判別分析與隨機(jī)森林的對(duì)比聚類完成之后需要對(duì)未知樣本進(jìn)行預(yù)測(cè)這里用到有監(jiān)督分類。2022年C題是一個(gè)典型的小樣本分類問題我同時(shí)跑了線性判別分析和隨機(jī)森林兩種模型原因很現(xiàn)實(shí)線性判別分析可解釋性強(qiáng)隨機(jī)森林魯棒性好但要調(diào)參。兩者輸出一致才能放心地把結(jié)論寫進(jìn)論文。from sklearn.model_selection import train_test_split, StratifiedKFold from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score, confusion_matrix # 提取特征主成分 關(guān)鍵原始成分 feature_cols [PC1, PC2, PC3] [高解釋力成分1, 高解釋力成分2] X df[feature_cols].values y df[type].values # 分層劃分訓(xùn)練集和測(cè)試集 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, stratifyy, random_state42 ) # 線性判別分析 lda LinearDiscriminantAnalysis() lda.fit(X_train, y_train) y_pred_lda lda.predict(X_test) print(LDA準(zhǔn)確率:, accuracy_score(y_test, y_pred_lda)) # 隨機(jī)森林 rf RandomForestClassifier( n_estimators200, max_depth4, class_weightbalanced, random_state42 ) rf.fit(X_train, y_train) y_pred_rf rf.predict(X_test) print(隨機(jī)森林準(zhǔn)確率:, accuracy_score(y_test, y_pred_rf))使用線性判別分析時(shí)有個(gè)前置注意點(diǎn)它要求特征維度低于樣本數(shù)量否則協(xié)方差矩陣不可逆。這里用3個(gè)主成分加2個(gè)原始成分總共5維樣本約40個(gè)條件滿足。隨機(jī)森林的max_depth設(shè)成4是為了防止過擬合小樣本場(chǎng)景下如果深度太大訓(xùn)練集準(zhǔn)確率接近100%測(cè)試集卻只有60%一眼假。4.3 特征重要性與判別系數(shù)的雙驗(yàn)證模型不能只報(bào)準(zhǔn)確率還需要讓評(píng)審看懂“憑什么這么分類”。線性判別分析給出的系數(shù)直接反映了每個(gè)特征在判別函數(shù)中的權(quán)重隨機(jī)森林輸出的特征重要性則能交叉驗(yàn)證這個(gè)結(jié)論。兩條證據(jù)線越一致論文的說服力越強(qiáng)。# 輸出LDA判別系數(shù) print(LDA判別函數(shù)系數(shù):) print(lda.coef_) # 輸出隨機(jī)森林特征重要性 print(RF特征重要性:) importance rf.feature_importances_ for name, imp in zip(feature_cols, importance): print(f{name}: {imp:.4f})比較兩列結(jié)果時(shí)你會(huì)發(fā)現(xiàn)關(guān)鍵特征在兩個(gè)模型里都排在前兩位這就是模型互相印證。如果出現(xiàn)嚴(yán)重分歧比如LDA說A特征最重要隨機(jī)森林說B特征最重要就要檢查是不是存在共線性問題或者某個(gè)特征在訓(xùn)練集中噪聲過大。5. 避坑指南2022年C題代碼復(fù)現(xiàn)時(shí)最容易翻車的五個(gè)環(huán)節(jié)5.1 現(xiàn)象聚類結(jié)果每次運(yùn)行都不一樣隨機(jī)性亂跳第一次跑完K-means得到的聚類標(biāo)簽是A類10件、B類20件不修改任何參數(shù)重新跑一次結(jié)果變成A類8件、B類22件。原因是K-means的初始中心點(diǎn)是隨機(jī)選擇的不同初始值會(huì)收斂到不同局部最優(yōu)解。解決方法是給KMeans設(shè)置固定的random_state并增加n_init參數(shù)。我在所有K-means實(shí)驗(yàn)里統(tǒng)一用random_state42和n_init10確保結(jié)果可復(fù)現(xiàn)。更進(jìn)一步的做法是用K-means初始化算法scikit-learn里默認(rèn)就是K-means它能顯著減少初始點(diǎn)選擇的隨機(jī)性。此外把整個(gè)實(shí)驗(yàn)?zāi)_本固定一個(gè)全局隨機(jī)種子是個(gè)好習(xí)慣包括train_test_split和隨機(jī)森林的所有random_state。否則等到論文寫好了想重新跑一遍生成圖表結(jié)果數(shù)據(jù)對(duì)不上那才是真正的后悔藥都沒處買。5.2 現(xiàn)象特征標(biāo)準(zhǔn)化后PC1的符號(hào)和論文描述相反這個(gè)問題很案例。同一份數(shù)據(jù)第一次跑出PC1載荷是氧化硅為正、氧化鉛為負(fù)第二次預(yù)處理時(shí)不小心把某個(gè)常量偏移加上了跑出來符號(hào)完全反過來。PCA的符號(hào)方向本身是任意的翻轉(zhuǎn)以后方差不變聚類結(jié)果也不變但載荷矩陣的解釋就全反了。解決方法是固定PCA的隨機(jī)種子并且在預(yù)處理流程里鎖定所有操作順序。我習(xí)慣在清洗數(shù)據(jù)后的第一步就保存一份標(biāo)準(zhǔn)化特征矩陣的副本后續(xù)所有PCA和分析都從這個(gè)副本讀取避免來回改動(dòng)導(dǎo)致特征漂移。如果PCA載荷符號(hào)和預(yù)期不一致有經(jīng)驗(yàn)的開發(fā)者會(huì)去查輸入矩陣的列順序和標(biāo)準(zhǔn)化方式而不是急著改業(yè)務(wù)解釋。5.3 現(xiàn)象代碼跑通很順利論文里的圖表數(shù)字卻對(duì)不上這個(gè)坑最隱蔽也最致命。很多隊(duì)伍在最終提交前一周還在改代碼改一個(gè)聚類的參數(shù)結(jié)果圖和表是舊版本生成的正文里引用的均值統(tǒng)計(jì)來自更早的版本三處數(shù)據(jù)互相矛盾。競(jìng)賽論文評(píng)審最反感的就是內(nèi)部不一致一旦被發(fā)現(xiàn)甚至可能被認(rèn)為學(xué)術(shù)不端。我的做法是用一套版本管理習(xí)慣每次跑出關(guān)鍵結(jié)果立即把當(dāng)前代碼、輸出數(shù)據(jù)、圖表文件歸檔成一個(gè)編號(hào)目錄比如v01_processed、v02_cluster、v03_classifier。論文里引用的所有數(shù)字都必須能從對(duì)應(yīng)編號(hào)目錄里的腳本中完整復(fù)現(xiàn)。這個(gè)習(xí)慣救了我很多次因?yàn)榻_^程中一定會(huì)反復(fù)試錯(cuò)沒有歸檔就分不清哪個(gè)版本才是論文最終的依據(jù)。5.4 現(xiàn)象靈敏度分析被評(píng)委追問但自己根本沒做國(guó)賽論文的評(píng)委對(duì)靈敏度分析非??粗?。C題里有兩個(gè)典型的靈敏度問題一是聚類數(shù)K的選擇是否穩(wěn)健二是零值替換策略對(duì)分類結(jié)果的影響。很多隊(duì)伍的論文只給出一個(gè)K3的結(jié)果沒有任何對(duì)比結(jié)果在答辯環(huán)節(jié)被直接問住了。更穩(wěn)定的做法是把靈敏性分析做成表格列出K2、3、4時(shí)的輪廓系數(shù)和分類準(zhǔn)確率再列出不同零值替換比例最小值的一半、最小值、均值對(duì)分類準(zhǔn)確率的影響。這個(gè)表格不僅證明模型穩(wěn)定還能讓論文的研究深度明顯提升一個(gè)檔次。具體實(shí)現(xiàn)很簡(jiǎn)單先把做KMeans的代碼封裝成函數(shù)再循環(huán)不同參數(shù)跑一遍就行。def kmeans_with_k(X, k): km KMeans(n_clustersk, random_state42, n_init10) labels km.fit_predict(X) score silhouette_score(X, labels) return labels, score for k in [2, 3, 4]: labels, score kmeans_with_k(pca_result, k) print(fK{k}, 輪廓系數(shù){score:.4f})5.5 現(xiàn)象隊(duì)友改了代碼沒同步文檔和代碼版本不一致這個(gè)坑是團(tuán)隊(duì)寫作模式的典型問題。有的隊(duì)友負(fù)責(zé)代碼有的隊(duì)友負(fù)責(zé)寫論文兩邊沒有同步。最后交上去的論文里寫“聚類數(shù)為3輪廓系數(shù)為0.62”但提交的代碼默認(rèn)聚類數(shù)為4評(píng)委一驗(yàn)算就對(duì)不上。解決方法是提交前做一次“冷啟動(dòng)復(fù)現(xiàn)”把代碼和文檔放在同一目錄下讓一個(gè)沒有參與建模的人從頭到尾執(zhí)行一遍所有腳本看能否得到論文里的全部圖表和數(shù)字。這一步至少留半天時(shí)間。競(jìng)賽到最后拼的不是誰建模更花哨而是誰的交付物經(jīng)得起嚴(yán)謹(jǐn)推敲。我當(dāng)年見過太多隊(duì)伍代碼和文檔脫節(jié)最后只能連夜改論文這種教訓(xùn)極其深刻。6. 最后一個(gè)實(shí)戰(zhàn)技巧把模型結(jié)論變成能打動(dòng)評(píng)閱人的圖表與附錄整道題的建模階段完成后最容易被低估的是收尾環(huán)節(jié)——如何讓模型結(jié)論在論文里直觀地站住腳。評(píng)閱人看一篇競(jìng)賽論文的時(shí)間不會(huì)太長(zhǎng)圖表是否清晰、能否一眼看出類別邊界直接影響評(píng)分。我的習(xí)慣是至少做三張圖第一張是前兩個(gè)主成分的散點(diǎn)圖按聚類結(jié)果著色畫出每個(gè)簇的置信橢圓第二張是不同類別在關(guān)鍵成分上的箱線圖對(duì)比第三張是靈敏度分析的熱力圖橫軸是參數(shù)縱軸是準(zhǔn)確率顏色深淺代表波動(dòng)。第一張能證明聚類結(jié)構(gòu)真實(shí)存在第二張展示類別差異的顯著性第三張展示模型的穩(wěn)健性。關(guān)于提交的代碼文件我建議整理成兩個(gè)入口腳本一個(gè)01_prepare.py負(fù)責(zé)從原始數(shù)據(jù)跑到特征矩陣輸出中間文件一個(gè)02_model.py負(fù)責(zé)從特征矩陣跑到聚類、分類和全部圖表輸出論文用到的所有表格和圖片。這樣目錄結(jié)構(gòu)清晰任何一份代碼跑完都自動(dòng)生成一套完整交付物。我還會(huì)在每個(gè)入口腳本開頭加上一行簡(jiǎn)單的日志打印輸出運(yùn)行狀態(tài)。這看起來是工程習(xí)慣但在評(píng)閱人眼里這是文檔質(zhì)量的信號(hào)。最后我想說參加數(shù)學(xué)建模競(jìng)賽模型能力只是基礎(chǔ)真正的拉分點(diǎn)在于把代碼、數(shù)據(jù)和論文組織成一個(gè)嚴(yán)密自洽的系統(tǒng)。你在賽前多花三十分鐘整理變量命名和目錄結(jié)構(gòu)賽后就少通宵三小時(shí)。這道C題的完整方案從數(shù)據(jù)清洗到最終圖表所有細(xì)節(jié)都環(huán)環(huán)相扣。希望這篇復(fù)盤能幫你把同樣的路線在下一場(chǎng)競(jìng)賽里完整走一遍少踩一點(diǎn)我們當(dāng)年踩過的坑。本文還有配套的精品資源點(diǎn)擊獲取