余弦相似度的定义
余弦相似度定义为它们的内积(点积)除以它们的欧几里德范数(向量长度的乘积)
余弦相似度给出的相似性范围从-1到1: -1意味着两个向量指向的方向正好截然相反,1表示它们的指向是完全相同的,0通常表示它们之间是独立的,而在这之间的值则表示中间的相似性或相异性。
余弦相似度的作用
余弦相似度的作用分析
1.相似性比较:
在大多数情况下,较高的余弦相似度通常表示两个向量(或数据集)之间的方向更为相似。例如,在股票市场中,两个时间段内收盘价格的高余弦相似度可能表明这两段时间内市场趋势较为一致,这在某些情况下可以被视为市场行为的一种一致性指标。
2.特定情况下的考虑:
但并不是所有情况下高余弦相似度都意味着良好的结果。例如,在某些技术分析或者模型评估中,如果期望模型具有一定的泛化能力和预测能力,过高的余弦相似度可能表明模型过度拟合了历史数据,而在未来的波动中可能不具备预测能力。
3.应用场景的多样性:
在实际应用中,余弦相似度的评估通常需要结合具体的背景和分析目的。例如,对于投资组合管理者来说,不同资产之间的余弦相似度可以帮助他们确定哪些资产具有相似的市场表现,但并不意味着他们总是希望投资于表现完全相似的资产。
我们以收盘价(rc)前二十行数据为例,求两只股票的的余弦相似度
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
path1,path2 = "000001.XSHE.csv","000063.XSHE.csv",
feature = "rclose"
length = 20
#指定收盘价那一列前20行的数据
rc1,rc2 = pd.read_csv(path1)[feature][:length],pd.read_csv(path2)[feature][:length]
#余弦相似度:它们的余弦相似度定义为它们的内积(点积)除以它们的欧几里德范数(向量长度的乘积)
#np.dot()点乘
cosine = np.dot(rc1, rc2) / (np.linalg.norm(rc1) * (np.linalg.norm(rc2)))
print(cosine)
扩展应用
我们现在要求两只股票开盘价,收盘价,最高价,最低价,股票总成交量的余弦相似度。
我们同样还是取前二十行数据,首先进行数据的归一化(将数据变成从0到1)
#取出一个文件的数据
data1 = pd.read_csv(path1)
data2 = pd.read_csv(path2)
#从open列到volume列用loc
data1_selected = data1.loc[:,"open":"volume"][:length]
data2_selected = data2.loc[:,"open":"volume"][:length]
# 假设 data1_selected 是你之前选择的包含 "open" 到 "volume" 列的数据框
# 你可以先提取这些数值列
numeric_columns = data1_selected.columns
numeric_columns_2 = data2_selected.columns
# 初始化 MinMaxScaler
scaler = MinMaxScaler()
# 对数值列进行归一化
data1_normalized = data1_selected.copy()
data1_normalized[numeric_columns] = scaler.fit_transform(data1_selected[numeric_columns])
data2_normalized = data2_selected.copy()
data2_normalized[numeric_columns] = scaler.fit_transform(data2_selected[numeric_columns_2])
# 输出归一化后的数据框
print(data1_normalized)
print(data2_normalized)
然后计算二者的余弦相似度
# 假设 data1_selected 和 data2_selected 是有效的 DataFrame 数据
# name 列表包含了每个数据列的名称
name_1 = []
for i in data1["trade_date"][:length]:
name_1.append(i)
name_2 = []
for i in data2["trade_date"][:length]:
name_2.append(i)
# 计算余弦相似度
similarity_matrix = cosine_similarity(data1_normalized,data2_normalized)
print(similarity_matrix)
最后我们使用seaborn来绘制图片
# 使用 seaborn 绘制热力图
plt.figure(figsize=(10, 8))
sns.heatmap(similarity_matrix, annot=True, cmap='YlGnBu', fmt='.2f',
xticklabels=name_2, yticklabels=name_1)
plt.title('Cosine Similarity between data1 and data2')
plt.xlabel('data2')
plt.ylabel('data1')
plt.show()
最终得到结果
总代码
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
path1,path2 = "000001.XSHE.csv","000063.XSHE.csv",
feature = "rclose"
length = 20
#指定收盘价那一列前20行的数据
rc1,rc2 = pd.read_csv(path1)[feature][:length],pd.read_csv(path2)[feature][:length]
#余弦相似度:它们的余弦相似度定义为它们的内积(点积)除以它们的欧几里德范数(向量长度的乘积)
#np.dot()点乘
cosine = np.dot(rc1, rc2) / (np.linalg.norm(rc1) * (np.linalg.norm(rc2)))
print(cosine)
#取出一个文件的数据
data1 = pd.read_csv(path1)
data2 = pd.read_csv(path2)
#从open列到volume列用loc
data1_selected = data1.loc[:,"open":"volume"][:length]
data2_selected = data2.loc[:,"open":"volume"][:length]
# 假设 data1_selected 是你之前选择的包含 "open" 到 "volume" 列的数据框
# 你可以先提取这些数值列
numeric_columns = data1_selected.columns
numeric_columns_2 = data2_selected.columns
# 初始化 MinMaxScaler
scaler = MinMaxScaler()
# 对数值列进行归一化
data1_normalized = data1_selected.copy()
data1_normalized[numeric_columns] = scaler.fit_transform(data1_selected[numeric_columns])
data2_normalized = data2_selected.copy()
data2_normalized[numeric_columns] = scaler.fit_transform(data2_selected[numeric_columns_2])
# 输出归一化后的数据框
print(data1_normalized)
print(data2_normalized)
# 假设 data1_selected 和 data2_selected 是有效的 DataFrame 数据
# name 列表包含了每个数据列的名称
name_1 = []
for i in data1["trade_date"][:length]:
name_1.append(i)
name_2 = []
for i in data2["trade_date"][:length]:
name_2.append(i)
# 计算余弦相似度
similarity_matrix = cosine_similarity(data1_normalized,data2_normalized)
print(similarity_matrix)
# 使用 seaborn 绘制热力图
plt.figure(figsize=(10, 8))
sns.heatmap(similarity_matrix, annot=True, cmap='YlGnBu', fmt='.2f',
xticklabels=name_2, yticklabels=name_1)
plt.title('Cosine Similarity between data1 and data2')
plt.xlabel('data2')
plt.ylabel('data1')
plt.show()