本文参考:
mRMR特征选择算法(feature_selection)的使用
python中使用mRMR
实验要求:
对于d维的trunk’s data,即两类样本,每类样本的均值分别为
协方差矩阵相同,均为单位矩阵,
- 仿真这组数据,其中d为100,每类数据的样本数为n;
- 谈谈理想情况下(即n充分大)的这组数据,从d=100个特征中选出k个特征的结果是{1,2,3,…,k}的合理性;
- 试用mRMR算法对这组数据进行特征选择,如从d=100个特征中选出k=10个。通过实验,给出当n相对k取很大时(比如10000)和很小时(比如n=10)所选出的特征;考察特征选择的结果受到样本数目的怎样的影响。
首先安装python库mrmr。链接如下:mifs
下载压缩包后直接在实验所在环境中
pip insatll 压缩包绝对路径\mrmr-master.zip
调用函数说明见链接一。
task1:
生成数据见源码。
task2:
n充分大时k越小合理性越高。
从2000个样本100维特征选出k个代表,k从1-10。正常应该时均值差异逐渐增大,选取特征数按均值增大顺序排列,k变大后选取特征顺序有一定波动。
task3:
每类样本数取10000和取10从100维特征选取10个。显然样本数越大,选取的特征越能区分样本,同时冗余性又越低。样本数越小选取特征没有太大区分度。
源代码如下:
import numpy as np
import mifs
if __name__ == '__main__':
#生成数据
d=100
sample_num=1000
cov=np.identity(d)
mean1=[]
for i in range(d):
mean1.append(1/(i+1))
mean1=np.sqrt(mean1)
mean2=-1*mean1
m1 = np.random.multivariate_normal(mean1, cov, sample_num)
m2 = np.random.multivariate_normal(mean2, cov, sample_num)
data=np.vstack((m1,m2))
print("数据集样本数: ",data.shape[0])
print("数据集特征数: ",data.shape[1])
label=[0]*sample_num
label.extend([1]*sample_num)
# task2
for k in range(1,11):
feat_selector = mifs.MutualInformationFeatureSelector(method='MRMR',n_features=k)
feat_selector.fit(data, np.array(label))
print("取{}个特征:".format(k),feat_selector.ranking_)
# task3
n1=10
n2=10000
m1 = np.random.multivariate_normal(mean1, cov, n1)
m2 = np.random.multivariate_normal(mean2, cov, n1)
data1 = np.vstack((m1, m2))
label1 = [0] * n1
label1.extend([1] * n1)
m1 = np.random.multivariate_normal(mean1, cov, n2)
m2 = np.random.multivariate_normal(mean2, cov, n2)
data2 = np.vstack((m1, m2))
label2 = [0] * n2
label2.extend([1] * n2)
feat_selector = mifs.MutualInformationFeatureSelector(method='MRMR', n_features=10)
feat_selector.fit(data1, np.array(label1))
print("样本数为{}个时取10个特征:".format(n1), feat_selector.ranking_)
feat_selector = mifs.MutualInformationFeatureSelector(method='MRMR', n_features=10)
feat_selector.fit(data2, np.array(label2))
print("样本数为{}个时取10个特征:".format(n2), feat_selector.ranking_)