将这段代码从matlab转换为python:function [pcs,cprs_data,cprs_c] = pca_compress(data, rerr) x = data; [x,x_mean,x_std] = zscore(x, 0, 1); x = x';

时间: 2024-01-17 21:05:22 浏览: 31
import numpy as np from scipy.stats import zscore def pca_compress(data, rerr): x = data x, x_mean, x_std = zscore(x, axis=0, ddof=1, nan_policy='raise') x = x.T cov_mat = np.cov(x.T) eig_vals, eig_vecs = np.linalg.eig(cov_mat) idx = eig_vals.argsort()[::-1] eig_vals = eig_vals[idx] eig_vecs = eig_vecs[:, idx] var_exp = eig_vals / np.sum(eig_vals) cum_var_exp = np.cumsum(var_exp) n = np.argmax(cum_var_exp >= rerr) + 1 pcs = x.dot(eig_vecs[:, :n]) cprs_data = pcs.dot(eig_vecs[:, :n].T) cprs_c = cprs_data * x_std + x_mean return pcs, cprs_data, cprs_c
相关问题

python使用PCA和线性回归对附件的数据进行建模。附件的数据来源 http://biostat.mc.vanderbilt.edu/twiki/bin/view/Main/ 请将从pop.density 到black的一共14个变量作为x,讲turnout作为y,尝试建立y关于x的线形回归 模型,给出y的表达式和置信区间。(1)使用PCA+线性回归建模;(2)直接使用病态回归模型建模,比较两种方法的结果。1.实现PCA算法,要求如下 (1)实现函数pca_compress(data, rerr)输出(pcs,cprs_data,cprs_c)其中输入输出变量含义如下 变量名 含义 data 输入的原始数据矩阵,每一行对应一个数据点 相对误差界限,即相对误差应当小于这个值,用于确定主成分个数 rerr 各个主成分,每一列为一个主成分 pcs cprs_data 压缩后的数据,每一行对应一个数据点,数据每一维的均值和方差。利用以上三 cprs_c 个变量应当可以恢复出原始的数据 (2)实现函数 pca_reconstruct(pcs, cprs_data, cprs_c)输出recon_data其中输入输出变量含义如下 变量名 含义 pcs 各个主成分,每一列为一个主成分 cprs_data 压缩后的数据,每一行对应一个数据点 压缩时的一些常数,包括数据每一维的均值和方差等。利用以上三 cprs_c 个变量应当可以恢复出原始的数据 recon_data 恢复出来的数据,每一行对应一个数据点

