sklearn 实现 主成分分析

:param data: 需要进行主成分分析的数据
:param columns: data对应的列名
:param n_components: 主成分参数,为 3表示提取出三个主成分,为 0.75表示提取出的主成分要能代表75%的原数据
:return: 在输入data的基础上新增一列pca值

from sklearn.decomposition import PCA
from sklearn import preprocessing
def Solve(data, columns, n_components):
    '''
    :param data: 需要进行主成分分析的数据
    :param columns: data对应的列名
    :param n_components: 主成分参数,为 3表示提取出三个主成分,为 0.75表示提取出的主成分要能代表75%的原数据
    :return: 在输入data的基础上新增一列pca值
    '''
    scaler = preprocessing.StandardScaler().fit(data)
    x_scaler = pd.DataFrame(scaler.transform(data),
                            columns=columns)
    md = PCA(n_components=n_components)
    md.fit(x_scaler)
    k1_spss = md.components_ / np.sqrt(md.explained_variance_.reshape(n_components, 1))
    x_tf = md.transform(x_scaler)
    scaler2 = preprocessing.StandardScaler().fit(x_tf)
    # 生成对应的列
    cols = produce_col(n_components)
    x_tf_scaler = pd.DataFrame(scaler2.transform(x_tf), columns=cols)
    k_sign = np.sign(k1_spss.sum(axis=1))
    x_tf_scaler_sign = x_tf_scaler * k_sign
    rat = md.explained_variance_ratio_
    x_tf_scaler_sign['FAC_score'] = np.sum(x_tf_scaler_sign * rat, axis=1)
    data['pca'] = x_tf_scaler_sign['FAC_score'].round(6)
    return data

使用方法:

user_data = Solve(user_data, ['submit', 'solved', 'logintime', 'score'], 3)

你可能感兴趣的:(python,数学建模,sklearn,机器学习,python)