Python實現基於鄰域粗糙集的多標記特徵選擇演算法

2021-10-25 17:58:12 字數 4012 閱讀 6685

演算法思想源自**:

段潔、胡清華、張靈均,等. 基於鄰域粗糙集的多標記分類特徵選擇演算法 [j]

. 計算機研究與發展,2015,52(1

):56-

65

因為沒找到python源**,所以自己試著寫了一下,結果是對應上的。

**分享在這裡,需要的自取

"""

author: wzk

date: 2020-10-11

theme: 多標記鄰域粗糙集特徵選擇演算法

"""from settings.setting import

*class

armlnrs

:"""

基於鄰域粗糙集的多標籤特徵選擇

可以用歐式距離處理連續型別的資料集

1、輸入資料集,訓練集

2、雙重for迴圈,二重迴圈下,計算當前屬性依賴度

3、前向貪心搜尋

"""def__init__

(self, train_data, train_target, test_data, test_target, delta, info)

:"""

初始化物件引數

:param train_data: 訓練集資料

:param train_target: 訓練集標籤

:param test_data: 測試集資料

:param test_target: 測試集標籤

:param delta: δ鄰域的值,

:param info: config項中的配置,實驗結果記錄會用到這個

"""self.train_data = train_data

self.train_target = train_target

self.test_data = test_data

self.test_target = test_target

self.info = info

self.delta = delta

pass

defcompute_corr

(self, i, j, tmp_train_data)

:"""

計算相關性

:param i: 迴圈第i次

:param j: 當前特徵

:param tmp_train_data: 臨時資料

:return:

"""if i ==0:

tmp_train_data = self.train_data[

:, j]

# 每一輪更新乙個臨時資料集,用以測試不同特徵下的依賴度的不同

else

: tmp_train_data = np.insert(tmp_train_data, tmp_train_data.shape[1]

, self.train_data[

:, j]

, axis=1)

# 計算樣本的δ鄰域

delta_neighbor_dict =

dict()

for k in

range

(self.train_data.shape[0]

):delta_neighbor_list =

list()

for v in

range

(self.train_data.shape[0]

):dis = np.sqrt(np.

sum(

(tmp_train_data[k]

- tmp_train_data[v])**

2))if dis <= self.delta:

delta_neighbor_dict.update(

)# 對每個樣本判斷是否在δ鄰域內,是的話更新鄰域樣本的列表

sample_list =

list()

for k in

range

(self.train_data.shape[0]

):count_issubset =

0 count =

0for v in

range

(self.train_target.shape[1]

):if self.train_target[k, v]==1

: count +=

1# 每個標籤下不同類別及其對應樣本索引

target_equivalence_class = defaultdict(

list

)for m, n in

[(n, m)

for m, n in

list

(enumerate

(self.train_target[

:, v]))

]:target_equivalence_class[m]

# 前者是否是後者子集

ifset

(delta_neighbor_dict.get(k)

).issubset(target_equivalence_class.get(1)

):count_issubset +=

1else

:break

if count_issubset == count:

# 計算當前特徵下的屬性依賴度

corr =

len(sample_list)

/ self.train_data.shape[0]

return corr

defarmlnrs

(self)

:"""

1、一階段,計算當前特徵子集與候選特徵子集中任意乙個特徵後的屬性依賴度

2、屬性依賴度的計算,依賴於滿足鄰域近似條件的樣本數目

3、鄰域近似條件指的是當樣本的δ鄰域內的樣本屬於樣本分類標記中的任意乙個標記下的等價類內,該樣本滿足鄰域條件

4、樣本的δ鄰域計算是樣本與任意個樣本進行計算,獲取距離,小於δ則加入鄰域,

5、標籤等價類是指樣本被標記的正類

:return:

"""feature_num = self.train_data.shape[1]

feature_list =

list()

corr_first =

0print

("初始依賴度為0"

)for i in

range

(feature_num)

: tmp_train_data = self.train_data[

:, feature_list]

max_corr =

0 max_index =

0for j in

range

(self.train_data.shape[1]

):if j in feature_list:

continue

corr = self.compute_corr(i, j, tmp_train_data)

print

("當前特徵數:"

,len

(feature_list)

,"當前特徵:"

, j,

"當前corr:"

, corr,

"最大corr:"

, corr_first)

if max_corr < corr:

max_corr = corr

max_index = j

if corr_first < max_corr:

corr_first = max_corr

else

:break

return self.train_data[

:, feature_list]

, self.train_target, self.test_data[

:, feature_list]

, self.test_target

pass

粗糙集分類

粗糙集理論 粗糙集理論 rough set theory 是乙個種處理資料分類的資料探勘方法。當資料屬於定性資料或不確定性資料,無法使用一般的統計方法時,粗糙集理論可以在資訊不完整和資訊不一致下,用來規約資料集合,發掘隱藏的資料陽性和資料相關性,以產生有用的分類規則。粗糙集理論現在主要應用在 臨床醫...

粗糙集理論介紹

粗糙集理論介紹 面對日益增長的資料庫,人們將如何從這些浩瀚的資料中找出有用的知識?我們如何將所學到的知識去粗取精?什麼是對事物的粗線條描述什麼是細線條描述?a r1 顏色分類 a r2 形狀分類 a r3 大小分類 上面這些所有的分類合在一起就形成了乙個基本的知識庫。那麼這個基本知識庫能表示什麼概念...

粗糙集基本理論

此方法基於粗糙集理論,對於粗糙集方面的知識,請參考這篇部落格 該部落格已經很好講了粗糙集的基本知識,我這裡就不重複了,請你反覆確認是否已經明白了下近似和上近似的概念。說白了,乙個屬性上的等價類集合 即劃分 就是關於這個屬性的知識,而其中的乙個等價類就是乙個概念,可以結合上面部落格中關於顏色知識的例子...