最近由於工作需要,對資料進行降維處理,通過對各種演算法的研究,想尋找一種比較理想的演算法,處理資料維度,達到降維的目的,對pca進行研究,但是pca是對當前多維資料的空間變換,無法達到物理降維的目的,因此想選擇物理降維的演算法,因此對卡方演算法和relief演算法進行相關研究,這兩種演算法是對資料的物理降維,是特徵選擇的操作演算法。
通過幾天的查詢資料,整理和總結一下內容:
個人總結:
relief演算法是基於現有訓練資料樣本的**演算法。
即:需要有當前資料集,能夠從中分辨出同類樣本和不同類樣本,然後,從不同分類中選擇相關的樣本資料,計算各個屬性的相關權重。
這也是我開始比較迷茫的一點:不知道如何選擇樣本r,h,m。我從開始的觀點是沒有訓練樣本,是對未知資料集的特徵選擇。因此在演算法的開始,無法選擇樣本r,h,m。後來同事提醒我,這是有訓練樣本資料的,從這個觀點出發,可以很容易的獲取r,h,m。
在以下演算法**中,使用了隨機抽取r樣本,根據距離獲取h和隨機抽取m樣本的方式實現**。
relief的演算法相關原理:
relief
演算法是一種特徵權重演算法
(feature weighting algorithms)
,根據各個特徵和類別的相關性賦予特徵不同的權重,權重小於某個閾值的特徵將被移除。
relief
演算法中特徵和類別的相關性是基於特徵對近距離樣本的區分能力。演算法從訓練集
d中隨機選擇乙個樣本
r,然後從和
r同類的樣本中尋找最近鄰樣本
h,稱為
near hit
,從和r
不同類的樣本中尋找最近鄰樣本
m,稱為
nearmiss
,然後根據以下規則更新每個特徵的權重:如果r和
near hit
在某個特徵上的距離小於r和
near miss
上的距離,則說明該特徵對區分同類和不同類的最近鄰是有益的,則增加該特徵的權重;反之,如果r和
near hit
在某個特徵的距離大於r和
near miss
上的距離,說明該特徵對區分同類和不同類的最近鄰起負面作用,則降低該特徵的權重。以上過程重複
m次,最後得到各特徵的平均權重。特徵的權重越大,表示該特徵的分類能力越強,反之,表示該特徵分類能力越弱。
relief
演算法的執行時間隨著樣本的抽樣次數
m和原始特徵個數
n的增加線性增加,因而執行效率非常高。
個人**:
/**
* relief演算法
*/public void relief()
//屬性的最大值和最小值
double max = new double[n_vars];
double min = new double[n_vars];
for(int i = 0; i < width; i++)
if(d < min[i])
}}
//隨機抽樣m次
for(int i = 0; i < m; i++)
//計算出距離樣本r最近的樣本和最遠的樣本
double maxvalue = 0.0;
double minvalue = 0.0;
int maxrow = 0;
int minrow = 0;
double distince = 0.0;
for(int len = 0; len < length; len++)
distince = math.sqrt(distince);
if(len == 0)
if(distince > maxvalue)
if(distince < minvalue)}}
int h_index = minrow;
double h = new double[width];
for (int index = 0; index < width; index++)
int m_index = maxrow;
double m = new double[width];
for(int index = 0; index < width; index++)
//relief計算權重
for(int j = 0; j < n_vars; j++)
} for(int i = 0; i < width; i++)
}
relieff
作演算法,可以處理多類別問題。該演算法用於處理目標屬性為連續值的回歸問題。
relieff
演算法在處理多類問題時,每次從訓練樣本集中隨機取出乙個樣本
r,然後從和
r同類的樣本集中找出r的
k個近鄰樣本
(near hits)
,從每個
r的不同類的樣本集中均找出
k個近鄰樣本
(near misses)
,然後更新每個特徵的權重。
個人**:
在relief演算法中,對p(c)的處理,我使用1/t,t為不同類數量。
//有t個不同類
public int t;
/*** relieff演算法
*/public void relieff()
//屬性的最大值和最小值
double max = new double[n_vars];
double min = new double[n_vars];
for(int i = 0; i < width; i++)
if(d < min[i])
}} //隨機抽樣m次
mapmap = new hashmap();
double h = new double[k][width];
double m = new double[k][width];
listlstm = new arraylist();
double r = new double[width];
for(int i = 0; i < m; i++)
//計算所有資料到樣本的距離
for(int len = 0; len < length; len++)
distince = math.sqrt(distince);
row = len;
map.put(distince, row);}}
//對樣本距離排序
setset = map.keyset();
listlst = new arraylist(set);
collections.sort(lst);
//獲取距離最近的k個樣本作為h
for(int a = 0; a < k; a++)
}//假設有t個不同分類,在每個不同類中獲取k個樣本
//在資料中隨機獲取k個樣本作為m(c)
for(int a = 0; a < t; a++)
else
}for(int index = 0; index < width; index++)
//計算所有資料到樣本的距離
mapmaprd = new hashmap();
for(int len = 0; len < length; len++)
distince = math.sqrt(distince);
row = len;
maprd.put(distince, row);}}
//對樣本距離排序
setsetrd = map.keyset();
listlstrd = new arraylist(set);
collections.sort(lst);
//獲取不同類距離最近的k個樣本作為
for(int q = 0; q < k; q++)
}lstm.add(m);}}
//計算h的diff
double tmpval1 = new double[n_vars];
double tmpval2 = new double[n_vars];
for(int i = 0; i < n_vars; i++)
} //計算不同類的diff
double value = new double[n_vars];
for(double d : lstm)
}
} for(int i = 0; i < n_vars; i++)
//計算權重
for(int j = 0; j < n_vars; j++)
for(int i = 0; i < width; i++)
}
參考:
relief演算法在筆跡識別中的應用
特徵選取relief演算法
relief演算法 public void relief 屬性的最大值和最小值 double max new double n vars double min new double n vars for int i 0 i width i if d min i 找到每個特徵下樣本資料的最大值最小值 ...
python中的relief屬性用法
案例 from tkinter import root tk lbred label root,text 紅色溝槽狀邊緣 fg red font 微軟雅黑 15 width 20,height 2,relief groove lbred.pack lbred label root,text 綠色凸起...
Camshift演算法研究
根據獲得的色彩直方圖將原始影象轉化成色彩概率分布影象,這個過程就被稱作 back projection 在opencv 中的直方圖函式中,包含back projection 的函式,函式原型是 void cvcalcbackproject iplimage img,cvarr backproject...