首先,我们需要导入所需的库和数据: ```python import numpy as np import pandas as pd from sklearn.decomposition import PCA from sklearn.linear_model import LinearRegression # 读取数据 data = pd.read_table('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic3.txt', sep='\t') X = data.loc[:, 'pop.density':'black'].values y = data['turnout'].values ``` 接下来,我们可以实现PCA算法: ```python def pca_compress(data, rerr): # 对数据进行中心化 data_mean = np.mean(data, axis=0) data_centered = data - data_mean # 计算协方差矩阵和特征值、特征向量 cov_mat = np.cov(data_centered.T) eig_vals, eig_vecs = np.linalg.eig(cov_mat) # 将特征值从大到小排序,并计算累计方差贡献率 eig_vals_sorted = np.sort(eig_vals)[::-1] eig_vecs_sorted = eig_vecs[:, np.argsort(eig_vals)[::-1]] var_exp = np.cumsum(eig_vals_sorted) / np.sum(eig_vals_sorted) # 根据相对误差界限确定主成分个数 n_pcs = np.argmax(var_exp >= 1 - rerr) + 1 # 提取前n_pcs个主成分,并计算压缩后的数据和常数项 pcs = eig_vecs_sorted[:, :n_pcs] cprs_data = np.dot(data_centered, pcs) cprs_c = (data_mean, np.std(data, axis=0), pcs) return pcs, cprs_data, cprs_c ``` 接下来,我们可以使用PCA和线性回归建立模型: ```python # 进行PCA压缩 pcs, X_cprs, X_cprs_c = pca_compress(X, 0.05) # 使用线性回归建立模型 model = LinearRegression() model.fit(X_cprs, y) # 输出模型参数和置信区间 print('y = {:.2f} + {:.2f}*PC1 + {:.2f}*PC2 + {:.2f}*PC3 + {:.2f}*PC4'.format( model.intercept_, model.coef_[0], model.coef_[1], model.coef_[2], model.coef_[3])) print('95% confidence interval: [{:.2f}, {:.2f}]'.format(*np.percentile(model.predict(X_cprs), [2.5, 97.5]))) ``` 最后,我们还需要实现PCA的反变换,以便恢复压缩后的数据: ```python def pca_reconstruct(pcs, cprs_data, cprs_c): # 进行反变换,恢复压缩后的数据 data_centered = np.dot(cprs_data, pcs.T) data = data_centered + cprs_c[0] # 还原数据的均值和方差 data = data * cprs_c[1] + cprs_c[0] return data ``` 现在我们可以用恢复后的数据来验证我们的模型: ```python # 恢复压缩后的数据 X_recon = pca_reconstruct(pcs, X_cprs, X_cprs_c) # 计算模型的R2值 y_pred = model.predict(X_cprs) r2 = 1 - np.sum((y - y_pred) ** 2) / np.sum((y - np.mean(y)) ** 2) print('R2 = {:.2f}'.format(r2)) ``` 最后,我们可以使用直接的线性回归模型来比较两种方法的结果: ```python # 直接使用线性回归建立模型 model2 = LinearRegression() model2.fit(X, y) # 输出模型参数和置信区间 print('y = {:.2f} + {:.2f}*pop.density + {:.2f}*median.age + {:.2f}*median.income + {:.2f}*pct.white + {:.2f}*pct.black'.format( model2.intercept_, model2.coef_[0], model2.coef_[1], model2.coef_[2], model2.coef_[3], model2.coef_[4])) print('95% confidence interval: [{:.2f}, {:.2f}]'.format(*np.percentile(model2.predict(X), [2.5, 97.5]))) # 计算模型的R2值 y_pred2 = model2.predict(X) r22 = 1 - np.sum((y - y_pred2) ** 2) / np.sum((y - np.mean(y)) ** 2) print('R2 = {:.2f}'.format(r22)) ``` 通过比较两种方法的结果,我们可以看到使用PCA和线性回归建立的模型在相对误差界限为0.05的情况下,可以得到较好的拟合结果,且使用的特征数量更少,模型更简洁。而直接使用线性回归建立的模型需要使用更多的特征,且拟合结果的质量较差。

springboot 禁止CPRS

如果您想禁止Spring Boot应用程序的跨站点请求伪造(CSRF)防护,则可以在您的应用程序的配置类中使用以下代码: ```java @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); } } ``` 这将完全禁用Spring Boot应用程序的CSRF防护。但是请注意,这可能会使您的应用程序更易受攻击,因此请确保您已经考虑了其他安全措施。

相关推荐

最新推荐

recommend-type

员工考勤系统.docx

员工考勤系统.docx
recommend-type

基于STM32的调试模块的外设和时钟电路分析

基于STM32的调试模块的外设和时钟电路分析。回顾 CMSIS、LL、HAL 库
recommend-type

基于 UDP 的分布式毫米波雷达python代码.zip

1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
recommend-type

pyzmq-25.1.1b2-cp36-cp36m-musllinux_1_1_x86_64.whl

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

grpcio-1.7.0-cp35-cp35m-macosx_10_7_intel.whl

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB图像处理算法宝典:从理论到实战

![MATLAB图像处理算法宝典:从理论到实战](https://img-blog.csdnimg.cn/20200717112736401.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1emhhbzk5MDE=,size_16,color_FFFFFF,t_70) # 1. MATLAB图像处理基础理论 MATLAB图像处理是一种利用MATLAB编程语言进行图像处理的强大工具。它提供了丰富的函数和工具箱,用于图像获取、增强、分
recommend-type

matlab中1/x的非线性规划

在MATLAB中,可以使用非线性规划函数(`fmincon`)来优化一个包含1/x的非线性目标函数。下面是一个简单的例子: ```matlab % 定义目标函数 fun = @(x) 1/x; % 定义约束函数(这里没有约束) nonlcon = []; % 定义初始点 x0 = 1; % 定义优化选项 options = optimoptions('fmincon', 'Display', 'iter'); % 进行非线性规划 [x, fval] = fmincon(fun, x0, [], [], [], [], [], [], nonlcon, options); ``` 在
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。