python特征选择relieff图像特征优选_python 3.x实现特征选择ReliefF算法
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#@Time : 2019/10/29 0029 9:12
#@Author : tb_youth
#@FileName: RTest.py
#@SoftWare: PyCharm
#@Blog : https://blog.csdn.net/tb_youth
import pandas as pd
import numpy as np
import numpy.linalg as la
import random
'''
适用于多分类问题
'''
class Relief:
def __init__(self, data_df, sample_rate, t, k):
"""
#
:param data_df: 数据框(字段为特征,行为样本)
:param sample_rate: 抽样比例
:param t: 统计量分量阈值
:param k: k近邻的个数
"""
self.__data = data_df
self.__feature = data_df.columns
self.__sample_num = int(round(len(data_df) * sample_rate))
self.__t = t
self.__k = k
# 数据处理(将离散型数据处理成连续型数据,比如字符到数值)
def get_data(self):
new_data = pd.DataFrame()
for one in self.__feature[:-1]:
col = self.__data[one]
if (str(list(col)[0]).split(".")[0]).isdigit() or str(list(col)[0]).isdigit() or (str(list(col)[0]).split('-')[-1]).split(".")[-1].isdigit():
new_data[one] = self.__data[one]
# print('%s 是数值型' % one)
else:
# print('%s 是离散型' % one)
keys = list(set(list(col)))
values = list(range(len(keys)))
new = dict(zip(keys, values))
new_data[one] = self.__data[one].map(new)
new_data[self.__feature[-1]] = self.__data[self.__feature[-1]]
return new_data
# 返回一个样本的k个猜中近邻和其他类的k个猜错近邻
def get_neighbors(self, row):
df = self.get_data()
row_type = row[df.columns[-1]]
right_df = df[df[df.columns[-1]] == row_type].drop(columns=[df.columns[-1]])
aim = row.drop(df.columns[-1])
print('2'*100)
print(aim)
print('3'*100)
f = lambda x: eulidSim(np.mat(x), np.mat(aim))
print(np.mat(aim))
right_sim = right_df.apply(f, axis=1)
right_sim_two = right_sim.drop(right_sim.idxmin())
right = dict()
right[row_type] = list(right_sim_two.sort_values().index[0:self.__k])
# print list(right_sim_two.sort_values().index[0:self.__k])
lst = [row_type]
types = list(set(df[df.columns[-1]]) - set(lst))
wrong = dict()
for one in types:
wrong_df = df[df[df.columns[-1]] == one].drop(columns=[df.columns[-1]])
wrong_sim = wrong_df.apply(f, axis=1)
print('4' * 100)
print(wrong_df)
print('5' * 100)
wrong[one] = list(wrong_sim.sort_values().index[0:self.__k])
print(right, wrong)
return right, wrong
# 计算特征权重
def get_weight(self, feature, index, NearHit, NearMiss):
# data = self.__data.drop(self.__feature[-1], axis=1)
data = self.__data
row = data.iloc[index]
right = 0
print('####:',NearHit.values())
for one in list(NearHit.values())[0]:
nearhit = data.iloc[one]
if (str(row[feature]).split(".")[0]).isdigit() or str(row[feature]).isdigit() or (str(row[feature]).split('-')[-1]).split(".")[-1].isdigit():
max_feature = data[feature].max()
min_feature = data[feature].min()
right_one = pow(round(abs(row[feature] - nearhit[feature]) / (max_feature - min_feature), 2), 2)
else:
print('777:',row[feature])
print('888:',nearhit[feature])
print('-'*100)
right_one = 0 if row[feature] == nearhit[feature] else 1
right += right_one
right_w = round(right / self.__k, 2)
wrong_w = 0
# 样本row所在的种类占样本集的比例
p_row = round(float(list(data[data.columns[-1]]).count(row[data.columns[-1]])) / len(data), 2)
for one in NearMiss.keys():
# 种类one在样本集中所占的比例
p_one = round(float(list(data[data.columns[-1]]).count(one)) / len(data), 2)
wrong_one = 0
for i in NearMiss[one]:
nearmiss = data.iloc[i]
if (str(row[feature]).split(".")[0]).isdigit() or str(row[feature]).isdigit() or (str(row[feature]).split('-')[-1]).split(".")[-1].isdigit():
max_feature = data[feature].max()
min_feature = data[feature].min()
wrong_one_one = pow(round(abs(row[feature] - nearmiss[feature]) / (max_feature - min_feature), 2), 2)
else:
wrong_one_one = 0 if row[feature] == nearmiss[feature] else 1
wrong_one += wrong_one_one
wrong = round(p_one / (1 - p_row) * wrong_one / self.__k, 2)
wrong_w += wrong
w = wrong_w - right_w
return w
# 过滤式特征选择
def reliefF(self):
sample = self.get_data()
# print sample
m, n = np.shape(self.__data) # m为行数,n为列数
score = []
sample_index = random.sample(range(0, m), self.__sample_num)
print('采样样本索引为 %s ' % sample_index)
num = 1
for i in sample_index: # 采样次数
one_score = dict()
row = sample.iloc[i]
NearHit, NearMiss = self.get_neighbors(row)
print('第 %s 次采样,样本index为 %s,其NearHit k近邻行索引为 %s ,NearMiss k近邻行索引为 %s' % (num, i, NearHit, NearMiss))
for f in self.__feature[0:-1]:
print('***:',f,i,NearHit,NearMiss)
w = self.get_weight(f, i, NearHit, NearMiss)
one_score[f] = w
print('特征 %s 的权重为 %s.' % (f, w))
score.append(one_score)
num += 1
f_w = pd.DataFrame(score)
print('采样各样本特征权重如下:')
print( f_w)
print('平均特征权重如下:')
self.f_w_mean = f_w.mean()
print(self.f_w_mean)
return self.f_w_mean
# 返回最终选取的特征
def get_final(self):
f_w = pd.DataFrame(self.f_w_mean, columns=['weight'])
self.final_feature_t = f_w[f_w['weight'] > self.__t]
print('*'*100)
print(self.final_feature_t)
# final_feature_k = f_w.sort_values('weight').head(self.__k)
# print final_feature_k
return self.final_feature_t
# 几种距离求解
#欧氏距离(Euclidean Distance)
def eulidSim(vecA, vecB):
return la.norm(vecA - vecB)
#余弦相似度
def cosSim(vecA, vecB):
"""
:param vecA: 行向量
:param vecB: 行向量
:return: 返回余弦相似度(范围在0-1之间)
"""
num = float(vecA * vecB.T)
denom = la.norm(vecA) * la.norm(vecB)
cosSim = 0.5 + 0.5 * (num / denom)
return cosSim
#皮尔逊(皮尔森)相关系数
'''
皮尔森相关系数也称皮尔森积矩相关系数(Pearson product-moment correlation coefficient) ,
是一种线性相关系数,
是最常用的一种相关系数。
记为r,用来反映两个变量X和Y的线性相关程度,
r值介于-1到1之间,绝对值越大表明相关性越强。
'''
def pearsSim(vecA, vecB):
if len(vecA) < 3:
return 1.0
else:
return 0.5 + 0.5 * np.corrcoef(vecA, vecB,rowvar=0)[0][1]
if __name__ == '__main__':
with open('./西瓜数据集30.csv','r',encoding= 'gbk') as f:
data = pd.read_csv(f)
columns = data.columns.tolist()
feature_columns = columns[1:-1]
class_column = [columns[-1]]
f = Relief(data, 1, 0.2, 2)
# df = f.get_data()
# print(type(df.iloc[0]))
# f.get_neighbors(df.iloc[0])
f.reliefF()
f.get_final()
python特征选择relieff图像特征优选_python 3.x实现特征选择ReliefF算法相关推荐
- python特征选择relieff图像特征优选_基于Relief特征选择算法的研究与应用
作者姓名导师姓名文献出处论文摘要伴随着当代科学技术的高速发展,人类已经进入了信息爆炸的时代.数据挖掘技术通过从大量数据中揭示出隐含的信息,将海量的高维数据转换为有用的信息和知识.特征选择是数据挖掘中的 ...
- python特征选择relieff图像特征优选_ReliefF与QPSO结合的故障特征选择算法
[1] Zhang L, Zhang F, Hu Y. A Two-phase Flight Data Feature Selection Method Using both Filter and W ...
- 基于python的随机森林回归实现_Python机器学习实践:随机森林算法训练及调参-附代码...
文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | 博客园 作者 | 战争热诚 随机森林是一种有监督学习算法,是以决策树为基学习器的集成学习算法 ...
- python绘制指数函数图像及性质_python实现画出e指数函数的图像
这里用Python逼近函数y = exp(x);同样使用泰勒函数去逼近: exp(x) = 1 + x + (x)^2/(2!) + .. + (x)^n/(n!) + ... #!/usr/bin/ ...
- python 怎么得到图像深度图 软件_Python/OpenCV:从立体图像计算深度图
我有两个立体图像要用来计算深度图.虽然我不幸不知道C/C++,但我知道Python--所以当我发现this tutorial时,我是乐观的. 不幸的是,教程似乎有些过时了.它不仅需要调整以运行(将&q ...
- python二元函数图像在线绘制_Python绘制二元函数曲面
微实践:绘制二元函数曲面 我们将演示如何借助于ufunc的广播运算计算下述二元函数的在一个xy平面上的值并将其绘制成3D曲面.其中,x和y的取值范围均为[-2,+2]. 为了达到目的,我们需要一个二维 ...
- python演示验证图像叠加过程_Python叠加矩形框图层2种方法及效果代码实例
本篇文章小编给大家分享一下Python叠加矩形框图层2种方法及效果代码实例,代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 两种方式以及效果: 方式一,使用 ...
- python用pil图像放大缩小_python使用PIL缩放网络图片并保存的方法
python 使用 PIL 缩放网络图片并保存的方法 本文实例讲述了 python 使用 PIL 缩放网络图片并保存的方法. 分享给大家供大家参考. 具体实现方法如下: ''' tk_image_vi ...
- python 怎么得到图像深度图 软件_python有关于图像的深度和通道
目录: (一)图像的深度和图像的通道 (1)图像的深度 (2)图像的通道 (二)自定义一张多通道的图片 (1)zeros 函数 (2)ones 函数 (三)自定义一张单通道的图片 (四)像素操作 (1 ...
最新文章
- MOS管体二极管的作用
- 自定义HashSet判重标准
- .NET全栈开发工程师学习路径
- 【图像分割模型】全景分割是什么?
- [转]Android输入法框的梳理
- 威联通NAS通过宝塔面板实现域名统一端口访问
- Apache 配置虚拟主机
- jmeter测试java服务_Jmeter 测试 JMS (Java Message Service)/ActiveMQ 性能
- css中em与px的介绍及换算方法
- 全新的PDO数据库操作类(仅适用Mysql)
- springboot+mybatis 的org.mybatis.spring.MyBatisSystemException 解决方法
- IE 8 Beta 2中文版首份试用体验
- QThread实现多线程
- 链家数据爬取+地图找房
- 基于CList链表类的故障树分析算法的实现
- Chrome 出现内存 不足
- 【python】django实现扫码签到
- 纺织ERP_印染ERP软件_指点ERP简介
- 如何在网站中添加音乐
- 医院信息系统中服务器配置的原则,如何保障医院信息系统(HIS)中数据库的安全性...