CCA原理:
关联分析,从线性回归开始!
同样是找样本之间的关系,在线性回归中是找通过拟合找出x和y的关系,当有多个维度时,也是一样找出Y=WX就可以了,但是这样我们会发现一个事实,那就是这个式子所代表的意义是Y的每个特征都于X所有的特征相关联,而它本身之间却没有联系。回归原点,如果将X和Y同等对待,考虑他们之间的相关性可以吗?可以的,Pearson告诉已经了我们:
可以求出u和v的方差,协方差为
之后带入原式就可以了,所以我们新的代价函数就为:
为了避免a和b同时扩大n倍后仍然产生符合条件的解,所以和 SVM一样,固定分母,优化分子,即损失函数变为:
求解上式有2种方法:
1.拉格拉日:
构造拉格朗日算子:
分别对a,b求导,可得:
发现竟然和损失函数一样,那么只要找出最大的
2.奇异值分解(Singular Value Decomposition,SVD)
CCA应用:
CCA参数说明:
CCA(copy=True, max_iter=500, n_components=2, scale=True, tol=1e-06)
copy=True:是否复制
max_iter=500:迭代数阈值
n_components=2:组成树
scale=True:是否分割数据
tol=1e-06:迭代容忍度
- 1
- 2
- 3
- 4
- 5
sklearn作CCA:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cross_decomposition import CCA
n = 500
#两种噪音
l1 = np.random.normal(size=n)
l2 = np.random.normal(size=n)
latents = np.array([l1, l1, l2, l2]).T
X = latents + np.random.normal(size=4 * n).reshape((n, 4))
Y = latents + np.random.normal(size=4 * n).reshape((n, 4))
X_train = X[:n // 2]#切分数据集
Y_train = Y[:n // 2]
X_test = X[n // 2:]
Y_test = Y[n // 2:]
#计算相关系数Corr
print("Corr(X)")
print(np.round(np.corrcoef(X.T), 2))
print("Corr(Y)")
print(np.round(np.corrcoef(Y.T), 2))
cca = CCA(n_components=2)
cca.fit(X_train, Y_train)
X_train_r, Y_train_r = cca.transform(X_train, Y_train)
X_test_r, Y_test_r = cca.transform(X_test, Y_test)
plt.scatter(X_train_r[:, 0], X_train_r[:, 1], label="train",
marker="*", c="b", s=50)
plt.scatter(X_test_r[:, 0], X_test_r[:, 1], label="test",
marker="*", c="r", s=50)
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
>
Corr(X)
[[ 1. 0.46 0.02 0.04]
[ 0.46 1. 0.03 -0.06]
[ 0.02 0.03 1. 0.51]
[ 0.04 -0.06 0.51 1. ]]
Corr(Y)
[[ 1. 0.49 -0.07 -0.11]
[ 0.49 1. 0.03 -0.02]
[-0.07 0.03 1. 0.57]
[-0.11 -0.02 0.57 1. ]]
用户须知 |
---|
评论记录:
回复评论: