1. 程式人生 > 其它 >基於馬爾科夫鏈的產品評估預測

基於馬爾科夫鏈的產品評估預測

馬爾可夫鏈

1、建立轉移概率矩陣:

  馬爾可夫鏈是一種時間離散、狀態離散、帶有記憶功能情況的隨機過程,是預測中常用到的一種數學模型。如果資料的本身的每一時刻的狀態僅僅取決於緊接在他前面的隨機變數的所處狀態,而與這之前的狀態無關,這就是馬爾可夫鏈的“無後效性”。

經過了解本文的銷量對於時間序列敏感性不高,具有“無後效性”的特點,因此可以根據唯品歷史以來的銷量進行其預測,可以得到下一次檔期每個商品的銷售狀態。

為了準確的計算整個目標系統的轉移概率矩陣是馬爾可夫鏈預測方法最常用到也是最基礎的內容,一般是經常是使用統計估演算法,將其方法總結如下:

  假設我們所關注的序列片段存在狀態的個數為m個,即狀態空間 I = {1,2,,,,m},將f_{ij}

i,j inI看作為轉移頻數生成的概率矩陣。第i行,第j行元素在這個轉移頻數矩陣的值f_{ij} 除以全部元素和得到的值定義為“轉移概率”,用字母P_{ij} {i,jin I}來表示,既有:P_{ij}=(f_{ij})/{sum_{j=1}^m f_{ij}qquad}由狀態i經一步轉到狀態j也可以用此公式來表示。因為穩定性好是頻率的一個特點,所以如果m很大的時候,我們可以把頻率等價的看成是概率,因而可以用它來估算轉移概率。實際寫法上為了方便轉移頻率用符號P_{ij}

來表示,並稱之為“轉移概率”,一步轉移概率也相應的表示為:P=(P_{ij})i,jin I

2、對離散型數列進行“馬氏性”檢驗:

  通常情況下選用離散型序列的馬爾可夫鏈來對變數具有隨機性的序列進行“馬氏性”檢驗,檢驗常用x^2統計量。

  設研究的序列狀態個數為m,用(f_{ij})i,jin I 表示轉移頻數概率矩陣,把(f_{ij})i,jin I 的各個列之和去除以(f_{ij})i,jin I 的全部元素之和,就會得到“邊際概率”,用字母P_j 表示,其中:P_{ij}=({sum_{i=1}^m f_{ij}})/({sum_{i=1}^m}{sum_{j=1}^m f_{ij}})

當m很大時x^2統計量:

它將服從自由度為(m-1)^2的x^2分佈,現在給定顯著性水平為alpha ,經查表可得到的值chi_a^2((m-1)^2)

(或者在excel表裡面利用公式chiinv(alpha , (m-1)^2))計算得到)。如果

,則拒絕零假設,可以認為序列具備“馬氏性”,反之,則這個序列不能當作馬爾可夫鏈來對待。

假設某一款商品的銷量是如下所示:

825058101

66

39

50

45

96

38

15

14

22

63

22

63

80

42

43

104

45

20

7

3

本文設定不同的銷售量有不同的狀態,即:

範圍

狀態

<20

滯銷

20<=and<40

平銷

40<=and<60

熱銷

>60

暢銷

由此可以得到上述商品的轉移過程的:

滯銷

平銷

熱銷

暢銷

滯銷

2

1

0

0

平銷

2

0

1

1

熱銷

0

1

2

2

暢銷

0

2

2

1

則該商品的 P_{j}\為:

滯銷

平銷

熱銷

暢銷

4/18

4/18

5/18

5/18

則該商品的P_{ij}\ 為:

滯銷

平銷

熱銷

暢銷

滯銷

0.67

0.33

0.00

0.00

平銷

0.50

0.00

0.25

0.25

熱銷

0.00

0.20

0.40

0.40

暢銷

0.00

0.40

0.40

0.20

將上述結果代入公式:

根據卡方分佈的資料比較大小:

  該商品的卡方值為:大於0.1顯著水平下的

,所以該商品是通過“馬氏性”檢驗的,因此該商品的轉移概率矩陣為:

滯銷

平銷

熱銷

暢銷

滯銷

0.6139

0.2211

0.0825

0.0825

平銷

0.335

0.315

0.2

0.15

熱銷

0.1

0.24

0.37

0.29

暢銷

0.2

0.16

0.34

