拿到三個題以后,各自看了半個小時,和隊友開了會,因為我們三個都沒有偏物理專業的,所以A題就沒有考慮,B題C題感覺都可以處理,C題更加開放好寫,
整個題目解決比較順暢,大概花了2天,最后一天對論文進行了潤色,比賽完了負責國賽帶我們組的老師點評這個題有更好的解法,三個隊員都有一些問題,以后繼續努力吧
1
所屬類別
2021 年“華數杯”全國大學生數學建模競賽
參賽編號
本科組 CM 211297
基于 GA-BP 模型的客戶銷售方案
摘要
對電動汽車客戶挖掘和銷售決策研究是十分有意義的問題,這對于電動汽車行業
快速發展有著重要影響,公司不僅需要提高客戶對產品的滿意度,對性能做出改變,
更要對汽車的銷售,對客戶做出更加個性化的銷售方案,因此,本文的主要目標就是
對清洗后的資料進行全面分析,從中提煉出最影響客戶購買電動汽車的因素,并利用
這些因素建立一套合理有效的針對不同品牌電動汽車的客戶挖掘模型,
針對問題一,本文從 a1~a8 指標中找到了四組例外資料進行剔除,并借助箱型圖
法進行了檢驗,借助 B5,B6,B7 以及 B13,B15,B16,B17 之間的邏輯關系對例外資料進行
修改與剔除,得到正常資料后主要針對 a1~a8 指標進行均值、方差、偏度、峰度上的
描述性統計分析,資料處理的最終結果見附件附錄一整理.xlsx,
針對問題二,首先對第一問清洗后的客戶資料進行訓練,以 90%作為訓練集,10%
作為資料集進行求解,由于 BP 網路隨機生成初始引數易造成區域最優和收斂速度慢,
而后使用遺傳演算法對其進行優化,最終歸一化得到該指標的貢獻率,分析即可得出各
因素的影響程度高低,對不同品牌電動汽車的銷售影響因素最大的是 a1、B1、B3、B5 和 B9 項,本文將權值貢獻率低于 2%的因素劃分為影響最小的因素,有 a2、a4、a7、 B4、B6、B11、B14、B15 八項因素,
針對問題三,通過主成分分析法和 GA-BP 神經網路建立客戶挖掘模型,利用主成
分分析法對第二問結果中大于 2%的因素集進行降維處理,得到累計貢獻率達 85%的客
戶評分模型,基于問題一中篩選后的資料進行訓練,網路初始化后使用遺傳演算法優化
神經網路預測,輸入需要預測的 15 條資料后得到各位顧客的購買意愿,將 15 名目標
客戶購買電動車的可能性填入表格,對模型的優良性進行分析,
針對問題四,本文利用第三問的主成分分析法所得的評分模型對附件三 15 名客戶
進行評分,基于客戶 ABC 分類管理法篩選出三名未購車的客戶,基于 GA-BP 神經網路
的潛在客戶挖掘模型進行控制變數法分析,將測驗集帶入模型進行預測識別,得到各
指標的滿意度增長表,見附錄滿意度增長表.xlsx,用效益難度比來刻畫銷售者應當在
哪方面提升服務力度,將通過 BP 神經網路得到的結果利用 Matlab 繪圖工具繪制折線
圖,最終得到在短時間內,提升與 a1 指標相關的服務力度將獲得最好的效果,
針對問題五,需要基于上述四問的分析結果和客戶生命周期理論給出銷售策略建
議,根據問題四應該根據電池技術性能等方面對客戶進行銷售,結合問題一的描述性
分析與客戶挖掘模型得出,針對品牌 1,品牌 2 可以走大眾路線,在價格,性價比等方
面可以出臺優惠政策;針對品牌 3,則可以走小眾化路線,一是可以調查獲取資料利用
客戶挖掘模型,二是可以在宣傳時著重凸顯品牌的特點,具體的銷售策略見正文,
最后,我們分析了模型的優缺點,在對缺點提出相應的改進方式的基礎之上,將
該模型推廣到其他領域,
關鍵詞:描述性統計 資料清洗 GA-BP 神經網路 客戶 ABC 分類管理 主成分分析
2
- 問題重述 1.1 問題背景
近十幾年來,中國的汽車競爭激烈,客戶需求快速變化,整車廠必須迅速準確地
認識到自身發展所需的必要條件,才能在高速前進的市場中保持蓬勃發展[1], 而新能源汽車產業是戰略性新興產業,大力發展以電動汽車為代表的新能源汽車
是解決能源環境問題的有效途徑,然而,電動汽車相較于傳統汽車,消費者在一些領
域,如電池問題,也存在著一些疑惑,
本文需要根據題目給出的各品牌各項購買意愿來制定出各品牌相應的購買策略,
如電池性能、舒適度、經濟性、安全性、動力性等等,同時還需要結合目標客戶體驗
者個人特征的資訊建立不同品牌電動汽車的客戶挖掘模型,根據模型判斷出目標客戶
購買電動車的可能性與銷售策略,并對銷售部門給出銷售策略建議,
1.2 附件分析
本題一共給出了三個附件資料,本文將對這些附件進行初步的解讀,
附件一:給出了 1964 位目標客戶的體驗資料,由三部分組成,第一部分是對各品
牌的各項指標的滿意度的打分,包括電池技術性能(電池耐用和充電方便)滿意度得
分(滿分 100 分,下同)a1、舒適性(環保與空間座椅)整體表現滿意度得分 a2、經
濟性(耗能與保值率)整體滿意度得分 a3、安全性表現(剎車和行車視野)整體滿意
度得分 a4、動力性表現(爬坡和加速)整體滿意度得分 a5、駕駛操控性表現(轉彎和
高速的穩定性)整體滿意度得分 a6、外觀內飾整體表現滿意度得分 a7、配置與質量品
質整體滿意度得分 a8,第二部分是目標客戶個人特征統計資料,第三部分是各企業的
購買意愿統計,
附件二:給出了調查者針對 1964 位目標客戶所做的個人特征調查表,戶口、所在
地、駕齡、家庭人數、家庭收入豐方面統計客戶資料,
附件三:給出了待判定的資料,問題三需要我們對附件 3 中 15 名目標客戶購買電
動車的可能性做出判斷,其中 B7 列即客戶孩子數部分未知,需要對此資料分析,
1.3 問題要求
現某汽車公司最新推出三款品牌電動汽車,包含合資品牌、自主品牌和新勢力品
牌,需要根據消費者對電動汽車的購買意愿制定相應的銷售策略,公司統計來了 1964
位目標客戶體驗三種品牌汽車后給出的滿意度得分,此外,題目還提供了目標客戶體
驗個人特征的資訊,
基于上述背景和附件資訊我們需要建立數學模型解決以下問題: (1)從 1964 位目標顧客的滿意度與特征資訊資料統計中提取資訊,進行資料清
洗,指出例外值和資料以及處理方法,并且對資料進行描述性統計分析,分析目標客
戶對不同品牌汽車滿意度的差異比較, (2)在上述給出的影響客戶購買體驗的電動車的因素很多,分析電動汽車本身的
因素和目標客戶個人特征的因素判斷主要影響不同品牌汽車的銷售的影響因素,
(3)基于(1)(2)問的資料分析后的結果建立不同品牌電動汽車的客戶挖掘模
型并要求模型進行分析,同時分析 15 名目標客戶對電動汽車的購買可能性,
(4)綜合考慮品牌滿意度的提高和服務難度的提高來加大銷售力度,基于前面的
研究成果和提高滿意度的思路,在挑選的 1 名沒有購買電動汽車的客戶,給出銷售策
略,
(5)基于上述研究結果,向銷售部分提出提高銷售的銷售策劃建議, - 問題分析
3
本文要解決的是基于三種不同品牌的銷售策略問題,無論是合資品牌、自主品牌
還是新勢力品牌,針對每一品牌,最終都要給出其最合適的銷售策略,探究哪些因素可
能會對不同品牌電動汽車的銷售有影響并且建立客戶挖掘模型,問題一是先要對資料
進行清洗與分析,處理好例外值和缺失值并對目標客戶對于不同品牌汽車滿意度的比
較分析;而問題二是針對影響銷售因素的分析,本文采用 BP 神經網路方法對經過問題
一處理后的資料進行分析,BP 網路求解的具體演算法思路如下:
圖 1 問題二的解決流程圖
問題三是在前兩問的基礎上建立客戶挖掘模型并用該模型判斷客戶購買電動車的
可能性,針對問題四基于神經網路建立潛在客戶挖掘模型,在該模型程序中,需確定
學習樣本集,對預測模型進行訓練,確定網路引數,進行預測仿真,檢驗網路;還需測
試樣本集,分別進行預測潛在購機人群的綜合屬性,問題五則是針對上述研究結果對
相關部門提出銷售建議,五個問題是一脈相承,層層遞進的, - 模型假設與符號系統
3.1 模型的假設 (1)未婚情況下不會孕育小孩
(2)假設客戶在填寫調研表時,B7 問題回答不準確以致出現誤差資料的可能性
遠大于 B6,大于 B5 (3)與父母同住情況時家中的人口數包括父親、母親其中一位或兩位同居以及與
兄弟姐妹同住的情況
(4)各品牌競爭相互獨立
(5)營銷者在短時間內只能針對 a1 到 a8 中的某一個指標最多提升 5%的服務滿
意度
(6)服務難度和滿意度的提升只需考慮為整數的情況,即 1%,2%,3%,4%,5%
3.2 符號系統
本文部分符號說明如下:
符號 意義
因素集 x 矩陣每一列的均值
? j
因素集 x 矩陣每一列的標準差
購買電動汽車的客戶數
W 初始權值
第 i 項指標提升 n%的效益
Din
第 i 項指標提升 n%的難度
Pin
第 i 項指標提升 n%后客戶購車概率
? j ?Ein
4 - 問題一資料處理與分析
4.1 問題一資料的清洗 (1)對 a1~a8 進行例外資料篩選
觀察表格資料,發現 a1,a3,a5,a7 列存在例外資料,本文使用 excel 篩選出
a1,a3,a5 超過 100 的資料,篩選出 a7 中過小的資料,將其剔除,
(2)a 項資料使用箱圖法篩選資料
使用 matlab 箱圖法尋找差距過大的資料,驗證 excel 分析正確,Matlab 所得結果
如下圖(圖中已經標注出了例外的四個資料):
圖 2 箱圖法篩選 a 項例外資料結果
結果圖中展示橫坐標為 a1~a8 項,縱坐標為附件 1 中資料,可以看出 a1,a3,
a5,a7 項存在明顯的例外資料,
(3)B 項資料的篩選
針對 B1~B17 組資料,本文通過 B5,B6,B7 的關系以及對 B13,B15,B16,B17 的邏 輯關系進行分析篩選并修改出例外資料,
根據附件二可以得知,B5 等項代表的含義如下表:
表 1:B 項主要代碼所表示含義
指標代碼 含義
B5 家庭人口數
B6 婚姻家庭情況代號
B7 家庭孩子個數
B13 家庭年收入
B15 家庭可支配年收入
B16 全年房貸支出占比
B17 全年車貸支出占比
其中 B6 值為代碼,有以下含義:1 表示“未婚,單獨居住”,2 表示“未婚,與
父母同住”,3 表示“已婚/同居無子女(兩人世界)”,4 表示“已婚/同居無子女
(與父母同住)”,5 表示“已婚,有小孩,不與父母同住”,6 表示“已婚,有小
孩,與父母同住”,7 表示“離異/喪偶”,8 表示“其他”,
5
易知正常資料應該滿足:
由于題目中并未給出對年收入更為詳細的相關資料,所以本文直接利用 matlab 將
不滿足上述不等式的資料剔除,
B5,B6,B7 三組資料應滿足某種數學關系,基于假設 1,假設 2,本文利用 matlab
將不缺失的 B7 資料作為準確資料分類討論,如下: (1)當 B7=1 時,應用 EXCEL 進行資料的篩選可以得到 B6 可取 1,2,3,4,5,6, 若 B6=1,2,3,4 即分別代表“未婚,單獨居住”,“未婚,與父母居住”,“已婚/
同居無子女(兩人世界)”“已婚/無子女(與父母居住)”,證明是不可能有小孩
的,所以不成立,此時,本文根據 B6,B7 的約束對表中資料進行修改,
若 B6=5,即代表已婚,有小孩,不與父母同住,則可知 B5 為 3,即家庭 3 口
人,據此再次對附件 1 中資料進行篩選,
若 B6=6,即代表已婚,有小孩,與父母同住,則 B5(家庭人口數)可以為
4,5,6,7,8,9,由附件 1 中資料可知當 B7 為 1,B6 為 6 時表格中 B5 只有 3,4,5,6 各
值,可以得知 3 為例外值,本文把 B5 為 3 的資料改為 5,即家庭情況為一對夫妻孕育
有一個孩子,孩子爺爺奶奶一起居住,
(2)當 B7=2 時,應用 EXCEL 進行資料的篩選可以得到 B6 可取 1,2,3, 5,6, 若 B6=1,2,3 即分別代表“未婚,單獨居住”,“未婚,與父母居住”,“已婚/
同居無子女(兩人世界)”,證明是不可能有小孩的,所以不成立,此時,本文根據
B6,B7 的約束對表中資料進行修改,
若 B6=5,即代表已婚,有小孩,不與父母同住,則可知 B5 為 4,即家庭 4 口
人,據此再次對附件 1 中資料進行篩選,
若 B6=6,即代表已婚,有小孩,與父母同住,則 B5(家庭人口數)可以為
5,6,7,8,9,10,由附件 1 中資料可知當 B7 為 2,B6 為 6 時表格中 B5 只有 4,5,6 各
值,可以得知例外值,本文把 B5 為 4 的資料改為 6,即家庭情況為一對夫妻孕育有兩
個孩子,孩子爺爺奶奶一起居住,據此修改附件,
(3)當 B7=3 時,應用 EXCEL 進行資料的篩選 B6 僅可取 5 或 6 且僅只有 6 個
資料,
若 B6=5,即分別代表已婚,有小孩,不與父母同住,所以家庭人數(B5)只能
為 5,此時,本文根據 B6,B7 的約束對表中資料進行修改,
若 B6=6,即代表已婚,有小孩,與父母同住,附件 1 中 2 個資料均合理,此情況
沒有例外值, (4)B7 值為未知時,根據附件 1 可知此時 B6 有近 99%的資料為未婚或沒有子
女的情況,由此可知缺失資料應該全為 0,此時將 B6,B7 作為標準資料填入表格,根
據約束條件來調整 B5 的值,修改后的表格程式太長不做贅述,詳見支撐檔案,
4.2 資料描述性統計分析
本文主要針對滿意度進行描述性分析,將產品 1,2,3 獨立分析,分別求解品牌 1,
品牌 2,品牌 3 以及 3 種綜合的 a1~a8 項資料分析,本文主要從均值、方差、偏度、
峰度四個方面進行描述性統計分析,
4.2.1 均值的分析與評價
均值是表示一組資料集中趨勢的量數,它是反映資料集中趨勢的一項指標,本文
對 a 項滿意度使用 matlab 進行均值處理后得到均值,通過 excel 可得均值如下圖:
16 17 13 15+ 13
100
B B B B B ?
? ?
圖 3a 項各類滿意度均值統計
由上圖各均值具體資料可知 3 種品牌綜合得分為 77.5 左右,以及各項得分差距并
不大,同時由圖可知 a3 與 a5 的得分偏低,a3 反映了經濟性(耗能與保值率)整體滿
意度得分,a5 為動力性表現(爬坡和加速)整體滿意度得分,人們對電動汽車的經濟
性與動力性表現滿意度不是很高,為提高銷售策略,可以從這兩方面入手,
4.2.2 方差分析與評價
方差可以衡量資料的離散程度,也可用來度量隨機變數和其數學期望(即均值)之
間的偏離程度,本文對 a 項滿意度使用 matlab 進行均值處理后得到如下方差,通過 excel
可得下圖:
圖 4 a 項滿意度的各品牌方差值
由圖可知,3 種品牌中品牌 3 的方差最大,說明 1964 位體驗者對品牌 3 的評價褒貶
不一,但是 3 種品牌中購買意愿的均值品牌 3 最大(為 9.4%),這說明品牌 3 的受眾群
體比較專一,若可以為品牌建立良好的客戶挖掘模型,則品牌 3 可為公司帶來巨大的利
潤收益,
4.2.3 偏度的分析與評價
偏度這一指標,又稱偏斜系數、偏態系數,是用來幫助判斷資料序列的分布規律性
的指標,在偏度系數的絕對值較大的時候,最有可能的含義是“離群”資料離群的程度
很高(很大或很小),亦即分布曲線某側的拖尾很長,本文通過 matlab 得到滿意度的各項
資料的偏度,并繪制如下表格
6
圖 5 各品牌滿意度的偏度
由圖可知 3 種品牌及其總和的偏度分布在 0~-0.7 之間,品牌 1,2 的偏度較為集中,
品牌 3 的偏度較為分散,偏度的分布說明還存在相當多的人對電動汽車存在顧慮,公司
在挖掘客戶的同時也應當著力消除人們的顧慮,
4.2.4 峰度的分析與評價
與偏度一樣,峰度也是一個用于評價資料系列分布特征的指標,峰度越大,說明該
資料系列中的極端值越多,在正態分布情況下,峰度系數值是 3,峰度的絕對值越大,
說明資料越陡峭,峰度的絕對值大于 3,意味著資料嚴重不正態,對附件 1 修改后的數
據進行分析,通過 matlab 可得到個品牌的峰度大概情況如下圖
圖 6 各品牌滿意度的峰度
峰度的分布約有 84.3%的資料分布在 3.5~4 之間,比較接近 3,即偏離正態分布的
程度不是很大,也就是說明了資料處理的有效性, - 問題二的分析與求解
5.1 問題二的分析思路
問題二基于第一問清洗后的附件 1 給出的客戶資料進行訓練,隨機選取資料,以
90%作為訓練集,10%作為資料集進行求解,使用 BP 神經網路對匯入的資料進行訓
練,最終絕對值后歸一化就是該指標的貢獻率,分析即可得出各因素的影響程度高
低,
使用 MIV 演算法即可計算各指標影響占比,BP 網路隨機生成初始引數易造成區域最
優和收斂速度慢,故利用遺傳演算法對其進行優化,
5.2 BP 神經網路的建立與求解
5.2.1 求解 BP 神經網路基本原理 7
8
本文采用的 BP 神經網路由三層組成: 輸入層,隱含層與輸出層,顧名思義:輸入
單元接受外部給的信號與資料;輸出單元實作系統處理結果的輸出;隱含單元處在輸入
和輸出單元之間,從網路系統外部是無法觀測到隱含單元的結構的,如下圖, 圖 7 BP 人工神經網路構造示意圖
除了上述三個處理資訊的單元之外,神經元間的連接強度大小由權值等引數來決定,
在處理時需要先讓每個神經元代表對資料進行一次處理: 圖 8 神經元處理資料示意圖
每個隱含層和輸出層神經元輸出與輸入的函式關系為:
其中 表示神經元 i 與神經元 j 之間連接的權重, 代表神經元 j 的輸出, sigmoid
是一個特殊的函式用于將任意實數映射到(0,1)區間,
本文用一個完成訓練的神經網路處理回歸問題,每個樣本擁有 n 個輸入,相應地,
神經網路擁有 n 個輸入神經元和 1 個輸出神經元,
接著將 n 個特征依次送入輸入神經元, 隱含層神經元獲得輸入層的輸出并計算自
己輸出值, 輸出層的神經元根據隱含層輸出計算出回歸值,
然后開始訓練神經網路,首先我們隨機初始化連接權重 ,對某一訓練樣本進行一
次前饋程序得到各神經元的輸出,
首先計算輸出層的誤差: Wij Oj Wij l j 1
( )
1 l I O sigmoid I
e?
? ?
?
9
其中 代表神經元 j 的誤差, 表示神經元 j 的輸出, 表示當前訓練樣本的參考
輸出, sigmod′(x)是上文 sigmod 函式的一階導數,
計算隱含層誤差:
隱含層輸出不存在參考值, 使用下一層誤差的加權和代替 ,計算完誤差后
就可以更新 和? j :
其中λ是一個稱為學習率的引數,一般在(0,0.1)區間上取值,每一個訓練樣本都
會更新一次整個網路的引數,再額外設定訓練終止的條件,
最簡單的訓練終止條件為設定最大迭代次數,如將資料集迭代 1000 次后終止訓練,
本文此題解答時迭代了八百多次,準確度較高,
單純的設定最大迭代次數不能保證訓練結果的精確度,更好的辦法是使用損失函式
作為終止訓練的依據,損失函式可以選用輸出層各節點的方差:
為了避免神經網路進行無意義的迭代,我們通常在訓練資料集中抽出一部分用作校
驗,當預測誤差高于閾值時提前終止訓練,
5.2.2 BP 神經網路的實作
對于 BP 神經網路的構建,本文在對 ANN 進行分析是從其三要素入手,即從網路拓
撲結構、傳遞函式、學習演算法三方面對此題開始研究,通過調整網路的權重和偏置這
兩個引數對 BP 網路進行訓練分解,即 BP 神經網路的訓練程序分兩部分:
(1)前向傳輸,逐層波浪式的傳遞輸出值
正向傳播時,輸入樣本從輸入層傳入,經各隱層逐層處理后,傳向輸出層,若輸出
層的實際輸出與期望的輸出不符,則轉入誤差的反向傳播階段,
(2)逆向反饋,反向逐層調整權重和偏置
反向傳播時,將輸出以某種形式通過隱層向輸入層逐層反傳,并將誤差分攤給各層
的所有單元,從而獲得各層單元的誤差信號,此誤差信號即作為修正各單元權值的依
據,
至此,通過上述方法完成了一次神經網路的訓練程序,通過不斷的使用所有資料
記錄進行訓練,從而得到一個分類模型,每一輪訓練都使用資料集的所有記錄,遇見
一下兩種條件停止:設定最大迭代次數,比如使用資料集迭代 100 次后停止訓練,或
者計算訓練集在網路上的預測準確率,達到一定門限值后停止訓練, Ej Oj Tj
j j - (T O) Wj
10
圖 9 BP 演算法的信號流向圖
為了提高網路訓練的精度,本文采用了一個隱含層,而增加其神經元個數的方法
來獲得,這在結構實作上要比增加網路層數簡單得多,一般而言,用精度和訓練網路
的時間來恒量一個神經網路設計的好壞:
(1)神經元數太少時,網路不能很好的學習,訓練迭代的次數也比較多,訓練精
度也不高,
(2)神經元數太多時,網路的功能越強大,精確度也更高,訓練迭代的次數也
大,可能會出現過擬合現象,
由此,神經網路隱層神經元個數的選取原則是:在能夠解決問題的前提下,再加
上一兩個神經元,以加快誤差下降速度即可,
5.3 GA-BP 神經網路模型
傳統的 BP 具有容易陷入區域極小值、學習速度慢、對初始值要求嚴格等缺點,G
A演算法是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化程序的計算模
型,是一種通過模擬自然進化程序搜索最優解的方法[2],本文將遺傳演算法應用于 BP
中,利用遺傳演算法來全域尋優 BP 網路的初始權值與閾值,通過優化神經網路初始權值
和閾值提高學習速度,避免陷入區域極小值,提高模型的速度與準確性,GA-BP 客戶預
測模型實施步驟如下:
1)確定 GA-BP 各層神經元個數,在 GA-BP 模型的輸入中共 25 個因素,隱含層選
一層,構建網路結構,進行訓練集和測驗集的劃分,
2)歸一化處理,由于不同的輸入引數具有不同的量綱,不同的樣本資料評價標準
不一樣,因此需要對其量綱化統一標準,歸一化處理也能避免吞噬小值和加速網路收
斂,
3)種群初始化并計算個體適應度,網路的權值和閾值為 GA 中要優化的引數,由
于歸一化之后的資料都是介于 -1到 1 之間的小數,如果采用二進制編碼容易導致溢
出等問題,故本文采用實數編碼,通過編碼操作,先隨機生成一定數量的種群代表
GA-BP 模型中權值和閾值的集合[4], 4)迭代求解最佳權值和閾值,迭代即進化,上一代進化到下一代產生新的種群,
計算新種群的適應度,并記錄好當前代的最佳染色體個體,當演算法終止時,可以獲得
全域最優解,此時再通過解碼操作得到對應的權值和閾值,
5)神經網路模型訓練,利用上面把最優初始閾值權值賦予網路預測,BP 網路訓練
后馬上對其預測,最后對 GA 和 BP 網路預測結果分析,
11
5.4 模型結果分析
經過八百多次迭代后得到最佳的結果,下面對相關結果進行分析,
下面左圖通過均方差來衡量網路的性能,可以看出迭代次數越多性能越好,右圖
為內容為記錄 Gradient 和 Validation Checks,訓練狀態的跟蹤,
圖 10 左圖為 Performance 結果,右圖為 Training tate 結果
下圖左圖通過繪制回歸線來測量神經網路對應資料的擬合程度,可以看出擬合程
度相對較高,右圖為平均適應度,適應度函式的選取會直接影響到本文遺傳演算法的收
斂速度以及能否找到最優解,因為遺傳演算法在進化搜索中基本不利用外部資訊,僅以
適應度函式為依據,利用種群每個個體的適應度來進行搜索,
圖 11 擬合度(左)和適應度(右)
基于遺傳演算法“優勝劣汰”的特點,遺傳演算法不需要適應度函式滿足連續可微等
條件,唯一要求是針對輸入可計算出能加以比較的非負結果,目標函式總取非負值,
并且是以求函式最大值為優化目標,故可直接利用目標函式值作為個體的適應度, 5.4.2 結果分析
通過上述模型可得到三種不同品牌的權重貢獻率,如下圖所示:
圖 12 品牌 1(左)、品牌 2(中)、品牌 3(右)的權重貢獻率
從圖中可以發現三種品牌的權重貢獻率大致相同,數值上僅有細微差別,例如在
a8 指標下,對于品牌 1 的權值貢獻率為 5.418%,品牌 2 的權值貢獻率為 5.421%,而
品牌 3 的權值貢獻率為 5.42%, 對各品牌的銷售不同的影響因素可以發現,在權重貢獻率大于 2%以上的因素較為
明顯,所以取 2%以上的權重為主要影響因素,即 a1, a3, a5, a6, a8, B1, B2, B3,
B5,B7,B8,B9,B10,B12,B13, B16,B17,以上因素會對不同品牌電動汽車的銷售有影
響,
5.5 模型的優化分析對比 BP 神經網路通過梯度下降法訓練網路,而其初始引數隨機生成,若選擇不當,會
造成區域最優和收斂速度慢等問題,故采用遺傳演算法[5]
,對其進行優化,本文的預測都
是使用的 GA-BP 模型,
利用遺傳演算法優化 BP 神經網路不再簡單的隨機生成初始引數,而是對種群進行多
次迭代初始化,淘汰較差的引數,最終產生合適的網路初始引數,
使用 GA 優化,主要是對網路進化引數部分調整,優化 BP 神經網路引數的設定,
這樣會使預測結果更為準確,本文對純 BP 模型與 GA-BP 模型進行分析后得到其誤差對
比圖如下:
圖 13 純 BP 模型與 GA-BP 模型的誤差對比
此處由圖可以看出,使用遺傳演算法后的 BP 神經網路模型的誤差更小,數值更集中
了,本例表明,用遺傳演算法優化 BP 神經網路可加快訓練收斂速度,提升校準結果精
度,
6. 問題三的建模與求解 6.1 主成分分析模型
6.1.1 模型的建立
當研究的問題涉及到多個具有錯綜復雜關系的變數時,為簡化問題解答,常突出
問題的主要矛盾,抓住主要變數,可使用主成分分析的方法,主成分分析法即是通過
對某事物樣本的表象分析,實作揭露使得該事物具有這種表象的主成分,從而實作降
維,簡化分析[6],
針對第二問所得出的柱狀圖,我們對貢獻率再 2%以上的因素進行篩選,得到第三
問的初始因素集:1,3,5,6,8,9,10,11,13,15,16,17,18,20,21,24,
12
13
25,
運用主成分分析法對客戶能對公司帶來利益的可能性進行分析,從而建立客戶挖
掘模型
6.1.2 模型的求解 (1)建立因素集
上述可知有 17 個指標,用字母 p 表示,用 表示購買電動汽車的客戶數
由于不同指標的量綱有所不同,為避免量綱錯誤對客戶挖掘模型產生影響,接下
來需要將 x 標準化處理,
, ;
其中 為因素集 x 矩陣每一列的均值, 為因素集 x 矩陣每一列的標準差, (2)求解相關系數矩陣
構造相關矩陣求解系數矩陣,如下:
(3)求解 R 的特征值及其對應的特征向量
假設 R 矩陣的特征值為: ,特征向量為:
所以由特征向量構成了 17 個新指標:
1 11 1 21 2 171 17
2 12 1 22 2 172 17
17 117 1 217 2 1717 17
y …
y …
…
y …
u x u x u x
u x u x u x
u x u x u x
? ? ? ?
? ? ? ?
? ? ? ?
通過計算累積貢獻率尋找累積貢獻率達到 85%時的指標 ,選取 為主成
分,求:
q1 q 17
1
( )=
k k k k ? ? ? ???? 累積貢獻率
計算附件 3 中的綜合得分
?
11 12 1
1 2
…
… … … …
…
pp
x x x
x
x x x ? ? ?
? ?
?
? ?
? ?
? ? ? ?
ij
ij j
j x x ???
j 1,2 .
1
,. .,17
2 i ? ?? ? ?
? ?,, , ? j ? j =
ij p p R ? (r ) 1
r ,
1
ki kj
ij
k
a a
n ? ? ? ? ?
i, 1, 2,…,17 j ?
1 2 3 4 17 , , , ,…, m m m m m yq
1 11 21 31, 41 171
2 12 22 32, 42 172
17 117 217 317, 417 1717
u [ , , ,…, ]
u [ , , ,…, ]
…
u [ , , ,…, ]
u u u u u
u u u u u
u u u u u
???
1, 2 q ,…, y y y
14
選取每個品牌得分最高的兩名客戶為最可能購車的客戶,帶入資料即可利用
matlab 編程求解各成分貢獻值,
6.2 基于 BP 神經網路的潛在客戶挖掘模型
由于影響購買電動汽車的因素很多,且影響因素與購買電動車之間通常存在復雜的
非線性關系,所以無法直接求得購買電動汽車與影響因素的函式關系,也就無法通過一
般方法預測函式關系直接得出購買電動汽車的人群特征情況,
所以本文采用誤差反傳演算法或其變化形式的網路模型即 BP 網路,在第二問模型上
進行優化,利用第一問清洗好的資料,處理后的資料劃分明顯,第二問最后得到的影
響顯著的指標也比較符合實際等等,直接利用對附件 3 通過機器學習訓練并識別了,
同時因為品牌 1、品牌 2、品牌 3 是單獨的,所以將 3 個分別訓練,演算法流程圖如下:
圖 14 問題 3 BP 分類模型流程圖
6.2.1 樣本的選擇與預處理
對洗掉和修改例外值后的資料進行訓練,之前處理后的資料(附件 1 中清洗后的
客戶的各項指標和滿意度)等進行劃分,為了更好的進行訓練和測驗,獲得輸入和輸
出變數,在試驗前將試驗訓練樣本集和測驗樣本集進行資料歸一化處理,
6.2.2 網路初始化
根據問題二所建立的的 GA-BP 神經網路模型求解該問,輸入層為 25 個節對應 625
影響因素,即 a1,…,a8 各項滿意度指標和 b1,…,b17 客戶資訊指標;輸出層為客戶的
購買意愿,隱層設計一般為 4-16 個神經元節點,若神經元個數過多,會加大計算量,
導致過度擬合;反之若隱層神經元個數過少,會很大程度上影響該性能,所以本題隱
層設為 8 個神經元節點,
6.2.3 使用遺傳演算法優化網路預測
帶入第二問所建立的 GA-BP 模型進行預測,通過遺傳演算法優化網路預測后可以得
到訓練后的網路,即輸入 3 題所需要預測的 15 條資料,得到每位客戶的購買意愿率,
對 3 個品牌進行排序,得到每個品牌中意愿率最大的 2 人,本文將這 6 人作為購買電
動車的客戶,
6.3 結果分析 表 2: 15 位客戶的購買意愿預估值
客戶編號 品牌編號 是否購買
1 1 1
2 1 1
3 1 0
4 1 0
5 1 0
6 2 1
7 2 1
8 2 0
9 2 0 q
15
1 1
= ( ) j j j k k
Z y
? ? ? ? ? ?
15
10 2 0
11 3 1
12 3 1
13 3 0
14 3 0
15 3 0
6.4 模型優良性的評價
建立客戶挖掘模型,即公司需要針對客戶推出更個性化的銷售方案,著名學者李
小慶(2018)在金融行業中指出,通過對客戶行為的大資料分析,向客戶推薦更多定制
化的金融產品以及服務渠道, 體現個性化和差異化服務,從而增強客戶的忠誠度和粘
性,于苧(2018)在酒店行業中指出,個性化的服務可以從兩個層面理解:(1)在企
業制定的服務標準化的基礎上,依照客戶自身的需求,為客戶提供個性化的服務,達
到使客戶滿意的結果,從而增加客戶的粘性,(2)公司在為客戶提供個性化服務的同
時,也在不斷改進公司的流程和服務[3],而本文針對問題三就是根據客戶獨立的個體進
行個性化的分析,
而本文采用主成分分析可以排除主觀因素的干擾,得到客觀的結果,而且可以將
附件中相關性強的指標如 B13,B16,B17 等通過主成分分析降維變為相互獨立的因素,
累計貢獻率的臨界值取得為 85%,可以反映原因素集 85%以上的資訊,以品牌三為例,
第一主成分中第 11 項指標所占比重最大,說明其在所有因素中的影響最大,
主成分分析后可以發現,以品牌 3 為例,第一主成分中第十一項指標的系數最
大,說明第十一項指標對顧客評分影響最大,與第二問所的品牌三的貢獻率柱狀圖相
照應,說明了模型的準確性,
7. 問題四的分析與求解 7.1 問題分析
題目中要求通過提高服務力度來提升客戶滿意度增加電動車銷量,而在短的時間
內提高 a1-a8 五個百分點的滿意度是有可能的,但服務難度與提高的滿意度百分點是
成正比的,即提高體驗滿意度 5%的服務難度是提高體驗滿意度 1%服務難度的 5 倍,即
是說短時間內最多能對 a1-a8 中某一項提升 5%,
首先通過客戶 ABC 分類管理辦法選出沒有購買電動汽車的客戶,基于上述 GA-BP
模型的研究,針對 a1~a8 中第二問求出的顯著影響的指標,進行控制變數法分析,可
按 10%、20%、等提高指標值,將其作為測驗集帶入模型進行預測識別,本問的 GA-BP
模型演算法流程圖如下:
圖 15 問題四 GA-BP 預測演算法流程圖
7.2 基于客戶 ABC 分類管理辦法篩選目標客戶
客戶 ABC 分類法最早由意大利經濟學家維爾弗雷多帕累創造,客戶 ABC 分類法源自
于帕累托法則,區別在于法則強調關鍵,而分類法強調主要和次要之間的區別,并將客
戶分為 A 類、B 類和 C 類[3],
帕累托原理是一種定量的研究方法,通常二八定律討論的是金字塔頂端的 20%的客
16
戶,而不是數量最多的 80%位于底端的客戶,A 類客戶只有 20%,但是給企業貢獻了 80%
的收益,不同級別的客戶給公司帶來的貢獻也不一樣,企業根據客戶的價值,進行差異
化服務策略,合理分配資源,提高企業的競爭力,A、B、C 三類客戶分別為關鍵客戶,
約占 10%-20%;重要客戶,約占 15%-25%;低價值客戶,約占 60-75%,對于企業來說,找
出占比 20%的關鍵客戶,提供更優質的服務,將會帶來業績上的提升和更好的發展[3],
客戶 ABC 分類管理辦法是將主要與次要區別開,將客戶分為 A 類,B 類和 C 類,二
八定律則是說明公司 80%的利潤由 20%的 A 類客戶提供,而分類的標準則是根據客戶的
價值,此處可以用主成分分析的得分來衡量,下表為根據評分選取的客戶資訊(紅色
為選取客戶): 表 4:利用主成分分析法篩選的客戶
7.2 依據控制變數法對資料進行 BP 演算法處理 (1)對資料進行訓練得客戶初始購買意愿
基于上述建立的 GA-BP 神經網路模型求解該問,由于 a1,…,a8 指標與購買意愿
有直接關聯,所以只需對該問將輸入層設定為 8 個節,即 a1,…,a8 各項滿意度指標;
隱層設計一般為 4 個神經元節點,于是本文對第 1 問清洗后的資料 a1-a8 列所有資料
進行訓練得到訓練網,帶入上述主成分分析得到的 3 種品牌選擇的 3 位客戶(編號分
別為 5,10,15)對電動汽車的滿意度指標相關資料預測出 3 位客戶當前的購買意愿,將
此資料作為初始意愿,
(2)控制變數法分析各項指標
控制變數是在蒙特卡洛方法中用于減少方差的一種技術方法,本題使用該方法
以通過對已知量的了解來減少對未知量估計的誤差,
首先控制 a2,…,a8 各項指標資料不變,即僅提高 a1 項電池技術性能(電池耐
用和充電方便)滿意度得分,3 位客戶 a1 項滿意度均增加 1%接得到預測當前購買意
愿,記錄;若 3 位客戶 a1 項滿意度均增加 2%接得到預測當前購買意愿,記錄;依次
遞增,直到 a1 項滿意度增加 5%, 表 5:第一輪計算后客戶購買意愿度預測表
客戶編號 初始 a1 增長 1% 2% 3% 4% 5%
5 0.2118 0.2214 0.2316 0.2423 0.2537 0.2657
10 -0.0257 -0.0203 -0.015 -0.0097 -0.0047 0.0002
15 0.05 0.0662 0.0833 0.1013 0.12 0.1391
接著將 a1 項資料復原,控制 a1,a3,…,a8 保持不變,將 3 位客戶 a2 項滿意度
均增加 1%接得到預測當前購買意愿,記錄;同理遞推,直至 3 位客戶滿意度均增加
5%接記錄得到預測當前購買意愿,
最后得到增長率和購買意愿的數學關系式,選取短時間內提升最高的因素,最
后按該項因素提高購買意愿的方向提升,
17
7.3 預測識別結果及增長率分析
上述每做一次預測,就可以得到三個客戶的購買意愿率,控制變數后統計出每增
長 1%服務滿意度后的預測值,再使用 matlab 計算出每位客戶在不同滿意度得分指標
變化下購買意愿的增長速率,
對 BP 模型分析預測后的資料進行處理
為使銷售額提高明顯,營銷者在短時間內應該針對 a1 到 a8 中的某一個指標進行
服務難度的加大,即只能最多提升某一指標的五個百分點,由于題目中說提高體驗滿
意度 5%的服務難度是提高體驗滿意度 1%服務難度的 5 倍,為了在銷售策略中體現對服
務難度的考量,基于假設(6)我們用效益/服務難度來衡量某一指標提升的效果,此
值越大,說明對此項指標的投入產出比最小,于是我們可以建立如下模型
由于效益可以用 BP 所得的滿意度增長率來表示,而服務難度與滿意度提升的百分
比成正比:
其中 表示第 i 項指標提升 n 個百分點的效益; 表示第 i 項指標提升 n 個百分
點的難度; 表示第 i 項指標提升 n 個百分點后客戶購買該品牌電動汽車的滿意度增
長率,
利用 matlab 繪圖工具做出以提升的百分比為自變數,以 BP 輸出結果為因變數的
折線圖,如下圖所示:
圖 16 各品牌顧客的購買意愿增長情況
上圖表示 a 項 8 類滿意度隨服務難度提升時購買滿意度增長率的變化情況,以針對
in i 1,…,8
% 1 . ,. .,5
in
in
E P n D n
? ? ? ?? ? , Ein Din Pin
10 號顧客提升五個百分滿意度為例,得到的效益難度比如下表所示:
表 5:10 號客戶提高體驗滿意度到 5%后的增益表
由圖可以看出基于 a1 指標建立營銷策略可以得到最高的效益難度比,不同顧客區
別在于第二選項的不同,例如針對 10 號顧客 a1 與 a3 的差別并不大,所以若有客觀因
素的限制,也可以針對 a3 指標建立營銷策略,a1 反應的指標是電池技術性能,這與當
前大對數人們對電動汽車的顧慮是相一致的,
7.4 銷售策略
據上述結果可知,銷售者在向顧客推銷產品時,應當側重對產品電池性能的描
述,著重突出電池性能好的地方,以電池為驅動的汽車作為一項新興技術成果,公司
應當基于電池性能對大眾進行宣傳,例如擴大廣告投放,并且廣告中應盡可能體現電
池驅動車輛給人民生活出行帶來的便捷處,同時也應為顧客提供盡可能周到的服務,
基于客戶 ABC 分類管理法可知 A 類客戶能給公司帶來更多的收益,所以在有限條件下
應該首先為 VIP 客人提供更加貼心的服務,
8. 問題五的建議的提出
8.1 分析
本題需基于上述 4 問的分析并結合客戶生命周期理論給出銷售策略建議,
客戶生命周期理論是對時間因素的考量,此理論將客戶與公司的關系劃分為四個
時期:考察期、形成期、穩定期、退化期,附件一中的資料可認為是在考察期獲得的
資料,此階段僅有少量人購車,對公司的貢獻有限;形成期客戶開始為公司制造利
益;穩定期客戶為公司帶來較高利益;退化期客戶與公司的交易逐漸減少[3], 圖 17 客戶關系生命周期對企業的貢獻變化趨勢圖
第一問本團隊從均值、方差、偏度和峰度四個方面分析客戶對各種品牌電動汽車
的滿意度;第二問分析了需要提高的主要服務指標;第 3 問客戶挖掘模型可以幫助公
司篩選出最優潛力購買的 A 類客戶;第四問給出了具體需要提高多少的策略,
8.2 提出建議
首先要注重新技術的研發與宣傳銷售,本團隊對各項滿意度指標均值進行分析發
現 a3,a5 的得分最低,人們對電動汽車的經濟性與動力性表現滿意度不是很高,需要
加大相關部分對新技術的研究,做出經濟性和動力性能都高的電動汽車,銷售時可通
過宣傳該品牌電動汽車的性價比來吸引客戶等,
其次需要針對不同品牌分別制定銷售策略,從各資料的穩定性看,針對品牌 1 和
品牌 2 可以走大眾路線,在性價比方面可以出臺優惠政策;針對品牌 3,則可以走小眾
化路線,一是可以調查獲取資料利用客戶挖掘模型,二是可以在宣傳時著重凸顯品牌
18
的特點,
另一方面注重線下體驗感銷售,從偏度分析可以發現仍有很多人對購買電動汽車
存在顧慮,所以可以從打消客戶的購車顧慮出發,例如建立電動汽車體驗區,讓更多
的人了解到電動汽車的優勢,拉進與電動汽車的距離等讓電動汽車走進大眾的視野,
同時結合客戶滿意理論,調查客戶對電動汽車的期望值,看與實際滿意度評分的
差距,對于有購車意愿的人,先讓客戶做附件 2 中的問卷調查,利用本問所建立的客
戶挖掘模型得出結果后,對客戶進行 ABC 類劃分,提供個性化高質量服務,
最后在向客戶推銷時,注意側重對電動汽車電池性能優越性的描述,
9. 模型的評價 9.1 客戶挖據模型的評價
基于神經網路的客戶挖掘模型具有很多優點,主要有兩大突出優點,一是自學習
和自適應能力極強,經過訓練,神經網路可自動提取出輸入資料與輸出資料的“合理
規則”,并將其記憶于權值中,本題中經訓練與學習,神經網路高度地學習了已經購買
了電動汽車的客戶的各項指標,能夠準確的根據客戶資料為不同品牌的電動汽車挖掘
出可能會購買的客戶,二是神經網路模型具有較強的非映射能力,能夠以任意精度逼
近任何非線性的連續函式,
但該法也有著一些缺點,主要是收斂速度慢,本題中主要由學習率決定,如果學
習率過大,將使網路在訓練程序中發生振蕩,乃至不收斂現象;如果學習率過小,影響
權值和閾值的更新速度從而需要更多的迭代次數,減小了收斂速度,
基于此種情況,本文加入遺傳演算法以改善 BP 模型的不足,并對兩張模型的誤差進
行分析,基于此模型選出影響客戶決策的主要因素、判斷客戶購買電動車的潛力并制
定銷售策略,
9.2 模型的改進
1.本文訓練神經網路需要較長時間,主要是由于學習速率太小所造成的,可采用
變化的或自適應的學習速率來加以改進,可以采用 P 演算法改進來加快訓練速度,避免
陷入區域極小值等,常見的改進方法有帶動量因子演算法、自適應學習速率、變化的學
習速率以及作用函式后縮法等,動量因子法的基本思想是在反向傳播的基礎上,在每
一個權值的變化上加上一項正比于前次權值變化的值,并根據反向傳播法來產生新的
權值變化,而自適應學習 速率的方法則是針對一些特定的問題的,改變學習速率的方
法的原則是,若連續幾次迭代中,若目標函式對某個權倒數的符號相同,則這個權的
學習速率增加, 反之若符號相反則減小它的學習速率,而作用函式后縮法則是將作用
函式進行平移,即加上一個常數,
2.對于區域最小量方面,可以采用梯度下降法來盡可能收斂到區域最小值,采用
多層網路或較多的神經元,有可能得到更好的結果,
9.3 模型推廣
主成分分析模型適用于探究主要影響因素的多變數問題,可將多變數簡化為少數
幾個變數,簡化分析程序,且可明確各因素的影響程度,基于神經網路的客戶挖掘模
型在加入遺傳演算法后適用于資料的規律探索,并對某現象進行預測的問題,其通過其
自學習等能力提出資料的內在規律,從而確定其他發展性內容,
19
20
10. 參考文獻
[1] Florian Frederik Deutgen,費蓓婭.中國汽車銷售的未來(上)[J].汽車與配
件,2021(06):48-53.
[2] 劉浩然、趙翠香、李軒等.一種基于改進遺傳演算法的神經網路優化演算法研究[J]、儀
器儀表學報,2016,37(7):1573-1580. [3]劉倩. B 公司客戶價值管理研究[D].上海外國語大學,2020.
[4]王倚文,許承東,彭雅奇,牛飛.基于 GA-BP 神經網路的 BDS 軌道誤差模型研究[J].計
算機仿真,2020,37(02):82-86.
[5] 劉鵬,趙言正,閆維新.基于改進遺傳演算法的管道機器人摩擦引數辨識[J].中國民
航大學學報,2018,36(06):54-58. [6] 司守奎,孫兆亮.數學建模演算法與應用(第 2 版)[M].北京:國防工業出版社, 2015.
(4):231-240.
附錄 第一問:資料處理的 matlab 代碼
% 資料處理
a=xlsread(‘附錄 1 目標客戶體驗資料.xlsx’,‘C2:J1965’);
ab=xlsread(‘附錄 1 目標客戶體驗資料.xlsx’,‘A2:AB1965’);
boxplot(a);
for i=1:1964
if ab(i,17)==1
if ab(i,15)==3
ab(i,16)=5;
elseif ab(i,15)==4||ab(i,15)==5||ab(i,15)==6
ab(i,16)=6;
elseif ab(i,15)==6
if ab(i,16)==6
ab(i,15)=5;
end
end
elseif ab(i,17)==2
if ab(i,15)==3
ab(i,15)=4;
elseif ab(i,15)==4
ab(i,16)=5;
elseif ab(i,15)==5||ab(i,15)==6
ab(i,16)=6;
end
elseif ab(i,17)==3
if ab(i,15)==3
ab(i,15)=5;
end
elseif ab(i,17)=1||ab(i,17)=2||ab(i,17)~=3
if ab(i,16)==5||ab(i,16)==7||ab(i,16)==8
ab(i,:)=0;
end
if ab(i,15)==4
if ab(i,16)==3
ab(i,:)=0;
end
end
if ab(i,1)~=0
ab(i,17)=0;
end
end
end
for i=1:1964
if ab(i,26)+ab(i,27)>100
ab(i,:)=0;
end
if (ab(i,23)ab(i,26)+ab(i,23)ab(i,27))/100+ab(i,25)>ab(i,23)
ab(i,:)=0;
end
if ab(i,24)>ab(i,23)
ab(i,:)=0;
end
21
end
xlswrite(‘附錄一整理.xlsx’,ab);
% 統計分析
ab1=xlsread(‘附錄一整理.xlsx’,‘品牌 1’,‘A2:AB463’);
ab2=xlsread(‘附錄一整理.xlsx’,‘品牌 2’,‘A2:AB967’);
ab3=xlsread(‘附錄一整理.xlsx’,‘品牌 3’,‘A2:AB107’);
abnew=xlsread(‘附錄一整理.xlsx’,‘品牌 123’,‘A2:AB1535’);
mean1=mean(ab1);
mean2=mean(ab2);
mean3=mean(ab3);
meannew=mean(abnew);
xlswrite(‘附錄一整理.xlsx’,mean1,2,‘A465:AB465’);
xlswrite(‘附錄一整理.xlsx’,mean2,3,‘A969:AB969’);
xlswrite(‘附錄一整理.xlsx’,mean3,4,‘A109:AB109’);
xlswrite(‘附錄一整理.xlsx’,meannew,5,‘A1537:AB1537’);
var1=var(ab1);
var2=var(ab2);
var3=var(ab3);
varnew=var(abnew);
xlswrite(‘附錄一整理.xlsx’,var1,2,‘A467:AB467’);
xlswrite(‘附錄一整理.xlsx’,var2,3,‘A971:AB971’);
xlswrite(‘附錄一整理.xlsx’,var3,4,‘A111:AB111’);
xlswrite(‘附錄一整理.xlsx’,varnew,5,‘A1539:AB1539’);
skewness1=skewness(ab1);
skewness2=skewness(ab2);
skewness3=skewness(ab3);
skewnessnew=skewness(abnew);
xlswrite(‘附錄一整理.xlsx’,skewness1,2,‘A469:AB469’);
xlswrite(‘附錄一整理.xlsx’,skewness2,3,‘A973:AB973’);
xlswrite(‘附錄一整理.xlsx’,skewness3,4,‘A113:AB113’);
xlswrite(‘附錄一整理.xlsx’,skewnessnew,5,‘A1541:AB1541’);
kurtosis1=kurtosis(ab1);
kurtosis2=kurtosis(ab2);
kurtosis3=kurtosis(ab3);
kurtosisnew=kurtosis(abnew);
xlswrite(‘附錄一整理.xlsx’,kurtosis1,2,‘A471:AB471’);
xlswrite(‘附錄一整理.xlsx’,kurtosis2,3,‘A975:AB975’);
xlswrite(‘附錄一整理.xlsx’,kurtosis3,4,‘A115:AB115’);
xlswrite(‘附錄一整理.xlsx’,kurtosisnew,5,‘A1543:AB1543’);
第二問:基于遺傳演算法神經網路的預測代碼
% 清慷訓境變數
clc
clear
%
%% 網路結構建立
a=xlsread(‘2.xlsx’);
input_format=a(:,1:25)’;
output=a(:,26)’;
%% 劃分訓練集和測驗集
22
tempp = randperm(size(input_format,2));
P_train = input_format(:,tempp(1:round(0.9size(input_format,2))));
P_test = input_format(:,tempp(round(0.9size(input_format,2)):end));
T_train = output(:,tempp(1:round(0.9size(input_format,2))));
T_test = output(:,tempp(round(0.9size(input_format,2)):end));
input_train=P_train;
output_train=T_train;
input_test=P_test;
output_test=T_test;
%% 基本引數
inputnum = 25;
hiddennum = 8;
outputnum = 1;
N = size(P_test,2);
%訓練樣本輸入輸出資料歸一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
%構建網路
net=newff(inputn,outputn,hiddennum);
net.trainParam.epochs = 1000;
net.trainParam.max_fail=1000;
net.trainParam.goal = 1e-6;
net.trainParam.min_grad = 1e-10;
net.trainParam.lr = 0.1;
[net,tr] = train(net,inputn,outputn);
inputn_test=mapminmax(‘apply’,input_test,inputps);
t_sim = sim(net,inputn_test);
t_sim=mapminmax(‘reverse’,t_sim,outputps);
r2 = 1 - (sum((t_sim - output_test).^2) / sum((output_test - mean(output_test)).^2));
%% 遺傳演算法引數初始化
maxgen=50; %進化代數,即迭代次數
sizepop=50; %種群規模
pcross=[0.4]; %交叉概率選擇,0 和 1 之間
pmutation=[0.2]; %變異概率選擇,0 和 1 之間
%節點總數
numsum=inputnumhiddennum+hiddennum+hiddennumoutputnum+outputnum;
lenchrom=ones(1,numsum); %個體長度
bound=[-3ones(numsum,1) 3ones(numsum,1)]; %個體范圍
%將種群資訊定義為一個結構體
individuals=struct(‘fitness’,zeros(1,sizepop), ‘chrom’,[]);
avgfitness=[]; %每一代種群的平均適應度
bestfitness=[]; %每一代種群的最佳適應度
bestchrom=[]; %適應度最好的染色體
%計算個體適應度值
for i=1:sizepop
%隨機產生一個種群
individuals.chrom(i,:)=code(lenchrom,bound); %編碼(binary 和 grey 的編碼結果為一個實
23
數,float 的編碼結果為一個實數向量)
x=individuals.chrom(i,:);
%計算適應度
w1=x(1:inputnumhiddennum);
B1=x(inputnumhiddennum+1:inputnum*hiddennum+hiddennum);
w2=x(inputnumhiddennum+hiddennum+1:inputnumhiddennum+hiddennum+hiddennum*outputnum)
;
B2=x(inputnumhiddennum+hiddennum+hiddennumoutputnum+1:inputnumhiddennum+hiddennum
+hiddennumoutputnum+outputnum);
%網路進化引數
net.trainParam.epochs=20;
net.trainParam.lr=0.1;
net.trainParam.goal=0.00001;
net.trainParam.show=100;
net.trainParam.showWindow=0;
%網路權值賦值
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=reshape(B2,outputnum,1);
%網路訓練
net=train(net,inputn,outputn);
an=sim(net,inputn);
error=sum(sum(abs(an-outputn)));
individuals.fitness(i)=error; %染色體的適應度
end
%FitRecord=[];
%找最好的染色體
[bestfitness bestindex]=min(individuals.fitness);
bestchrom=individuals.chrom(bestindex,:); %最好的染色體
avgfitness=sum(individuals.fitness)/sizepop; %染色體的平均適應度
%記錄每一代進化中最好的適應度和平均適應度
trace=[avgfitness bestfitness];
%% 迭代求解最佳初始閥值和權值
%進化開始
for i=1:maxgen
disp([num2str(i)])
%選擇
individuals=Select(individuals,sizepop);
avgfitness=sum(individuals.fitness)/sizepop;
%交叉
individuals.chrom=cross(pcross,lenchrom,individuals.chrom,sizepop,bound);
%變異
individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,i,maxgen,bound);
%計算適應度
24
for j=1:sizepop
x=individuals.chrom(j,:); %個體
w1=x(1:inputnumhiddennum);
B1=x(inputnumhiddennum+1:inputnum*hiddennum+hiddennum);
w2=x(inputnumhiddennum+hiddennum+1:inputnumhiddennum+hiddennum+hiddennum*outputnum)
;
B2=x(inputnumhiddennum+hiddennum+hiddennumoutputnum+1:inputnumhiddennum+hiddennum
+hiddennumoutputnum+outputnum);
%網路進化引數
net.trainParam.epochs=20;
net.trainParam.lr=0.1;
net.trainParam.goal=0.00001;
net.trainParam.show=100;
net.trainParam.showWindow=0;
%網路權值賦值
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=reshape(B2,outputnum,1);
%網路訓練
net=train(net,inputn,outputn);
an=sim(net,inputn);
error=sum(sum(abs(an-outputn)));
individuals.fitness(i)=error; %染色體的適應度
individuals.fitness(j)=error;
end
%找到最小和最大適應度的染色體及它們在種群中的位置
[newbestfitness,newbestindex]=min(individuals.fitness);
[worestfitness,worestindex]=max(individuals.fitness);
%最優個體更新
if bestfitness>newbestfitness
bestfitness=newbestfitness;
bestchrom=individuals.chrom(newbestindex,:);
end
individuals.chrom(worestindex,:)=bestchrom;
individuals.fitness(worestindex)=bestfitness;
%記錄每一代進化中最好的適應度和平均適應度
avgfitness=sum(individuals.fitness)/sizepop;
trace=[trace;avgfitness bestfitness];
end
%% 遺傳演算法結果分析
figure(1)
[r c]=size(trace);
plot([1:r]’,trace(:,2),‘b–’);
25
title([‘適應度曲線 ’ ‘終止代數=’ num2str(maxgen)]);
xlabel(‘進化代數’);ylabel(‘適應度’);
legend(‘平均適應度’,‘最佳適應度’);
disp(‘適應度 變數’);
%% 把最優初始閥值權值賦予網路預測
% %用遺傳演算法優化的 BP 網路進行值預測
w1=x(1:inputnumhiddennum);
B1=x(inputnumhiddennum+1:inputnumhiddennum+hiddennum);
w2=x(inputnumhiddennum+hiddennum+1:inputnumhiddennum+hiddennum+hiddennumoutputnum)
;
B2=x(inputnumhiddennum+hiddennum+hiddennumoutputnum+1:inputnumhiddennum+hiddennum
+hiddennumoutputnum+outputnum);
net1=newff(inputn,outputn,hiddennum);
net1.iw{1,1}=reshape(w1,hiddennum,inputnum);
net1.lw{2,1}=reshape(w2,outputnum,hiddennum);
net1.b{1}=reshape(B1,hiddennum,1);
net1.b{2}=reshape(B2,outputnum,1);
%% BP 網路訓練
%網路進化引數
net1.trainParam.epochs=1000;
%net.trainParam.lr=0.1;
net.trainParam.goal=0.00001;
net1.trainParam.max_fail=1000;
net.trainParam.max_fail=1000;
net1.trainParam.goal = 1e-20;
%網路訓練
[net1,per2]=train(net1,inputn,outputn);
%% BP 網路預測
%資料歸一化
inputn_test=mapminmax(‘apply’,input_test,inputps);
an=sim(net1,inputn_test);
%預測結果反歸一化
test_simu=mapminmax(‘reverse’,an,outputps);
r21 = 1 - (sum((test_simu - output_test).^2) / sum((output_test - mean(output_test)).^2));
%% GA 優化 BP 網路預測結果分析
error1=t_sim-output_test
error2=test_simu-output_test
figure(4)
plot(1:N,error1,‘k-’,1:N,error2,‘r–h’)
legend(‘GA-BPNN’,‘BPNN’);
title(‘兩種模型誤差對比’);
第二問:權重貢獻率分析代碼
%% 清慷訓境變數
clc
clear
load best
26
a=xlsread(‘12.xlsx’) %匯入 excell 檔案
a=mapminmax(a)
p=a(:,1:25)’ %輸入值 a:b,是從 a 行或列到 b 行或列
t=a(:,26)’ %輸出值
%最終絕對值后歸一化就是你的指標的貢獻率
%% 變數篩選 MIV 演算法的初步實作(增加或者減少自變數
p=p’;
[m,n]=size§;
yy_temp=p;
% p_increase 為增加 10%的矩陣 p_decrease 為減少 10%的矩陣
for i=1:n
p=yy_temp;
pX=p(:,i);
pa=pX1.1;
p(:,i)=pa;
aa=[‘p_increase’ int2str(i) ‘=p’];
eval(aa);
end
for i=1:n
p=yy_temp;
pX=p(:,i);
pa=pX0.9;
p(:,i)=pa;
aa=[‘p_decrease’ int2str(i) ‘=p’];
eval(aa);
end
%% 利用原始資料訓練一個正確的神經網路
nntwarn off;
p=p’;
net=net1;
%% 變數篩選 MIV 演算法的后續實作(差值計算)
% 轉置后 sim
for i=1:n
eval([‘p_increase’,num2str(i),’=transpose(p_increase’,num2str(i),’)’])
end
for i=1:n
eval([‘p_decrease’,num2str(i),’=transpose(p_decrease’,num2str(i),’)’])
end
% result_in 為增加 10%后的輸出 result_de 為減少 10%后的輸出
for i=1:n
eval([‘result_in’,num2str(i),’=sim(net,’,‘p_increase’,num2str(i),’)’])
end
for i=1:n
eval([‘result_de’,num2str(i),’=sim(net,’,‘p_decrease’,num2str(i),’)’])
end
for i=1:n
eval([‘result_in’,num2str(i),’=transpose(result_in’,num2str(i),’)’])
end
for i=1:n
eval([‘result_de’,num2str(i),’=transpose(result_de’,num2str(i),’)’])
end
%% MIV 的值為各個項網路輸出的 MIV 值 MIV 被認為是在神經網路中評價變數相關的最好指標
之一,其符號代表相關的方向,絕對值大小代表影響的相對重要性,
for i=1:n
IV= [‘result_in’,num2str(i), ‘-result_de’,num2str(i)];
27
eval([‘MIV_’,num2str(i) ,’=mean(’,IV,’)’])
end
M(1,:)=abs(MIV_1)
M(2,:)=abs(MIV_2)
M(3,:)=abs(MIV_3)
M(4,:)=abs(MIV_4)
M(5,:)=abs(MIV_5)
M(6,:)=abs(MIV_6)
M(7,:)=abs(MIV_7)
M(8,:)=abs(MIV_8)
M(9,:)=abs(MIV_9)
M(10,:)=abs(MIV_10)
M(11,:)=abs(MIV_11)
M(12,:)=abs(MIV_12)
M(13,:)=abs(MIV_13)
M(14,:)=abs(MIV_14)
M(15,:)=abs(MIV_15)
M(16,:)=abs(MIV_16)
M(17,:)=abs(MIV_17)
M(18,:)=abs(MIV_18)
M(19,:)=abs(MIV_19)
M(20,:)=abs(MIV_20)
M(21,:)=abs(MIV_21)
M(22,:)=abs(MIV_22)
M(23,:)=abs(MIV_23)
M(24,:)=abs(MIV_24)
M(25,:)=abs(MIV_25)
MM=sum(M);
for i=1:25
rate(i)=M(i,:)/MM;
end
%% 作圖
figure=bar(rate100)
xlabel(‘因素集’);
ylabel(‘權值貢獻率’);
title(‘MIV 權值貢獻率分析’);
第三問:主成分分析代碼
%以品牌三為例,品牌 1 品牌 2 僅選取的表格資料不同
AB3=xlsread(‘第三問資料處理.xlsx’,‘品牌 3’,‘C2:S11’);
ab3=zscore(AB3);%資料標準化
std=corrcoef(ab3);%求解相關系數矩陣
[vec,val]=eig(std);%求解特征值,特征向量
newval=diag(val);%將特征值作為新向量
[y,n]=sort(newval);%對新向量排序
rate=y/sum(y);%計算貢獻率
sumrate=0;
newi=[];
for k=length(y)👎1
sumrate=sumrate+rate(k);
newi(length(y)+1-k)=n(k);
if sumrate>0.85
28
break;
end
end %記下累積貢獻率大 85%的特征值的序號放入 newi 中
fprintf(‘主成分數:%g\n\n’,length(newi));
for i=1:1:length(newi)
for j=1:1:length(y)
aa(i,j)=sqrt(newval(newi(i)))vec(j,newi(i));
end
end %計算載荷
aaa=aa.aa;
for i=1:1:length(newi)
for j=1:1:length(y)
zcfzh(i,j)=aa(i,j)/sqrt(sum(aaa(i,:)));
end
end%載荷歸一化
zcfz=zcfzhab3’;
m=[0.4008 0.1667 0.1320 0.1162 0.0901];%主成分的貢獻率
df=mzcfz;%計算附件一品牌 3 買主得分
xlswrite(‘第三問資料處理.xlsx’,df’,2,‘U2:U11’);
m3=xlsread(‘fulu3.xlsx’,‘C12:S16’);
M3=zscore(m3);
zcfz3=zcfzhM3’;
df3=mzcfz3;
xlswrite(‘fulu3.xlsx’,df3’,‘T12:T16’);%計算附件 3 品牌 3 客戶得分
第三問:GA-BP 模型預測的代碼
%% 該代碼為基于遺傳演算法神經網路的預測代碼
% 清慷訓境變數
clc
clear
%
%% 網路結構建立
a=xlsread(‘2.xlsx’);
input_format=a(:,1:25)’;
output=a(:,26)’;
%% 劃分訓練集和測驗集
tempp = randperm(size(input_format,2));
P_train = input_format(:,tempp(1:round(0.9size(input_format,2))));
P_test = input_format(:,tempp(round(0.9size(input_format,2)):end));
T_train = output(:,tempp(1:round(0.9size(input_format,2))));
T_test = output(:,tempp(round(0.9size(input_format,2)):end));
input_train=P_train;
output_train=T_train;
input_test=P_test;
output_test=T_test;
29
%% 基本引數
inputnum = 25;
hiddennum = 8;
outputnum = 1;
N = size(P_test,2);
%訓練樣本輸入輸出資料歸一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
%構建網路
net=newff(inputn,outputn,hiddennum);
net.trainParam.epochs = 1000;
net.trainParam.max_fail=1000;
net.trainParam.goal = 1e-6;
net.trainParam.min_grad = 1e-10;
net.trainParam.lr = 0.1;
[net,tr] = train(net,inputn,outputn);
inputn_test=mapminmax(‘apply’,input_test,inputps);
t_sim = sim(net,inputn_test);
t_sim=mapminmax(‘reverse’,t_sim,outputps);
r2 = 1 - (sum((t_sim - output_test).^2) / sum((output_test -
mean(output_test)).^2));
%% 遺傳演算法引數初始化
maxgen=50; %進化代數,即迭代次數
sizepop=50; %種群規模
pcross=[0.4]; %交叉概率選擇,0 和 1 之間
pmutation=[0.2]; %變異概率選擇,0 和 1 之間
%節點總數
numsum=inputnumhiddennum+hiddennum+hiddennumoutputnum+outputnum;
lenchrom=ones(1,numsum); %個體長度
bound=[-3ones(numsum,1) 3ones(numsum,1)]; %個體范圍
%將種群資訊定義為一個結構體
individuals=struct(‘fitness’,zeros(1,sizepop), ‘chrom’,[]);
avgfitness=[]; %每一代種群的平均適應度
bestfitness=[]; %每一代種群的最佳適應度
bestchrom=[]; %適應度最好的染色體
%計算個體適應度值
for i=1:sizepop
30
%隨機產生一個種群
individuals.chrom(i,:)=code(lenchrom,bound); %編碼(binary 和 grey 的
編碼結果為一個實數,float 的編碼結果為一個實數向量)
x=individuals.chrom(i,:);
%計算適應度
w1=x(1:inputnumhiddennum);
B1=x(inputnumhiddennum+1:inputnum*hiddennum+hiddennum);
w2=x(inputnumhiddennum+hiddennum+1:inputnumhiddennum+hiddennum+hiddennu
m*outputnum);
B2=x(inputnumhiddennum+hiddennum+hiddennumoutputnum+1:inputnumhiddennu
m+hiddennum+hiddennumoutputnum+outputnum);
%網路進化引數
net.trainParam.epochs=20;
net.trainParam.lr=0.1;
net.trainParam.goal=0.00001;
net.trainParam.show=100;
net.trainParam.showWindow=0;
%網路權值賦值
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=reshape(B2,outputnum,1);
%網路訓練
net=train(net,inputn,outputn);
an=sim(net,inputn);
error=sum(sum(abs(an-outputn)));
individuals.fitness(i)=error; %染色體的適應度
end
%FitRecord=[];
%找最好的染色體
[bestfitness bestindex]=min(individuals.fitness);
bestchrom=individuals.chrom(bestindex,:); %最好的染色體
avgfitness=sum(individuals.fitness)/sizepop; %染色體的平均適應度
%記錄每一代進化中最好的適應度和平均適應度
trace=[avgfitness bestfitness];
31
%% 迭代求解最佳初始閥值和權值
%進化開始
for i=1:maxgen
disp([num2str(i)])
%選擇
individuals=Select(individuals,sizepop);
avgfitness=sum(individuals.fitness)/sizepop;
%交叉
individuals.chrom=cross(pcross,lenchrom,individuals.chrom,sizepop,bound);
%變異
individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,i
,maxgen,bound);
%計算適應度
for j=1:sizepop
x=individuals.chrom(j,:); %個體
w1=x(1:inputnumhiddennum);
B1=x(inputnumhiddennum+1:inputnum*hiddennum+hiddennum);
w2=x(inputnumhiddennum+hiddennum+1:inputnumhiddennum+hiddennum+hiddennu
m*outputnum);
B2=x(inputnumhiddennum+hiddennum+hiddennumoutputnum+1:inputnumhiddennu
m+hiddennum+hiddennumoutputnum+outputnum);
%網路進化引數
net.trainParam.epochs=20;
net.trainParam.lr=0.1;
net.trainParam.goal=0.00001;
net.trainParam.show=100;
net.trainParam.showWindow=0;
%網路權值賦值
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=reshape(B2,outputnum,1);
%網路訓練
net=train(net,inputn,outputn);
32
an=sim(net,inputn);
error=sum(sum(abs(an-outputn)));
individuals.fitness(i)=error; %染色體的適應度
individuals.fitness(j)=error;
end
%找到最小和最大適應度的染色體及它們在種群中的位置
[newbestfitness,newbestindex]=min(individuals.fitness);
[worestfitness,worestindex]=max(individuals.fitness);
%最優個體更新
if bestfitness>newbestfitness
bestfitness=newbestfitness;
bestchrom=individuals.chrom(newbestindex,:);
end
individuals.chrom(worestindex,:)=bestchrom;
individuals.fitness(worestindex)=bestfitness;
%記錄每一代進化中最好的適應度和平均適應度
avgfitness=sum(individuals.fitness)/sizepop;
trace=[trace;avgfitness bestfitness];
end
%% 遺傳演算法結果分析
figure(1)
[r c]=size(trace);
plot([1:r]’,trace(:,2),‘b–’);
title([‘適應度曲線 ’ ‘終止代數=’ num2str(maxgen)]);
xlabel(‘進化代數’);ylabel(‘適應度’);
legend(‘平均適應度’,‘最佳適應度’);
disp(‘適應度 變數’);
%% 把最優初始閥值權值賦予網路預測
% %用遺傳演算法優化的 BP 網路進行值預測
w1=x(1:inputnumhiddennum);
B1=x(inputnumhiddennum+1:inputnumhiddennum+hiddennum);
w2=x(inputnumhiddennum+hiddennum+1:inputnumhiddennum+hiddennum+hiddennu
moutputnum);
B2=x(inputnumhiddennum+hiddennum+hiddennumoutputnum+1:inputnumhiddennu
m+hiddennum+hiddennumoutputnum+outputnum);
net1=newff(inputn,outputn,hiddennum);
net1.iw{1,1}=reshape(w1,hiddennum,inputnum);
33
34
net1.lw{2,1}=reshape(w2,outputnum,hiddennum);
net1.b{1}=reshape(B1,hiddennum,1);
net1.b{2}=reshape(B2,outputnum,1);
%% BP 網路訓練
%網路進化引數
net1.trainParam.epochs=1000;
%net.trainParam.lr=0.1;
net.trainParam.goal=0.00001;
net1.trainParam.max_fail=1000;
net.trainParam.max_fail=1000;
net1.trainParam.goal = 1e-20;
%網路訓練
[net1,per2]=train(net1,inputn,outputn);
%% BP 網路預測
%資料歸一化
inputn_test=mapminmax(‘apply’,input_test,inputps);
an=sim(net1,inputn_test);
%預測結果反歸一化
test_simu=mapminmax(‘reverse’,an,outputps);
r21 = 1 - (sum((test_simu - output_test).^2) / sum((output_test -
mean(output_test)).^2));
%% GA 優化 BP 網路預測結果分析
error1=t_sim-output_test
error2=test_simu-output_test
figure(4)
plot(1:N,error1,‘k-’,1:N,error2,‘r–h’)
legend(‘GA-BPNN’,‘BPNN’);
title(‘兩種模型誤差對比’);
aa=xlsread(‘31.xlsx’);
aa=mapminmax(‘apply’,aa’,inputps);
aa_output=sim(net,aa)
aa_output=mapminmax(‘reverse’,aa_output,outputps)
第四問:效益增度代碼
huatu5.m
%第五名客戶
x=0:1:5;
a1=[0.2118 0.2214 0.2316 0.2423 0.2537 0.2657];
a2=[0.2118 0.2149 0.218 0.2211 0.2242 0.2274];
a3=[0.2118 0.2178 0.224 0.2304 0.237 0.2438];
35
a4=[0.2118 0.2199 0.2281 0.2362 0.2442 0.252];
a5=[0.2118 0.2095 0.2071 0.2046 0.2019 0.1992];
a6=[0.2118 0.1982 0.1856 0.1738 0.1629 0.1529];
a7=[0.2118 0.2131 0.2145 0.2159 0.2174 0.2189];
a8=[0.2118 0.1968 0.1831 0.1705 0.1591 0.1487];
plot(x,a1,’-ro’,x,a2,’-go’,x,a3,’-bo’,x,a4,’-yo’,x,a5,’-r’,x,a6,’-
g*’,x,a7,’-b*’,x,a8,’-y*’);
set(gca,‘XTick’,[0:1:6])
legend(‘a1’,‘a2’,‘a3’,‘a4’,‘a5’,‘a6’,‘a7’,‘a8’);
xlabel(‘百分點’);
ylabel(‘購買概率’);
huatu10.m
%第十名客戶
x=0:1:5;
a1=[-0.0257 -0.0203 -0.015 -0.0097 -0.0047 0.0002];
a2=[-0.0257 -0.029 -0.0322 -0.0354 -0.0384 -0.0412];
a3=[-0.0257 -0.0207 -0.0158 -0.0108 -0.0059 -0.0011];
a4=[-0.0257 -0.0311 -0.0359 -0.04 -0.0435 -0.0463];
a5=[-0.0257 -0.0218 -0.0179 -0.0138 -0.0096 -0.0053];
a6=[-0.0257 -0.0287 -0.0312 -0.0331 -0.0343 -0.0349];
a7=[-0.0257 -0.0224 -0.0191 -0.0158 -0.0125 -0.0092];
a8=[-0.0257 -0.026 -0.0255 -0.0242 -0.0219 -0.0189];
plot(x,a1,’-ro’,x,a2,’-go’,x,a3,’-bo’,x,a4,’-yo’,x,a5,’-r*’,x,a6,’-
g*’,x,a7,’-b*’,x,a8,’-y*’);
set(gca,‘XTick’,[0:1:6])
legend(‘a1’,‘a2’,‘a3’,‘a4’,‘a5’,‘a6’,‘a7’,‘a8’);
xlabel(‘百分點’);
ylabel(‘購買概率’);
huatu15.m
%第十五名客戶
x=0:1:5;
a1=[0.05 0.0662 0.0833 0.1013 0.12 0.1391];
a2=[0.05 0.0542 0.0586 0.0633 0.0681 0.0731];
a3=[0.05 0.0541 0.0582 0.0625 0.0669 0.0713];
a4=[0.05 0.0561 0.0623 0.0686 0.0748 0.0808];
a5=[0.05 0.0651 0.0813 0.0981 0.1154 0.1327];
36
a6=[0.05 0.0486 0.0473 0.046 0.0449 0.044];
a7=[0.05 0.0529 0.056 0.059 0.0621 0.0652];
a8=[0.05 0.0432 0.0361 0.029 0.022 0.0151];
plot(x,a1,’-ro’,x,a2,’-go’,x,a3,’-bo’,x,a4,’-yo’,x,a5,’-r*’,x,a6,’-
g*’,x,a7,’-b*’,x,a8,’-y*’);
set(gca,‘XTick’,[0:1:6])
legend(‘a1’,‘a2’,‘a3’,‘a4’,‘a5’,‘a6’,‘a7’,‘a8’);
xlabel(‘百分點’);
ylabel(‘購買概率’);
第 4 問:基于控制變數法的 BP 預測代碼
%% 該代碼為基于遺傳演算法神經網路的預測代碼
% 清慷訓境變數
clc
clear
%
%% 網路結構建立
a=xlsread(‘12.xlsx’);
input_format=a(:,1:8)’;
output=a(:,26)’;
%% 劃分訓練集和測驗集
tempp = randperm(size(input_format,2));
P_train = input_format(:,tempp(1:round(0.9size(input_format,2))));
P_test = input_format(:,tempp(round(0.9size(input_format,2)):end));
T_train = output(:,tempp(1:round(0.9size(input_format,2))));
T_test = output(:,tempp(round(0.9size(input_format,2)):end));
input_train=P_train;
output_train=T_train;
input_test=P_test;
output_test=T_test;
%% 基本引數
inputnum = 8;
hiddennum = 4;
outputnum = 1;
N = size(P_test,2);
%訓練樣本輸入輸出資料歸一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
%構建網路
net=newff(inputn,outputn,hiddennum);
net.trainParam.epochs = 1000;
net.trainParam.max_fail=1000;
net.trainParam.goal = 1e-6;
net.trainParam.min_grad = 1e-10;
net.trainParam.lr = 0.1;
[net,tr] = train(net,inputn,outputn);
inputn_test=mapminmax(‘apply’,input_test,inputps);
t_sim = sim(net,inputn_test);
t_sim=mapminmax(‘reverse’,t_sim,outputps);
r2 = 1 - (sum((t_sim - output_test).^2) / sum((output_test -
mean(output_test)).^2));
%% 遺傳演算法引數初始化
maxgen=50; %進化代數,即迭代次數
sizepop=50; %種群規模
pcross=[0.4]; %交叉概率選擇,0 和 1 之間
pmutation=[0.2]; %變異概率選擇,0 和 1 之間
%節點總數
numsum=inputnumhiddennum+hiddennum+hiddennumoutputnum+outputnum;
lenchrom=ones(1,numsum); %個體長度
bound=[-3ones(numsum,1) 3ones(numsum,1)]; %個體范圍
%將種群資訊定義為一個結構體
individuals=struct(‘fitness’,zeros(1,sizepop), ‘chrom’,[]);
avgfitness=[]; %每一代種群的平均適應度
bestfitness=[]; %每一代種群的最佳適應度
bestchrom=[]; %適應度最好的染色體
%計算個體適應度值
for i=1:sizepop
%隨機產生一個種群
individuals.chrom(i,:)=code(lenchrom,bound); %編碼(binary 和 grey 的
編碼結果為一個實數,float 的編碼結果為一個實數向量)
x=individuals.chrom(i,:);
%計算適應度
w1=x(1:inputnumhiddennum);
B1=x(inputnumhiddennum+1:inputnum*hiddennum+hiddennum);
w2=x(inputnumhiddennum+hiddennum+1:inputnumhiddennum+hiddennum+hiddennu
m*outputnum);
B2=x(inputnumhiddennum+hiddennum+hiddennumoutputnum+1:inputnumhiddennu
37
m+hiddennum+hiddennumoutputnum+outputnum);
%網路進化引數
net.trainParam.epochs=20;
net.trainParam.lr=0.1;
net.trainParam.goal=0.00001;
net.trainParam.show=100;
net.trainParam.showWindow=0;
%網路權值賦值
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=reshape(B2,outputnum,1);
%網路訓練
net=train(net,inputn,outputn);
an=sim(net,inputn);
error=sum(sum(abs(an-outputn)));
individuals.fitness(i)=error; %染色體的適應度
end
%FitRecord=[];
%找最好的染色體
[bestfitness bestindex]=min(individuals.fitness);
bestchrom=individuals.chrom(bestindex,:); %最好的染色體
avgfitness=sum(individuals.fitness)/sizepop; %染色體的平均適應度
%記錄每一代進化中最好的適應度和平均適應度
trace=[avgfitness bestfitness];
%% 迭代求解最佳初始閥值和權值
%進化開始
for i=1:maxgen
disp([num2str(i)])
%選擇
individuals=Select(individuals,sizepop);
avgfitness=sum(individuals.fitness)/sizepop;
%交叉
individuals.chrom=cross(pcross,lenchrom,individuals.chrom,sizepop,bound);
%變異
38
individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,i
,maxgen,bound);
%計算適應度
for j=1:sizepop
x=individuals.chrom(j,:); %個體
w1=x(1:inputnumhiddennum);
B1=x(inputnumhiddennum+1:inputnum*hiddennum+hiddennum);
w2=x(inputnumhiddennum+hiddennum+1:inputnumhiddennum+hiddennum+hiddennu
m*outputnum);
B2=x(inputnumhiddennum+hiddennum+hiddennumoutputnum+1:inputnumhiddennu
m+hiddennum+hiddennumoutputnum+outputnum);
%網路進化引數
net.trainParam.epochs=20;
net.trainParam.lr=0.1;
net.trainParam.goal=0.00001;
net.trainParam.show=100;
net.trainParam.showWindow=0;
%網路權值賦值
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=reshape(B2,outputnum,1);
%網路訓練
net=train(net,inputn,outputn);
an=sim(net,inputn);
error=sum(sum(abs(an-outputn)));
individuals.fitness(i)=error; %染色體的適應度
individuals.fitness(j)=error;
end
%找到最小和最大適應度的染色體及它們在種群中的位置
[newbestfitness,newbestindex]=min(individuals.fitness);
[worestfitness,worestindex]=max(individuals.fitness);
%最優個體更新
39
if bestfitness>newbestfitness
bestfitness=newbestfitness;
bestchrom=individuals.chrom(newbestindex,:);
end
individuals.chrom(worestindex,:)=bestchrom;
individuals.fitness(worestindex)=bestfitness;
%記錄每一代進化中最好的適應度和平均適應度
avgfitness=sum(individuals.fitness)/sizepop;
trace=[trace;avgfitness bestfitness];
end
%% 遺傳演算法結果分析
figure(1)
[r c]=size(trace);
plot([1:r]’,trace(:,2),‘b–’);
title([‘適應度曲線 ’ ‘終止代數=’ num2str(maxgen)]);
xlabel(‘進化代數’);ylabel(‘適應度’);
legend(‘平均適應度’,‘最佳適應度’);
disp(‘適應度 變數’);
%% 把最優初始閥值權值賦予網路預測
% %用遺傳演算法優化的 BP 網路進行值預測
w1=x(1:inputnumhiddennum);
B1=x(inputnumhiddennum+1:inputnumhiddennum+hiddennum);
w2=x(inputnumhiddennum+hiddennum+1:inputnumhiddennum+hiddennum+hiddennu
moutputnum);
B2=x(inputnumhiddennum+hiddennum+hiddennumoutputnum+1:inputnumhiddennu
m+hiddennum+hiddennumoutputnum+outputnum);
net1=newff(inputn,outputn,hiddennum);
net1.iw{1,1}=reshape(w1,hiddennum,inputnum);
net1.lw{2,1}=reshape(w2,outputnum,hiddennum);
net1.b{1}=reshape(B1,hiddennum,1);
net1.b{2}=reshape(B2,outputnum,1);
%% BP 網路訓練
%網路進化引數
net1.trainParam.epochs=1000;
%net.trainParam.lr=0.1;
net.trainParam.goal=0.00001;
net1.trainParam.max_fail=1000;
net.trainParam.max_fail=1000;
net1.trainParam.goal = 1e-20;
40
%網路訓練
[net1,per2]=train(net1,inputn,outputn);
%% BP 網路預測
%資料歸一化
inputn_test=mapminmax(‘apply’,input_test,inputps);
an=sim(net1,inputn_test);
%預測結果反歸一化
test_simu=mapminmax(‘reverse’,an,outputps);
r21 = 1 - (sum((test_simu - output_test).^2) / sum((output_test -
mean(output_test)).^2));
%% GA 優化 BP 網路預測結果分析
error1=t_sim-output_test
error2=test_simu-output_test
figure(4)
plot(1:N,error1,‘k-*’,1:N,error2,‘r–h’)
legend(‘GA-BPNN’,‘BPNN’);
title(‘兩種模型誤差對比’);
aa=xlsread(‘41.xlsx’);
aa=mapminmax(‘apply’,aa’,inputps);
aa_output=sim(net,aa)
aa_output=mapminmax(‘reverse’,aa_output,outputps)
41
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293300.html
標籤:AI
