資源簡介
根據adaboost的經典流程編寫的算法,其中弱分類器用閾值分類器來構建。

代碼片段和文件信息
package?src;
import?java.util.ArrayList;
import?java.util.List;
import?java.lang.Math;
public?class?adaboost?{
public?List?items=new?ArrayList();//數據集
public?List?Classify=new?ArrayList();//每次迭代產生的弱分類器
public?int?T;//迭代次數
public?float?[]weight_c;//弱分類器權重
public?float?totalWeights?=?0?totalPos?=?0?totalNeg?=?0;
public?adaboost(point[]?Aint?T)
{
for(point?a:A)
{
items.add(a);
}
this.T=T;
for(point?b:items)
b.weight=(float)1/A.length;?????????????????????????//初始化樣本權值
weight_c=new?float[T];
}
public?void?count_weight()????????????????//*權重歸一化*/
{
totalWeights?=?0;
totalPos=0;
totalNeg=0;
for(point?s:items)
{
totalWeights+=s.weight;
if?(s.pos_neg==1)?totalPos?+=s.weight;//計算出正負樣本的權值和
else
totalNeg?+=?s.weight;
}
for(point?s:items)
{
s.weight/=totalWeights;
}
}
public?void?learning()????????????????????????//訓練數據集
{
float?total=0;
classiffier?newclassiffier;
for(int?i=0;i {
count_weight();
newclassiffier=findBest();
Classify.add(newclassiffier);
updateWeight(newclassiffieri);
System.out.println(“learningfor“+i+“times???“+“thresh“+newclassiffier.thresh+“???mark“+(newclassiffier.mark+1));
total+=weight_c[i];
//System.out.println(“count“+weight_c[i]);
}
for(int?i=0;i {
weight_c[i]/=total;
System.out.println(“count“+weight_c[i]);
}
}
public?void?updateWeight(classiffier?tempint?index)//每次迭代完成后,依據該次迭代產生的最優弱分類器,更新數據權值
{
weight_c[index]=(float)?Math.log((1-temp.e)/temp.e);
for(point?s:items)
{
if(temp.classify(s)==s.pos_neg)
s.weight*=Math.exp(temp.e/(-1+temp.e));
else
s.weight*=Math.exp(temp.e/(1-temp.e));
}
}
public?classiffier?findBest()//每次迭代,產生最優的弱分類器,并將弱分類器存入Classify中
{
classiffier?temp=new?classiffier(001false);
for(int?i=0;i {
classiffier?temp1=findthresh(i);
if(temp1.e temp=temp1;
}
return?temp;
}
public?float?min(float?a?float?b)
{
return(a?<=?b???a?:?b);
}
public?classiffier?findthresh(int?Mark)//對每個維度的樣本集,產生一個弱分類器,Mark為數據維度標志
{
float?e=0?besterr?=(float)1.0;
double?thrfinal_thr=0;
float?bPos?=?0?bNeg?=?0;
sort(Mark);
boolean?flag=false;
for(int?i=0;i {
if(items.get(i).pos_neg==1)??bPos?+=items.get(i).weight;
else?bNeg?+=?items.get(i).weight;
e?=?min(totalNeg-bNeg+bPos?totalPos-bPos+bNeg);
thr?=?(items.get(i).att[Mark]+?items.get(i+1).att[Mark])?/?2;
if?(e {
besterr?=?e;
if(e==totalNeg-bNeg+bPos)?
flag=true;
else?flag=false;
final_thr?=?thr;
}
}
classiffier?subclassiffier=new?classiffier(Markfinal_thrbesterrflag);
return?subclassiffier;
}
public?void?sort(int?I)//按照I維數據,將數據集重新排序,以供產生每個維度的threshold????(可以用歸并排序來提高速度)
{
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2014-03-06?18:43??AdaBoostNew1\
?????文件?????????301??2014-03-06?09:56??AdaBoostNew1\.classpath
?????文件?????????388??2014-03-06?09:56??AdaBoostNew1\.project
?????目錄???????????0??2014-03-06?18:43??AdaBoostNew1\.settings\
?????文件?????????598??2014-03-06?09:56??AdaBoostNew1\.settings\org.eclipse.jdt.core.prefs
?????目錄???????????0??2014-03-06?18:43??AdaBoostNew1\bin\
?????目錄???????????0??2014-03-06?18:43??AdaBoostNew1\bin\src\
?????文件?????????260??2014-03-06?17:14??AdaBoostNew1\bin\src\MergeSort.class
?????文件????????4741??2014-03-06?17:01??AdaBoostNew1\bin\src\adaboost.class
?????文件?????????788??2014-03-06?16:57??AdaBoostNew1\bin\src\classiffier.class
?????文件?????????621??2014-03-06?10:01??AdaBoostNew1\bin\src\point.class
?????文件????????2036??2014-03-06?17:04??AdaBoostNew1\bin\src\test.class
?????目錄???????????0??2014-03-06?18:43??AdaBoostNew1\src\
?????目錄???????????0??2014-03-06?18:43??AdaBoostNew1\src\src\
?????文件??????????47??2014-03-06?17:14??AdaBoostNew1\src\src\MergeSort.java
?????文件????????3631??2014-03-06?17:01??AdaBoostNew1\src\src\adaboost.java
?????文件?????????653??2014-03-06?16:57??AdaBoostNew1\src\src\classiffier.java
?????文件?????????352??2014-03-06?10:01??AdaBoostNew1\src\src\point.java
?????文件????????1251??2014-03-06?17:04??AdaBoostNew1\src\src\test.java
- 上一篇:超強SWING JAVA固定資產管理系統
- 下一篇:黑客hacker輸入法
評論
共有 條評論