0.3

該表格表示為:

(1)原來產品為滯銷狀態,下一次則有61.39%的概率還是滯銷狀態,有22.11%的概率變為平銷,有8.25%的概率變為熱銷,有8.25%的概率變為暢銷;

(2) 原來產品為平銷狀態,下一次則有33.50%的概率還是滯銷狀態,有31.50%的概率變為平銷,有20.00%的概率變為熱銷,有15.00%的概率變為暢銷;

(3) 原來產品為熱銷狀態,下一次則有10.00%的概率還是滯銷狀態,有24.00%的概率變為平銷,有37.00%的概率變為熱銷,有29.00%的概率變為暢銷;

(4) 原來產品為熱銷狀態,下一次則有20.00%的概率還是滯銷狀態,有16.00%的概率變為平銷,有34.00%的概率變為熱銷,有30.00%的概率變為暢銷。

-----------------------------------我是分割線-------------------------------

但是但是,這只是其中一個商品的預估

本店商品的其中一個

本店差不多有1700商品

怎麼辦怎麼辦?

首先將資料儲存出來

本文用python讀取資料

步驟1:excel表格的資料插入進去啊,這裡是讀取表格

from openpyxl import load_workbook

if __name__ == '__main__':

##這裡是開啟excel將資料儲存到數組裡面

wb = load_workbook(filename=r'C:UsersAdministratorDesktopdata.xlsx') ##讀取路徑

ws = wb.get_sheet_by_name("Sheet1") ##讀取名字為Sheet1的sheet表

info_data_id = []

info_data_sales = []

步驟2:表格讀取:

     for row_A in range(2, 1693):  ## 遍歷第2行到1692行
         id = ws.cell(row=row_A, column=1).value  ## 遍歷第2行到1692行,第1列
          info_data_id.append(id)
      for row_num_BtoU in range(2, len(info_data_id) + 2):  ## 遍歷第2行到1692行
          row_empty = []  ##建立一個空陣列作為臨時儲存地,每次換行就被清空
       for i in range(2, 22):  ## 遍歷第2行到1692行,第2到21列
             data = ws.cell(row=row_num_BtoU, column=i).value
             if data == None:
                pass
             else:
        info_data_sales.append(row_empty)  ##row_empty每次儲存完2到21列後壓給info_data_sales,然後row_empty被清空

重點是建立了一個空的row_empty = []可以臨時儲存每一行的資料,等到下一次迴圈就被清空

表格資料樣式如下:

一共1692行22列應該,反正沒數

步驟3:計算p.j

##這裡是計算pj的

      info_pj = []
     for j in range(0, len(info_data_sales)):
          pj_zhixiao = 0
         pj_pingxiao = 0
         pj_rexiao = 0
        number = 0
        pj_empty = []
         for k in range(0, len(info_data_sales[j])):
            number = number + 1
            if info_data_sales[j][k] < 10:
                pj_zhixiao = pj_zhixiao + 1
             elif info_data_sales[j][k] >= 10 and info_data_sales[j][k] < 30:
                pj_pingxiao = pj_pingxiao + 1
            elif info_data_sales[j][k] >= 30:
                pj_rexiao = pj_rexiao + 1
        chance_zhixiao = pj_zhixiao / number
        chance_pingxiao = pj_pingxiao / number
        chance_rexiao = pj_rexiao / number
        pj_empty.append(chance_zhixiao)
        pj_empty.append(chance_pingxiao)
        pj_empty.append(chance_rexiao)
        info_pj.append(pj_empty)  ##得到了pj初始概率

遍歷陣列info_data_sales的每一個元素,根據我審定的判斷來計算各個狀態的出現概率:

範圍

狀態

<10

滯銷

10<=and<30

平銷

>30

熱銷

步驟4:計算P_{ij}F_{ij}

先是統計各個狀態出現的概率

再壓入數組裡面

步驟5:判斷馬氏性

什麼資料又有了,那麼就可以用公式計算了:

程式碼如下:

不要忘記了

import math

由於我的顯著性非常不明顯

所以用了0.2的顯著性判斷:

步驟6:壓回excel表格就行了

這裡用到的是

import xlsxwriter

步驟7:記得利用矩陣計算啊,python自帶的矩陣運算是:

import numpy as np

最後做個好學生,不要忘記關掉excel表格

workbook.close()

得到效果圖如下啊啊啊啊: