通过两组统计数据计算而得的协方差可以评估这两组统计数据的相似程度。

样本

  1. A = [a1, a2, ..., an]
  2. B = [b1, b2, ..., bn]

平均值

  1. ave_a = (a1 + a2 +...+ an)/n
  2. ave_b = (b1 + b2 +...+ bn)/m

离差(用样本中的每一个元素减去平均数,求得数据的误差程度):

  1. dev_a = [a1, a2, ..., an] - ave_a
  2. dev_b = [b1, b2, ..., bn] - ave_b

协方差

协方差可以简单反映两组统计样本的相关性,值为正,则为正相关;值为负,则为负相关,绝对值越大相关性越强。

  1. cov_ab = ave(dev_a x dev_b)
  2. cov_ba = ave(dev_b x dev_a)

案例:计算两组数据的协方差,并绘图观察。

  1. import numpy as np
  2. import matplotlib.pyplot as mp
  3. a = np.random.randint(1, 30, 10)
  4. b = np.random.randint(1, 30, 10)
  5. #平均值
  6. ave_a = np.mean(a)
  7. ave_b = np.mean(b)
  8. #离差
  9. dev_a = a - ave_a
  10. dev_b = b - ave_b
  11. #协方差
  12. cov_ab = np.mean(dev_a*dev_b)
  13. cov_ba = np.mean(dev_b*dev_a)
  14. print(\'ab数组:\', a, b)
  15. print(\'ab样本方差:\', np.sum(dev_a**2)/(len(dev_a)-1), np.sum(dev_b**2)/(len(dev_b)-1))
  16. print(\'ab协方差:\',cov_ab, cov_ba)
  17. #绘图,查看两条图线的相关性
  18. mp.figure(\'COV LINES\', facecolor=\'lightgray\')
  19. mp.title(\'COV LINES\', fontsize=16)
  20. mp.xlabel(\'x\', fontsize=14)
  21. mp.ylabel(\'y\', fontsize=14)
  22. x = np.arange(0, 10)
  23. #a,b两条线
  24. mp.plot(x, a, color=\'dodgerblue\', label=\'Line1\')
  25. mp.plot(x, b, color=\'limegreen\', label=\'Line2\')
  26. #a,b两条线的平均线
  27. mp.plot([0, 9], [ave_a, ave_a], color=\'dodgerblue\', linestyle=\'--\', alpha=0.7, linewidth=3)
  28. mp.plot([0, 9], [ave_b, ave_b], color=\'limegreen\', linestyle=\'--\', alpha=0.7, linewidth=3)
  29. mp.grid(linestyle=\'--\', alpha=0.5)
  30. mp.legend()
  31. mp.tight_layout()
  32. mp.show()

相关系数

协方差除去两组统计样本的乘积是一个[-1, 1]之间的数。该结果称为统计样本的相关系数。

  1. # a组样本 与 b组样本做对照后的相关系数
  2. cov_ab/(std_a x std_b)
  3. # b组样本 与 a组样本做对照后的相关系数
  4. cov_ba/(std_b x std_a)
  5. # a样本与a样本作对照 b样本与b样本做对照 二者必然相等
  6. cov_ab/(std_a x std_b)=cov_ba/(std_b x std_a)

通过相关系数可以分析两组数据的相关性:

  1. 若相关系数越接近于0,越表示两组样本越不相关。
  2. 若相关系数越接近于1,越表示两组样本正相关。
  3. 若相关系数越接近于-1,越表示两组样本负相关。

案例:输出案例中两组数据的相关系数。

  1. print(\'相关系数:\', cov_ab/(np.std(a)*np.std(b)), cov_ba/(np.std(a)*np.std(b)))

相关矩阵

a与a的相关系数  a与b的相关系数

b与a的相关系数  b与b的相关系数

矩阵正对角线上的值都为1。(同组样本自己相比绝对正相关)

  1. # 相关矩阵
  2. numpy.corrcoef(a, b)
  3. # 相关矩阵的分子矩阵
  4. # [[a方差,ab协方差], [ba协方差, b方差]]
  5. numpy.cov(a, b)

 

  1. # 协方差
  2. import numpy as np
  3. import matplotlib.pyplot as mp
  4. import datetime as dt
  5. import matplotlib.dates as md
  6. def dmy2ymd(dmy):
  7. """
  8. 把日月年转年月日
  9. :param day:
  10. :return:
  11. """
  12. dmy = str(dmy, encoding=\'utf-8\')
  13. t = dt.datetime.strptime(dmy, \'%d-%m-%Y\')
  14. s = t.date().strftime(\'%Y-%m-%d\')
  15. return s
  16. dates, bhp_closing_prices = \
  17. np.loadtxt(\'bhp.csv\',
  18. delimiter=\',\',
  19. usecols=(1, 6),
  20. unpack=True,
  21. dtype=\'M8[D],f8\',
  22. converters={1: dmy2ymd}) # 日月年转年月日
  23. vale_closing_prices = \
  24. np.loadtxt(\'vale.csv\',
  25. delimiter=\',\',
  26. usecols=(6,),
  27. unpack=True) # 因为日期一样,所以此处不读日期
  28. # print(dates)
  29. # 绘制收盘价的折现图
  30. mp.figure(\'COV\', facecolor=\'lightgray\')
  31. mp.title(\'COV\', fontsize=18)
  32. mp.xlabel(\'Date\', fontsize=14)
  33. mp.ylabel(\'Price\', fontsize=14)
  34. mp.grid(linestyle=":")
  35. # 设置刻度定位器
  36. # 每周一一个主刻度,一天一个次刻度
  37. ax = mp.gca()
  38. ma_loc = md.WeekdayLocator(byweekday=md.MO)
  39. ax.xaxis.set_major_locator(ma_loc)
  40. ax.xaxis.set_major_formatter(md.DateFormatter(\'%Y-%m-%d\'))
  41. ax.xaxis.set_minor_locator(md.DayLocator())
  42. # 修改dates的dtype为md.datetime.datetiem
  43. dates = dates.astype(md.datetime.datetime)
  44. mp.plot(dates, bhp_closing_prices,
  45. color=\'dodgerblue\',
  46. linewidth=2,
  47. linestyle=\'-\',
  48. alpha=0.8,
  49. label=\'BHP Closing Price\')
  50. mp.plot(dates, vale_closing_prices,
  51. color=\'orangered\',
  52. linewidth=2,
  53. linestyle=\'-\',
  54. alpha=0.8,
  55. label=\'VALE Closing Price\')
  56. # 计算两只股票收盘价的协方差
  57. # 求均值
  58. mean_bhp = np.mean(bhp_closing_prices)
  59. mean_vale = np.mean(vale_closing_prices)
  60. # 求离差
  61. dev_bhp = bhp_closing_prices - mean_bhp
  62. dev_vale = vale_closing_prices - mean_vale
  63. # 协方差(bhp的离差乘以vale的离差)
  64. cov = (dev_bhp * dev_vale).mean() # 用的是总体的数据
  65. print(\'cov:\', cov) # cov: 3.135577333333333
  66. # 两条图线的相关性
  67. k = cov / np.std(bhp_closing_prices * np.std(vale_closing_prices))
  68. print(k) # 0.8664988296368301
  69. # 相关系数 = a方差/(a标准差*a标准差)
  70. k = np.corrcoef(bhp_closing_prices, vale_closing_prices)
  71. print(k)
  72. """
  73. [[1. 0.86649883]
  74. [0.86649883 1. ]]
  75. """
  76. # q秋两组数据的协方差
  77. covm = np.cov(bhp_closing_prices, vale_closing_prices) # 用的是 样本的数据
  78. print(covm)
  79. """
  80. [[8.53844379 3.24370069]
  81. [3.24370069 1.64122023]]
  82. """
  83. mp.legend()
  84. mp.gcf().autofmt_xdate()
  85. mp.show()

 

 

 

 

版权声明:本文为maplethefox原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/maplethefox/p/11466153.html