精华内容
下载资源
问答
  • sklearn 的 cca 看不懂,自己实现了一下 参考:《数学建模算法与应用》 def cca(x, y): ''' ... 输出一个excel('典型相关分析输出结果.xlsx'): X组的典型相关变量_系数 Y组的典型相关变量_系数

    sklearncca 看不懂,于是自己实现了一下
    参考:《数学建模算法与应用》

    def cca(x, y):
        import numpy as np
        import pandas as pd
        from scipy import stats  # 计算p值
        '''
        输入:
            x:X组的矩阵/DataFrame,行是样本,列是变量
            y:Y组的矩阵/DataFrame,行是样本,列是变量
            注:列名不能相同,否则会报错
        输出:
            输出一个excel('典型相关分析输出结果.xlsx'):
            X组的典型相关变量_系数
            Y组的典型相关变量_系数
            xu的相关系数; xv的相关系数; yv的相关系数; yu的相关系数
            解释百分比
            显著性检验
        '''
        r = x.join(y).corr()  # 计算x和y合并后的相关系数
        n1 = x.shape[1]  # X组变量个数
        n2 = y.shape[1]  # Y组变量个数
    
        r = np.array(r)  # X和Y的相关系数转为矩阵
        num = min(n1, n2)
        s1 = r[:n1, :n1]  # 提出X与X的相关系数
        s2 = r[n1:, n1:]  # 提出Y与Y的相关系数
        s12 = r[:n1, n1:]  # 提出X与Y的相关系数
        s21 = s12.T  # Y与X的相关系数
    
        m1 = np.linalg.inv(s1).dot(s12).dot(np.linalg.inv(s2)).dot(s21)  # 计算矩阵M1
        m2 = np.linalg.inv(s2).dot(s21).dot(np.linalg.inv(s1)).dot(s12)  # 计算矩阵M2
    
        writer = pd.ExcelWriter('典型相关分析输出结果.xlsx')  # 打开excel文件
    
        # ---------------------------计算X组的典型相关向量和典型相关系数------------------------
        [val1, vec1] = np.linalg.eig(m1)  # M1的特征值vec1和特征向量val1
        val1 = val1.real;
        vec1 = vec1.real
        for i in range(n1):
            # 特征向量归一化,满足a's1a=1
            vec1[:, i] = vec1[:, i] / np.sqrt(vec1[:, i].T.dot(s1).dot(vec1[:, i]))
            # 特征向量乘+-1,保证所有分量为正
            vec1[:, i] = vec1[:, i] / np.sign(np.sum(vec1[:, i]))
    
        val1 = np.sqrt(val1[val1 > 0])  # 计算特征值的平方根
        val1, ind1 = np.sort(val1, axis=0)[::-1], np.argsort(-val1, axis=0)  # 按照从大到小排列
    
        a = vec1[:, ind1.flatten()[:num]]  # 取出x组的系数阵a
        dcoef1 = val1.flatten()[:num]  # 提出典型相关系数
        save1 = pd.DataFrame(a, columns=['u%s' % i for i in range(1, num + 1)],
                             index=['x%s' % i for i in range(1, n1 + 1)])  # 转为DataFrame
        print('X组的系数阵/典型相关变量:');
        display(save1)
        save1.loc['典型相关系数'] = dcoef1
        save1.to_excel(writer, 'X组的典型相关变量_系数')  # 系数矩阵
    
        # ----------------------------计算Y组的典型相关向量和典型相关系数-------------------------
        [val2, vec2] = np.linalg.eig(m2)  # m2的特征值vec2和特征向量val2
        val2 = val2.real
        vec2 = vec2.real  # 这里得到的结果是复数,所以要提取为实数
    
        for i in range(n2):
            # 特征向量归一化,满足b's2b=save2
            vec2[:, i] = vec2[:, i] / np.sqrt(vec2[:, i].T.dot(s2).dot(vec2[:, i]))
            # 特征向量乘+-1,保证所有分量为正
            vec2[:, i] = vec2[:, i] / np.sign(np.sum(vec2[:, i]))
    
        val2 = np.sqrt(val2[val2 > 0])  # 计算特征值的平方根
        val2, ind2 = np.sort(val2)[::-1], val2.argsort()[::-1]  # 选出大于0的,并从大到小排序得到索引
    
        b = vec2[:, ind2[:num]]  # 取出x组的系数阵a
        dcoef2 = val2[:num]  # 提出典型相关系数
        save2 = pd.DataFrame(b, columns=['v%s' % i for i in range(1, num + 1)],
                             index=['y%s' % i for i in range(1, n2 + 1)])  # 转为DataFrame
        print('Y组的系数阵/典型相关变量:');
        display(save2)
        print('典型相关系数:');
        print(dcoef2)
        save2.loc['典型相关系数'] = dcoef2
        save2.to_excel(writer, 'Y组的典型相关变量_系数')  # 系数矩阵
    
        # ------------------------------计算原始变量和典型变量的相关系数---------------------------
        rxu = s1.dot(a)  # xu的相关系数
        ryv = s2.dot(b)  # yv的相关系数
        rxv = s12.dot(b)  # xv的相关系数
        ryu = s21.dot(a)  # yu的相关系数
        x_index = ['x%s' % i for i in range(1, n1 + 1)]
        y_index = ['y%s' % i for i in range(1, n2 + 1)]
        u_col = ['u%s' % i for i in range(1, num + 1)]
        v_col = ['v%s' % i for i in range(1, num + 1)]
        pd.DataFrame(rxu, columns=u_col, index=x_index).to_excel(writer, 'xu的相关系数')
        pd.DataFrame(rxv, columns=v_col, index=x_index).to_excel(writer, 'xv的相关系数')
        pd.DataFrame(ryv, columns=v_col, index=y_index).to_excel(writer, 'yv的相关系数')
        pd.DataFrame(ryu, columns=u_col, index=y_index).to_excel(writer, 'yu的相关系数')
    
        # -------------------------------计算解释的方差比例----------------------------------------
        mu = np.sum(rxu ** 2) / n1;
        print('*x组原始变量被u_i解释的方差比例:', format(mu, '.2%'))
        mv = np.sum(rxv ** 2) / n1;
        print('x组原始变量被v_i解释的方差比例:', format(mv, '.2%'))
        nv = np.sum(ryv ** 2) / n2;
        print('*y组原始变量被v_i解释的方差比例:', format(nv, '.2%'))
        nu = np.sum(ryu ** 2) / n2;
        print('y组原始变量被u_i解释的方差比例:', format(nu, '.2%'))
        pd.DataFrame([mu, mv, nv, nu], index=['u解释x', 'v解释x', 'v解释y', 'u解释y']).to_excel(writer, '解释百分比')
    
        # -------------------------------典型相关系数的卡方检验------------------------------------
        # 典型相关系数就是特征值,逐一对典型相关系数做检验
        jianyan = pd.DataFrame(columns=['自由度', '卡方计算值', '卡方临界值(0.05显著水平)', 'P值'], index=range(1, num + 1))
        for j in range(num):  # 遍历num个典型相关系数
            k = j + 1;
            n = len(x)  # 第k个λ,n是样本量
            prod_lamuda = np.prod([1 - i ** 2 for i in dcoef1[j:]])  # 拉姆达连乘
            df = (n1 - k + 1) * (n2 - k + 1)  # 自由度
            Q = -(n - k - 0.5 * (n1 + n2 + 1)) * np.log(prod_lamuda)  # 统计量
            p_value = 1 - stats.chi2.cdf(Q, df)  # p值
            jianyan.loc[k, '自由度'] = df
            jianyan.loc[k, '卡方计算值'] = Q
            jianyan.loc[k, '卡方临界值(0.05显著水平)'] = stats.chi2.ppf(0.95, df)
            jianyan.loc[k, 'P值'] = p_value
        display(jianyan)
        jianyan.to_excel(writer, '显著性检验')
        writer.save()  # 保存excel文件
    
    
    if __name__ == '__main__':
        x1 = pd.DataFrame(np.array([[1.03, 0.42], [1.34, 0.13], [1.07, 0.4], [-0.43, 0.19], [-0.53, 0.25], [-0.11, 0.07]]),
                          columns=['x1', 'x2'])
        y1 = pd.DataFrame(np.array([[4.562305e+04, 2.500000e+00, 8.439000e+03], [5.225667e+04, 1.300000e+00, 1.857900e+04],
                                    [4.655187e+04, 1.130000e+00, 1.044500e+04], [2.814676e+04, 1.380000e+00, 7.813000e+03],
                                    [3.867043e+04, 1.200000e-01, 8.980000e+03],
                                    [2.631696e+04, 1.370000e+00, 6.609000e+03]]),
                          columns=['y1', 'y2', 'y3'])
        cca(x1, y1)
    

    在这里插入图片描述

    输出结果:
    在这里插入图片描述
    excel内容展示:
    在这里插入图片描述

    展开全文
  • python 典型变量分析

    千次阅读 2018-04-18 11:17:01
    典型相关分析1.典型相关分析的基本思想是首先在每组变量中找出变量的线性组合,使其具有最大相关性,然后再在每组变量中找出第二对线性组合,使其分别与第一对线性组合不相关,而第二对本身具有最大的相关性,如此...

    典型相关分析

    1.典型相关分析的基本思想是首先在每组变量中找出变量的线性组合,使其具有最大相关性,然后再在每组变量中找出第二对线性组合,使其分别与第一对线性组合不相关,而第二对本身具有最大的相关性,如此继续下去,直到两组变量之间的相关性被提取完毕为止.有了这样线性组合的最大相关,则讨论两组变量之间的相关,就转化为只研究这些线性组合的最大相关,从而减少研究变量的个数.






    #典型变量分析得到第一典型变量
    def CAA(X,Y):
    	R= corrcoef(X,Y,rowvar=0)
    	m, n = shape(X)
    	p, q = shape(Y)
    	# print(m,n)
    	# print(p,q)
    
    	R11=[]
    	R22=[]
    	R12=[]
    
    #计算相关系数
    	for i in range(n):
    		temp=R[i]
    		a=temp[0:n]
    		R11.append(a)
    
    	for j in range(n,n+q):
    		temp=R[j]
    		a=temp[n:n+q]
    		R22.append(a)
    
    	for s in range(n):
    		temp=R[s]
    		a=temp[n:n+q]
    		R12.append(a)
    
    	R11=matrix(R11)
    
    	R22 = matrix(R22)
    	R12 = matrix(R12)
    	R21=R12.T
    
    #计算特征值与特征向量
    	M=(R11.I)*(R12)*(R22.I)*(R21)
    	eigVals, eigVects = linalg.eig(mat(M))  # 计算特征值和特征向量
    	eigValInd = sorted(eigVals,reverse=True)  # 对特征值eigVals从大到小排序
    	sorted_indices = np.argsort(-eigVals)#根据特征值的顺序排列相应的特征向量
    	topk_evecs = eigVects[:, sorted_indices[:]]
    	eig=sqrt(eigValInd)#计算特征值开平方
    	# print("特征值开方=",eig)
    
    #计算第一对典型变量的相应的系数
    	k,l=shape(topk_evecs)
    	cout_t=[]
    	for i in range(l):
    		t=1.0/((topk_evecs[:,i].T)*R11*(topk_evecs[:,i]))
    		cout_t.append(t[0,0])
    	# print("cout_t=", cout_t)
    	tt=[sqrt(i) for i in cout_t]
    	# print("tt=",tt)
    
    	a1=tt[0]*topk_evecs[:,0]#第一个特征值开方所对应的特征向量
    	p1=(1.0/eig[0])*(R22.I)*R21*a1#第一个特征值开方所对应的特征向量
    	print("特征值开方=", real(eig[0]))
    	# print("a1=",a1)
    	# print("p1=",p1)
    	# print("a1.shape=", shape(a1))
    	# print("p1.shape=",shape(p1))
    
    	#进行显著性检验
    	U1 = []
    	V1 = []
    	A=1
    	for i in range(len(eigVals)):
    		A*=(1-eigVals[i])
    	Q1=-(m-1-1.0/2*(n+q+1))*log(A)
    	# print("Q1=",Q1)
    	if Q1>7.81:
    
    		# print("第一主成分为显著性关联")
    		for i in range(m):
    			temp1 = 0
    			for j in range(n):
    				temp1+=a1[j]*X[i,j]
    			# print(temp1)
    			U1.append(temp1[0,0])
    
    		for i in range(p):
    			temp2 = 0
    			for j in range(q):
    				temp2+= p1[j] * Y[i, j]
    			V1.append(temp2[0,0])
    
    		# print("U1,VI=",U1,V1)
    	else:
    		print("第一主成分不显著关联")
    
    	# A2=1
    	# for i in range(1,len(eigVals)):
    	# 	A2*=(1-eigVals[i])
    	# Q2 = -(m - 2 - 1.0 / 2 * (n + q + 1)+1.0/(sqrt(eig[0]))) * log(A2)
    	# print("Q2=", Q2)
    	# if Q2>37.65:
    	# 	print("第二主成分为显著性关联")
    	# else :
    	# 	print("第二主成分不显著关联")
    	#
    	# A3=1
    	# for i in range(2,len(eigVals)):
    	# 	A3*=(1-eigVals[i])
    	# Q3= -(m - 3 - 1.0 / 2 * (n + q + 1)) * log(A3)
    	# print("Q3=", Q3)
    	# if Q3>26.3:
    	# 	print("第三主成分为显著性关联")
    	# else :
    	# 	print("第三主成分不显著关联")
    	return U1,V1,eig[0]
    

    展开全文
  • 典型相关分析matlab实现代码 Python - 100天从新手到大师 by 骆昊 Python应用领域和就业形势分析 简单的说,Python是一个“优雅”、“明确”、“简单”的编程语言。 学习曲线低,适合非专业人士 开源系统,拥有强大...
  • 典型相关分析matlab实现代码 Python - 100天从新手到大师 Python应用领域和就业形势分析 简单的说,Python是一个“优雅”、“明确”、“简单”的编程语言。 学习曲线低,适合非专业人士 开源系统,拥有强大的生态圈 ...
  • 典型相关分析matlab实现代码 Python - 100天从新手到大师 作者:骆昊 Python应用领域和就业形势分析 简单的说,Python是一个“优雅”、“明确”、“简单”的编程语言。 学习曲线低,非专业人士也能上手 开源系统,...
  • 典型相关分析matlab实现代码 Python - 100天从新手到大师 作者:骆昊 Python应用领域和就业形势分析 简单的说,Python是一个“优雅”、“明确”、“简单”的编程语言。 学习曲线低,非专业人士也能上手 开源系统,...
  • 典型相关分析matlab实现代码 Python - 100天从新手到大师 作者:骆昊 Python应用领域和就业形势分析 简单的说,Python是一个“优雅”、“明确”、“简单”的编程语言。 学习曲线低,非专业人士也能上手 开源系统,...
  • 典型相关分析matlab实现代码 Python - 100天从新手到大师 作者:骆昊 Python应用领域和就业形势分析 简单的说,Python是一个“优雅”、“明确”、“简单”的编程语言。 学习曲线低,非专业人士也能上手 开源系统,...
  • 典型相关分析matlab实现代码 Python - 100天从新手到大师 Python应用领域和就业形势分析 简单的说,Python是一个“优雅”、“明确”、“简单”的编程语言。 学习曲线低,非专业人士也能上手 开源系统,拥有强大的...
  • 典型相关分析matlab实现代码 Python第三方库安装,点击链接 ,搜索所需的三方库的.whl文件,下载完成后修改为.zip,解压后将文件保存在python的lib,libs文件下 Python - 100天从新手到大师 转载 Python应用领域和...
  • 典型相关分析matlab实现代码 Python - 100天从新手到大师 作者:骆昊 说明:最近有很多想学习Python的小伙伴申请单独加我微信和QQ,因为我自己平时也很忙,没办法一一解答大家的问题,我创建了Python100天学习交流3...
  • 典型相关分析matlab实现代码 Python - 100天从新手到大师 作者:骆昊 Python应用领域和就业形势分析 简单的说,Python是一个“优雅”、“明确”、“简单”的编程语言。 学习曲线低,非专业人士也能上手 开源系统,...
  • 典型相关分析matlab实现代码 Python - 100天从新手到大师 作者:骆昊 说明:最近有很多想学习Python的小伙伴申请单独加我微信和QQ,因为我自己平时也很忙,没办法一一解答大家的问题,我创建了Python100天学习交流3...
  • 典型相关分析matlab实现代码 Python - 100天从新手到大师 作者:骆昊 说明:最近有很多想学习Python的小伙伴申请单独加我微信和QQ,因为我自己平时也很忙,没办法一一解答大家的问题,我创建了Python100天学习交流2...
  • 典型相关分析matlab实现代码 python ======== python资源集合,持续更新。。。 。 目录 ======== 具体内容 ============================= ======== 网页框架 Django - Django。 - Channels旨在增强Django的异步能力...
  • 典型相关分析matlab实现代码 python Python 开源库及示例代码 Table of Contents 说明 1 算法 1.1 字符串 1.1.1 正则表达式 1.1.2 字符集 1.1.3 (其它) 1.2 编码 & 解码 1.2.1 base64 1.2.2 UUencode 1.2.3 BinHex...
  • 典型相关分析matlab实现代码 Python - 100天从新手到大师 作者:骆昊 最近有很多想学习Python的小伙伴陆陆续续加入我们的交流群,目前我们的交流群人数已经超过一万人。我们的目标是打造一个优质的Python交流社区,...
  • 典型相关分析matlab实现代码 Python - 100天从新手到大师 作者:骆昊 Python应用领域和就业形势分析 简单的说,Python是一个“优雅”、“明确”、“简单”的编程语言。 学习曲线低,非专业人士也能上手 开源系统,...
  • 典型相关分析matlab实现代码 Python - 100天从新手到大师 作者:骆昊 Python应用领域和就业形势分析 简单的说,Python是一个“优雅”、“明确”、“简单”的编程语言。 学习曲线低,非专业人士也能上手 开源系统,...
  • 典型相关分析matlab实现代码 Python - 100天从新手到大师 Python应用领域和就业形势分析 简单的说,Python是一个“优雅”、“明确”、“简单”的编程语言。 学习曲线低,适合非专业人士 开源系统,拥有强大的生态圈 ...
  • 典型相关分析matlab实现代码 Python - 100天从新手到大师 作者:骆昊 Python应用领域和就业形势分析 简单的说,Python是一个“优雅”、“明确”、“简单”的编程语言。 学习曲线低,适合非专业人士 开源系统,拥有...
  • 典型相关分析matlab实现代码 Python - 100天从新手到大师 作者:骆昊 说明:最近有很多想学习Python的小伙伴申请单独加我微信和QQ,因为我自己平时也很忙,没办法一一解答大家的问题,我创建了Python100天学习交流3...
  • 典型相关分析matlab实现代码 Python - 100天从新手到大师 Python应用领域和就业形势分析 简单的说,Python是一个“优雅”、“明确”、“简单”的编程语言。 学习曲线低,适合非专业人士 开源系统,拥有强大的生态圈 ...
  • 典型相关分析matlab实现代码 Python教学大纲 Python应用领域和就业形势分析 Python语言自身的优势:优雅、明确、简单。 学习曲线低,尤其适合非专业人士 开源软件,大量的三方库和强大的生态圈 解释型语言,完美的...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 269
精华内容 107
关键字:

python典型相关分析

python 订阅