Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用矢量化通过Pandas转换R函数插入符号::findCorrelation与Python 3的关系

使用矢量化通过Pandas转换R函数插入符号::findCorrelation与Python 3的关系
EN

Stack Overflow用户
提问于 2017-01-20 02:27:11
回答 1查看 702关注 0票数 2

R函数caret::findCorrelation搜索相关矩阵并返回与变量对应的整数向量,如果删除,将减少其余变量之间的成对相关性。下面是这个函数的R代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function (x, cutoff = 0.9, verbose = FALSE, names = FALSE, exact = ncol(x) < 
100) 
 {
  if (names & is.null(colnames(x))) 
    stop("'x' must have column names when `names = TRUE`")
  out <- if (exact) 
    findCorrelation_exact(x = x, cutoff = cutoff, verbose = verbose)
  else findCorrelation_fast(x = x, cutoff = cutoff, verbose = verbose)
  out
  if (names) 
    out <- colnames(x)[out]
  out
}

以及函数findCorrelation_fast,它是我感兴趣的函数(去掉了可选参数):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
findCorrelation_fast <- function(x, cutoff = .90)
{
 if(any(!complete.cases(x)))
 stop("The correlation matrix has some missing values.")
 averageCorr <- colMeans(abs(x))
 averageCorr <- as.numeric(as.factor(averageCorr))
 x[lower.tri(x, diag = TRUE)] <- NA
 combsAboveCutoff <- which(abs(x) > cutoff)

 colsToCheck <- ceiling(combsAboveCutoff / nrow(x))
 rowsToCheck <- combsAboveCutoff %% nrow(x)

 colsToDiscard <- averageCorr[colsToCheck] > averageCorr[rowsToCheck]
 rowsToDiscard <- !colsToDiscard

 deletecol <- c(colsToCheck[colsToDiscard], rowsToCheck[rowsToDiscard])
 deletecol <- unique(deletecol)
 deletecol
}

在熊猫的帮助下,我正在编写一个函数来模仿Python 3中这个函数的意图。我的实现包含一个嵌套的for循环,据我所知,这并不是实现所需结果的最有效方法。原始的R函数不需要任何循环就能完成任务。

我的两个问题是:

  1. 基于下面的实现,是否有一种Pythonic方法将嵌套的for循环替换为向量化的实现?
  2. 与(1)相关的是,R函数findCorrelation_fast使用行averageCorr <- as.numeric(as.factor(averageCorr))。这种结构对我来说似乎是非常陌生的,也是成功实施掠夺者R的关键。有人能弄清楚这条线在干什么吗?我的直觉告诉我,它非常聪明,利用了R的一些独特的行为。

我的Python实现及其使用示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import pandas as pd

# calculate pair-wise correlations

def findCorrelated(corrmat, cutoff = 0.8):    

### search correlation matrix and identify pairs that if removed would reduce pair-wise correlations
# args:
    # corrmat: a correlation matrix
    # cutoff: pairwise absolute correlation cutoff
# returns:
    # variables to removed

    if(len(corrmat) != len(corrmat.columns)) : return 'Correlation matrix is not square'
    averageCorr = corrmat.abs().mean(axis = 1)

    # set lower triangle and diagonal of correlation matrix to NA
    corrmat = corrmat.where(np.triu(np.ones(corrmat.shape)).astype(np.bool))
    corrmat.values[[np.arange(len(corrmat))]*2] = None 

    # where a pairwise correlation is greater than the cutoff value, check whether mean abs.corr of a or b is greater and cut it
    to_delete = list()
    for col in range(0, len(corrmat.columns)):
        for row in range(0, len(corrmat)):
            if(corrmat.iloc[row, col] > cutoff):
                if(averageCorr.iloc[row] > averageCorr.iloc[col]): to_delete.append(row)
                else: to_delete.append(col)

    to_delete = list(set(to_delete))

    return to_delete

# generate some data
df = pd.DataFrame(np.random.randn(50,25))

# demonstrate usage of function    
removeCols = findCorrelated(df.corr(), cutoff = 0.01) #set v.low cutoff as data is uncorrelated
print('Columns to be removed:')
print(removeCols)
uncorrelated = df.drop(df.index[removeCols], axis =1, inplace = False)
print('Uncorrelated variables:')
print(uncorrelated)
EN

回答 1

Stack Overflow用户

发布于 2021-02-08 14:14:09

四年前被问到了,但是我正在寻找一个python实现,来自R自己。

对于2:as.numeric(as.factor(x))提供x的每个值的秩顺序。

as.factor()分解相关值,按数字上升的顺序分配它们的级别,本质上是生成数字的字符,但保持它们的相对顺序。

然后,as.numeric()将有序的级别/字符转换为数字,因此x的最低值现在是1,最高的值是length(unique(x))。如果有关联,它们将具有相同的整数值,因为它们将被分配到与as.factor()相同的级别/级别。

注意,这个片段不适用于矩阵,只适用于向量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41761332

