基于马尔科夫链的产品评估预测

马尔可夫链

1、建立转移概率矩阵:

  马尔可夫链是一种时间离散、状态离散、带有记忆功能情况的随机过程,是预测中常用到的一种数学模型。如果数据的本身的每一时刻的状态仅仅取决于紧接在他前面的随机变量的所处状态,而与这之前的状态无关,这就是马尔可夫链的“无后效性”。

经过了解本文的销量对于时间序列敏感性不高,具有“无后效性”的特点,因此可以根据唯品历史以来的销量进行其预测,可以得到下一次档期每个商品的销售状态。

为了准确的计算整个目标系统的转移概率矩阵是马尔可夫链预测方法最常用到也是最基础的内容,一般是经常是使用统计估算法,将其方法总结如下:

  假设我们所关注的序列片段存在状态的个数为m个,即状态空间 I = {1,2,,,,m},将f_{ij} i,j \inI看作为转移频数生成的概率矩阵。第i行,第j行元素在这个转移频数矩阵的值f_{ij} 除以全部元素和得到的值定义为“转移概率”,用字母P_{ij} {i,j\in I}来表示,既有:P_{ij}=(f_{ij})/{\sum_{j=1}^m f_{ij}\qquad}由状态i经一步转到状态j也可以用此公式来表示。因为稳定性好是频率的一个特点,所以如果m很大的时候,我们可以把频率等价的看成是概率,因而可以用它来估算转移概率。实际写法上为了方便转移频率用符号P_{ij}

来表示,并称之为“转移概率”,一步转移概率也相应的表示为:P=(P_{ij})i,j\in I

2、对离散型数列进行“马氏性”检验:

  通常情况下选用离散型序列的马尔可夫链来对变量具有随机性的序列进行“马氏性”检验,检验常用x^2统计量。

  设研究的序列状态个数为m,用(f_{ij})i,j\in I 表示转移频数概率矩阵,把(f_{ij})i,j\in I 的各个列之和去除以(f_{ij})i,j\in 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:\Users\Administrator\Desktop\data.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()

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

原文发布于微信公众号 - 大数据挖掘DT数据分析(datadw)

原文发表时间:2016-09-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习算法全栈工程师

机器学习实战---线性回归提高篇之乐高玩具套件二手价预测

作者:崔家华 编辑:王抒伟 PS(欢迎访问作者个人网站:www.cuijiahua.com) 线性回归 零 前言: 本篇文章讲解线性回归的缩减方法,岭回归以及逐...

5229
来自专栏人工智能

C+实现神经网络之六—实战手写数字识别

之前的五篇博客讲述的内容应该覆盖了如何编写神经网络的大部分内容,在经过之前的一系列努力之后,终于可以开始实战了。试试写出来的神经网络怎么样吧。 数据准备 有人说...

2029
来自专栏SeanCheney的专栏

Numpy和MatplotlibPython科学计算——Numpy线性代数模块(linalg)随机模块(random)Python的可视化包 – Matplotlib2D图表3D图表图像显示

Python科学计算——Numpy Numpy(Numerical Python extensions)是一个第三方的Python包,用于科学计算。这个库的前身...

4104
来自专栏灯塔大数据

每周学点大数据 | No.45 基于路径的图算法

No.45期 基于路径的图算法 Mr. 王:接下来我们看一类具体的问题,这类问题叫作基于路径的图算法。这类算法的目标是计算节点间关于路径的信息。在这类问题中,图...

3155
来自专栏人工智能

十五:多层感知机与布尔函数

今天没有别的话,好好学习,多多转发! 本期内容是 【多层感知机与布尔函数】 场景描述 神经网络概念的诞生很大程度上受到了神经科学的启发。生物学研究表明,大脑皮层...

2208
来自专栏灯塔大数据

每周学点大数据 | No.11亚线性算法

No.11期 亚线性算法 Mr. 王:从今天开始,我们正式讲解大数据算法的内容。首先谈谈关于亚线性算法的问题。 小可:我记得前面提到过亚线性算法,就是复杂度低...

3575
来自专栏数据结构与算法

学大伟业Day解题报告

预计分数:30+30+0=60 实际分数:30+20+0=50 题解部分全部来自http://www.cnblogs.com/TheRoadToTheGold/...

3134
来自专栏计算机视觉与深度学习基础

【深度学习】写诗机器人tensorflow实现

代码地址:https://github.com/hjptriplebee/Chinese_poem_generator, 欢迎fork, star 机器人命名M...

1.5K5
来自专栏灯塔大数据

每周学点大数据 | No.19全0 数组的判定

No.19期 全0 数组的判定 Mr. 王:接下来我们讲一类时间亚线性判定算法,先来举个例子吧。假设有一个数组A,其中包含0 和1,我们需要判定数...

2756
来自专栏null的专栏

优化算法——遗传算法

与遗传算法的第一次接触 遗传算法是我进入研究生阶段接触的第一个智能算法,从刚开始接触,到后来具体去研究,再到后来利用遗传算法完成了水利水电的程序设计比赛,整个过...

7236

扫码关注云+社区