python特征选择之多类别标签的Fisher score计算

"""
特征选择中多类别标签的Fisher score计算
注意:.mat数据集必须满足
特征集为n*m(n为样本数,m为特征数)
标签集为n*1
如果用matlab打开之后不满足以上,可以进行转置
如果是csv文件,也可以进行转换
"""


import pandas as pd
from collections import defaultdict
import numpy as np
import scipy.io as sio


def F_S(sample,label,loop):
    df1 = pd.DataFrame(sample)
    df2 = pd.DataFrame(label, columns=['label'])
    data = pd.concat([df1, df2], axis=1)  # 合并成为一个dataframe
    target_equivalence_class = defaultdict(list)
    for m, n in [(n, m) for m, n in list(enumerate(data.label))]:
        target_equivalence_class[m].append(n)  # m为某类标签,n为某些样本
    # print(target_equivalence_class)
    n = len(label)
    # print(n)
    n_class = {}
    n_value = 'a'
    for k, values in target_equivalence_class.items():
        n_value = len(values)
        n_class[k] = n_value  # 计算出第n类标签的个数
    for k, values in target_equivalence_class.items():
        n_value = len(values)
        n_class[k] = n_value  # 计算出第n类标签的个数
    # print(n_class)
    lst = []
    features_list = list(data.columns)[:-1]  # 以列表的形式列出所有特征的下标【0,1,2....】
    # print(features_list)
    SB = []
    SW = []
    for feature in features_list:
        for key in target_equivalence_class.keys():
            data_key = data[data.label == key]
            a_feature_mean = data_key[feature].mean()
            a_SW = sum((data_key[feature] - a_feature_mean) ** 2)
            SW.append(a_SW)
            # print(type(a_SW))
            all_feature_mean = data[feature].mean()
            a_SB = n_value / n * (a_feature_mean - all_feature_mean) ** 2
            a_SB = float(a_SB)
            SB.append(a_SB)
            # print(a_SB)
        all_SB = sum(SB)  # sum()函数是列表内相加
        # print(all_SB)
        all_SW = sum(SW) / n
        if all_SW == 0:
            m_fisher_score = np.nan
        else:
            m_fisher_score = all_SB / all_SW
        lst.append(m_fisher_score)
    lst1 = np.array(lst)
    a = np.argsort(-lst1)
    reduct_set = a[:loop]  # FS排名前k个特征
    return reduct_set


file = 'Data\\U_Sonar.mat'
m = sio.loadmat(file)
sample = m['X']
label = m['Y']
a=F_S(sample,label,50)
print(a)

看到很多都是二分类标签的Fisher score的文章,多类标签的FS较少,从github上看到了大佬写的一个二分类标签的FS,所以进行了一些改动,研一小菜鸟一枚,写的算法没有进行优化可能比较简单,希望大佬们批评指正~~

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值