通过协方差等方式判断两组数据的相似度

本文所用文件的百度云链接:

链接:https://pan.baidu.com/s/15-qbrbtRs4frup24Y1i5og 
提取码:pm2c 

协方差、相关矩阵、相关系数

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

样本:

A = [a1, a2, a3 ... an]
B = [b1, b2, b3 ... bn]

求均值:

ave_A = np.mean(A)
ave_B = np.mean(B)

求离差:

dev_A = [a1, a2, a3 .. an] - ave_A
dev_B = [b1, b2, b3 .. bn] - ave_B

协方差:

cov_ab = np.mean(dev_A * dev_B)
cov_ba = np.mean(dev_B * dev_A)

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

案例: 统计两只股票的相关程度. vale.csv bhp.csv

# 计算两组数据的协方差
vale_mean = np.mean(vale_closing_prices)
bhp_mean = np.mean(bhp_closing_prices)
dev_vale = vale_closing_prices - vale_mean
dev_bhp = bhp_closing_prices - bhp_mean
cov = np.mean(dev_vale * dev_bhp)
print(cov)

相关系数

相关系数是一个[-1, 1]之间的数. 若相关系数越接近于1, 则表示两组样本越正相关. 若相关系数越接近于-1, 则表示两组样本越负相关. 若相关系数越接近于0, 则表示两组样本没啥大关系.

相关系数的计算方式 (协方差除以两组样本标准差之积):

cov_ab / (std_a * std_b)  a对于b的相关系数
cov_ba / (std_b * std_a)  b对于a的相关系数

案例:

# 计算两支股票的相关系数
k = cov / (np.std(vale_closing_prices) * \
			np.std(bhp_closing_prices))
print('K:', k)

相关矩阵

# 获取相关矩阵, 该矩阵中包含相关系数
# 所以,当需要获取两组数据的相关系数时,
# 可以通过该矩阵得到相关系数的值.
m = np.corrcoef(vale_prices, bhp_prices)
# 获取相关矩阵的分子矩阵 (协方差矩阵)
cm = np.cov(a, b)
"""
协方差示例
"""
import numpy as np
import matplotlib.pyplot as mp
import datetime as dt
import matplotlib.dates as md

# 当numpy解析文本时,将会把第一列中的每个字符串
# 都传给函数进行处理, 将处理完毕后的返回值
# 转成需要的M8[D]类型
def dmy2ymd(dmy):
	dmy = str(dmy, encoding='utf-8')
	# 把dmy转成日期对象
	d = dt.datetime.strptime(dmy, '%d-%m-%Y')
	t = d.date()
	s = t.strftime('%Y-%m-%d')
	return s

# 加载文件
dates, vale_closing_prices = np.loadtxt(
	'../da_data/vale.csv', delimiter=',', 
	usecols=(1,6), unpack=True, 
	dtype='M8[D], f8' , 
	converters={1:dmy2ymd})

bhp_closing_prices = np.loadtxt(
	'../da_data/bhp.csv', delimiter=',', 
	usecols=(6,), unpack=True)


# 绘制收盘价
mp.figure('COV DEMO', facecolor='lightgray')
mp.title('COV DEMO', fontsize=18)
mp.xlabel('Date', fontsize=14)
mp.ylabel('Price', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
# 设置主刻度定位器为每周一
ax = mp.gca()
ax.xaxis.set_major_locator(
	md.WeekdayLocator(byweekday=md.MO))
ax.xaxis.set_major_formatter(
	md.DateFormatter('%Y/%m/%d'))

# 把M8[D]转为matplotlib识别的date类型
dates = dates.astype(md.datetime.datetime)
mp.plot(dates, vale_closing_prices, 
	color='dodgerblue', linewidth=1,
	linestyle='--', label='vale prices')
mp.plot(dates, bhp_closing_prices, 
	color='orangered', linewidth=1,
	linestyle='--', label='bhp prices')

# 计算两组数据的协方差
vale_mean = np.mean(vale_closing_prices)
bhp_mean = np.mean(bhp_closing_prices)
dev_vale = vale_closing_prices - vale_mean
dev_bhp = bhp_closing_prices - bhp_mean
cov = np.mean(dev_vale * dev_bhp)
print('COV:', cov)

# 计算两支股票的相关系数
k = cov / (np.std(vale_closing_prices) * \
			np.std(bhp_closing_prices))
print('K:', k)

# 相关矩阵
m = np.corrcoef(vale_closing_prices, 
				bhp_closing_prices)
print(m)
print(np.cov(vale_closing_prices, bhp_closing_prices))

mp.legend()
# 自动格式化x轴的日期输出
mp.gcf().autofmt_xdate()
mp.show()

在这里插入图片描述

  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值