复制
相关文章
windows操作系统在SQL Server 创建表的方法
我们的数据库是一个任务跟踪数据库,那我们就建立一个名为 “Tasks” 的表。该表将持有的所有任务 – 一个重要的属性状态。然后,我们可以创建另一个表名为 “Status” 。这样在后面的操作中,我们可以针对不同表进行查询操作,找出工作需要做什么和给定的状态等。
用户8965210
2021/09/02
1.6K0
SAP HANA SLT在表中隐藏字段并传入HANA的方法
SLT是在NetWeaver平台上运行的SAP Landscape Transformation Replication Server(SLT)。
matinal
2020/11/27
3.1K0
VNC创建Centos并配置它的网络链接
选择语言滑到最底下找到中文,如果无法滑动按住键盘的左Ctrl键退出到windows再滑动点击
余生大大
2022/11/02
5870
VNC创建Centos并配置它的网络链接
在PowerBI中创建时间表(非日期表)
在powerquery中创建日期表是使用powerbi过程中一个必不可少的内容(当然,你也可以使用DAX来创建):
陈学谦
2020/07/01
4.4K0
在PowerBI中创建时间表(非日期表)
ClickHouse的副本以及分布式表的创建(九)
副本的目的主要是保障数据的高可用性,即使一台 ClickHouse 节点宕机,那么也可以从 其他服务器获得相同的数据。
Java技术债务
2022/08/09
1.2K0
SQLite 创建表的方法
SQLite 的 CREATE TABLE 语句用于在任何给定的数据库创建一个新表。创建基本表,涉及到命名表、定义列及每一列的数据类型。
用户4988085
2021/09/17
2.4K0
Hive 中内部表与外部表的区别与创建方法
先来说下Hive中内部表与外部表的区别: Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径, 不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除, 而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。 需要注意的是传统数据库对表数据验证是 schema on write(写时模式),而 Hive 在load时是不检查数据是否 符合schema的,hive 遵循的是 s
用户1177713
2018/02/24
2.6K0
在Servlet的init方法中创建线程
 servlet代码如下: package com.weichat.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.se
庞小明
2018/03/07
2.8K0
在windows系统下的SQL Server 创建数据库方法
SQL Server创建数据库的方法有两种:一种是通过运行 SQL 脚本;另一种是直接使用 SQL Server 管理套件即可创建数据库,在本节中我们使用的是后一种方法。
用户8965210
2021/08/31
1.4K0
【SAP HANA系列】SAP HANA SLT在表中隐藏字段并传入HANA的方法
SLT是在NetWeaver平台上运行的SAP Landscape Transformation Replication Server(SLT)。
matinal
2020/11/12
2.5K0
【SAP HANA系列】SAP HANA SLT在表中隐藏字段并传入HANA的方法
在tensorflow中安装并启动jupyter的方法
博主遇到一个问题,在anaconda中安装并配置好tensorflow和opencv后,直接输入
狼啸风云
2019/01/18
3K0
在MySQL中创建Oracle中的dept、emp、bonus、salgrade表
Oracle数据库中自带的4张表: dept、emp、bonus和salgrade是练习SQL查询的经典案例表,本文提供在MySQL中建这4张表的SQL语句
CoderJed
2018/09/13
6.7K0
在 VMWare Player 中创建 Windows Server 虚拟机
这是设置完整的 Microsoft Windows Server 2016 的快速分步指南。
网络技术联盟站
2022/04/05
8450
在 VMWare Player 中创建 Windows Server 虚拟机
Eclipse它仙人板板创建Tomcat server 各种卡死
有人说是这样的: 1.退出 eclipse 2.到[工程目录下]/.metadata/.plugins/org.eclipse.core.runtime 3.把org.eclipse.wst.server.core.prefs和 org.eclipse.jst.server.tomcat.core.prefs这两个文件去掉 4.重启eclipse 但是删除掉还是卡死。 这个server你要配的..位置在Preferences-server -Installed runtimes....增加上你想配的serv
小柒2012
2018/04/13
8580
PowerShell:在 Windows 中创建并导出自签名证书
证书是一种包含公钥和一些识别信息的文件。在PKI中,证书是由可信任的第三方(称为证书颁发机构,CA)颁发的,CA证明了证书持有者的身份以及与之关联的公钥。然而,我们也可以创建自签名证书,即由证书持有者自己(而不是CA)签名的证书。
运维开发王义杰
2023/08/10
2.4K0
PowerShell:在 Windows 中创建并导出自签名证书
sql 创建表_sql server建表语句
在线Sqlite查看器|修改器 http://lzltool.com/sqlite-viewer
全栈程序员站长
2022/11/17
2.2K0
sql 创建表_sql server建表语句
SQL Server 表中相关操作
SQL Server 表中记录更新操作 一、 实验目的
跋扈洋
2021/01/28
1.1K0
数据库中创建表的语句_创建基本表学生表的sql语句
在线Sqlite查看器|修改器 http://lzltool.com/sqlite-viewer
全栈程序员站长
2022/11/02
4.9K0
(简单、可靠的安装方法)在Windows Server2016中安装SQL Server2016
WinServer2016的安装参见:  在虚拟机中安装Windows Server2016
跟着阿笨一起玩NET
2020/06/15
6.5K0
SQL Server通过创建临时表遍历更新数据
  前段时间新项目上线为了赶进度很多模块的功能都没有经过详细的测试导致了生成环境中的数据和实际数据对不上,因此需要自己手写一个数据库脚本来更新下之前的数据。(线上数据库用是SQL Server2012)关于数据统计汇总的问题肯定会用到遍历统计汇总,那么问题来了数据库中如何遍历呢?好像并没有for和foreach这种类型的功能呀,不过关于数据库遍历最常见的方法当然是大家经常会想到的游标啦,但是这次我并没有使用游标,而是通过创建临时表的方式来更新遍历数据的。
追逐时光者
2020/09/24
2.3K0
SQL Server通过创建临时表遍历更新数据

相似问题

C++引用可以分配吗?

30

C++自动变量的大小可以变化吗?

71

我可以在C++中同时分配两个变量吗?

54

在c++中改变变量

23

c++中的表达式可以更改变量值吗

41
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文