混合数据的光因子分析
light-famd的Python项目详细描述
轻燃料
light\u famd
是一个处理混合数据因子分析的库。这包括多种方法,包括主成分分析(PCA)和乘法。对应分析(MCA)。我们的目标是为每个算法提供一个高效、轻巧的实现,以及一个scikit学习api。
目录
除了水蟒身上常见的嫌疑犯(sklearn
,pandas
,numpy
)之外,light famd没有任何额外的依赖关系。
用法
importnumpyasnp;np.random.set_state(42)# This is for doctests reproducibility
指南
由light famd提供的每个基本估计器(ca,pca)扩展了scikit learn的(transformermixin,base估计器)
。这意味着我们可以直接使用fit\u transform
,和(set_params,get_params)
方法。
在引擎盖下,light famd使用一个svd的随机版本。该算法利用随机化方法找到一个(通常非常好的)近似截断奇异值分解,以加快计算速度。对于只希望提取少量组件的大型矩阵,它的速度特别快。为了进一步加速,可以设置n_iter<;=2(以损失精度为代价)。但是,如果您想要可重复的结果,则应设置random_state
参数。
SVD的随机版本是一种迭代方法。由于light-famd的每个算法都使用svd,所以它们都有一个n_iter
参数来控制用于计算svd的迭代次数。一方面,数值越高,结果就越精确。另一方面,增加n_iter
会增加计算时间。一般来说,该算法收敛速度非常快,因此建议使用低n_iter
(这是默认行为)。
在这个包中,继承关系如下所示(a->;b:a是b的超类):
- PCA->;MFA->;FAMD
- ca->;最大可信区间
根据您的情况,您应该使用每种方法:
- 所有变量都是数字:使用主成分分析(
pca
) - 您有一个列联表:使用对应关系分析(
ca
) - 您有两个以上的变量,它们都是分类的:使用多对应分析(
mca
) - 有一组分类变量或数值变量:使用多因素分析(
mfa
) - 既有分类变量又有数值变量:使用混合数据的因子分析(
famd
)
下一小节将概述每个方法以及用法信息。下面的论文对因子分析领域进行了很好的概述。如果您想深入了解:
- 主成分分析教程
- 通信分析理论
- 寻找随机结构:构造近似矩阵分解的概率算法
- 多对应分析的计算,代码位于r
- 奇异值分解教程
- 多因素分析
请注意,light\u famd
不支持稀疏输入,有关稀疏和大数据的替代方法,请参见truncated\u famd。
主成分分析:主成分分析
主成分分析(用平均值=真重新缩放,用标准值=真重新缩放,n组分=2,n组分=3, copy=true,check_input=true,random_state=none,engine='auto'):
参数:
用平均值重新缩放(bool):是否减除每列的平均值。
使用"标准"重新缩放(bool):是否将每列除以其标准偏差。
n_分量
(int):要计算的主分量的数目。n(int):用于计算svd的迭代次数。
复制(bool):是否就地执行计算。
检查输入
(bool):是否检查输入的一致性。引擎
(字符串):"auto":随机SVD,"fBPCA":Facebook的随机SVD实现random_state
(int,randomstate instance或none,可选(默认值为none):在数据洗牌时使用的-伪随机数生成器的种子。如果是int,则random_state是随机数生成器使用的种子;如果是random state实例,则random_state是随机数生成器;如果不是,则random数生成器是np.random使用的随机状态实例。 返回ndarray(m,k),m:样本数,k:组件数。
示例:
>>>import numpy as np
>>>from Light_Famd import PCA
>>>X = pd.DataFrame(np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]),columns=list('ABC'))
>>>pca = PCA(n_components=2)
>>>pca.fit(X)
PCA(check_input=True, copy=True, engine='auto', n_components=2, n_iter=3,
random_state=None, rescale_with_mean=True, rescale_with_std=True)
>>>print(pca.explained_variance_)
[11.89188304 0.10811696]
>>>print(pca.explained_variance_ratio_)
[0.9909902530309821, 0.00900974696901714]
>>>print(pca.column_correlation(X)) #You could call this method once estimator is >fitted.correlation_ratio is pearson correlation between 2 columns values,
where p-value >=0.05 this similarity is `Nan`.
0 1
A -0.995485 NaN
B -0.995485 NaN
>>>print(pca.transform(X))
[[ 0.82732684 -0.17267316]
[ 1.15465367 0.15465367]
[ 1.98198051 -0.01801949]
[-0.82732684 0.17267316]
[-1.15465367 -0.15465367]
[-1.98198051 0.01801949]]
>>>print(pca.fit_transform(X))
>[[ 0.82732684 -0.17267316]
[ 1.15465367 0.15465367]
[ 1.98198051 -0.01801949]
[-0.82732684 0.17267316]
[-1.15465367 -0.15465367]
[-1.98198051 0.01801949]]
对应分析:ca
ca(n_components=2,n_iter=10,copy=true,check_input=true,random_state=none, 发动机='auto'):
参数:
n_分量
(int):要计算的主分量的数目。复制(bool):是否就地执行计算。
检查输入
(bool):是否检查输入的一致性。引擎
(字符串):"auto":随机SVD,"fBPCA":Facebook的随机SVD实现random_state
(int,randomstate instance或none,可选(默认值为none):在数据洗牌时使用的-伪随机数生成器的种子。如果是int,则random_state是随机数生成器使用的种子;如果是random state实例,则random_state是随机数生成器;如果不是,则random数生成器是np.random使用的random state实例。
返回ndarray(m,k),m:样本数,k:组件数。
示例:
>>>import numpy as np
>>>from Light_Famd import CA
>>>X = pd.DataFrame(data=np.random.randint(0,100,size=(10,4)),columns=list('ABCD'))
>>>ca=CA(n_components=2,n_iter=2)
>>>ca.fit(X)
CA(check_input=True, copy=True, engine='auto', n_components=2, n_iter=2,
random_state=None)
>>> print(ca.explained_variance_)
[0.09359686 0.04793262]
>>>print(ca.explained_variance_ratio_)
[0.5859714238674507, 0.3000864001658787]
>>>print(ca.transform(X))
[[-0.18713811 0.09830335]
[ 0.34735892 0.34924107]
[ 0.33511949 -0.29842395]
[-0.26200927 -0.14201485]
[-0.21803569 0.0977655 ]
[-0.25482535 -0.16019826]
[ 0.09899818 -0.15015664]
[-0.24835074 0.54054788]
[-0.21056433 -0.29941039]
[ 0.33904416 0.04835469]]
多重对应分析:mca
MCA类继承自CA类。
>>>import pandas as pd
>>>X=pd.DataFrame(np.random.choice(list('abcde'),size=(10,4),replace=True),columns =list('ABCD'))
>>>print(X)
A B C D
0 e a a b
1 b e c a
2 e b a c
3 e e b c
4 b c d d
5 c d a c
6 a c e a
7 d b d b
8 e a e e
9 c a e b
>>>mca=MCA(n_components=2)
>>>mca.fit(X)
MCA(check_input=True, copy=True, engine='auto', n_components=2, n_iter=10,
random_state=None)
>>>print(mca.explained_variance_)
[0.8286237 0.67218257]
>>>print(mca.explained_variance_ratio_)
[0.2071559239010482, 0.16804564240579373]
>>>print(mca.transform(X))
[[-0.75608657 0.17650888]
[ 1.39846026 -1.17201511]
[-0.77421024 -0.04847214]
[-0.32829309 -1.19959921]
[ 1.49371661 0.90485916]
[-1.00518879 -0.41815679]
[ 1.11265365 -0.14764943]
[-0.07786514 1.66121318]
[-0.51081888 -0.06676941]
[-0.55236782 0.31008086]]
多因素分析:mfa
mfa类继承自pca类。
由于famd类继承自mfa,因此famd唯一要做的事情是确定组
参数,并将其与超类mfa
进行比较,因此我们跳过这个小部分直接转到要famd
混合数据的因子分析:famd
famd
继承自mfa
类,这意味着您可以访问mfa
类的所有方法和属性。
>>>import pandas as pd
>>>X_n = pd.DataFrame(data=np.random.randint(0,100,size=(10,2)),columns=list('AB'))
>>>X_c =pd.DataFrame(np.random.choice(list('abcde'),size=(10,4),replace=True),columns =list('CDEF'))
>>>X=pd.concat([X_n,X_c],axis=1)
>>>print(X)
A B C D E F
0 11 67 a a d e
1 43 67 d d d a
2 40 3 d b c b
3 81 66 e b c c
4 36 50 e a c e
5 95 69 b d e a
6 57 71 d c d c
7 29 58 e e d d
8 67 27 b e d e
9 78 20 e d a a
>>>famd = Light_FAMD.FAMD(n_components=2)
>>>famd.fit(X)
FAMD(check_input=True, copy=True, engine='auto', n_components=2, n_iter=3,
random_state=None)
>>>print(famd.explained_variance_)
[15.41428212 9.53118994]
>>>print(famd.explained_variance_ratio_)
[0.27600556629884937, 0.17066389830189396]
>>> print(famd.column_correlation(X))
0 1
A NaN NaN
B NaN NaN
C_a NaN NaN
C_b NaN NaN
C_d NaN NaN
C_e NaN NaN
D_a NaN NaN
D_b NaN NaN
D_c NaN NaN
D_d NaN 0.947742
D_e NaN NaN
E_a NaN NaN
E_c NaN NaN
E_d 0.759576 NaN
E_e NaN NaN
F_a NaN 0.947742
F_b NaN NaN
F_c NaN NaN
F_d NaN NaN
F_e NaN NaN
>>>print(famd.transform(X))
[[ 4.15746579 -2.87023941]
[ 4.95755717 3.74813131]
[ 2.6358626 -1.87761681]
[ 3.4203849 -2.2485009 ]
[ 4.10436826 -3.57317268]
[ 2.88436338 5.65046057]
[ 3.92172253 -0.41161253]
[ 4.48442501 -1.30359035]
[ 4.42018651 -0.77402381]
[ 3.66615694 4.15701604]]
print(famd.fit_transform(X))
[[ 4.15746579 -2.87023941]
[ 4.95755717 3.74813131]
[ 2.6358626 -1.87761681]
[ 3.4203849 -2.2485009 ]
[ 4.10436826 -3.57317268]
[ 2.88436338 5.65046057]
[ 3.92172253 -0.41161253]
[ 4.48442501 -1.30359035]
[ 4.42018651 -0.77402381]
[ 3.66615694 4.15701604]]
加速
默认情况下,light famd使用sklearn的随机svd实现。light famd的目标之一是使使用不同的svd后端成为可能。目前唯一受支持的后端是facebook的随机化svd实现。您可以通过将引擎
参数设置为'fbpca'
来使用它,或者参见truncated戋famd了解根据输入结构自动选择SVD戋解算器的另一种方法:
>>>importLight_FAMD>>>pca=Light_FAMD.PCA(engine='fbpca')