<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- MyFirstUnitAd -->
<ins class="adsbygoogle"
     style="display:inline-block;width:970px;height:250px"
     data-ad-client="ca-pub-5778386704669218"
     data-ad-slot="1503492166"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>



<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document"><title>3-CNF</title>

<style>
<!--
	table td.head{ 
		background-color: #3a6ba5;
		border: 1px #000000 solid;
		font-family: Verdana;
		font-weight: bold;
		font-size: 14px;
		color: #f79c19;
		padding: 6px;
	}

	table td.body{ 
		border-bottom: 1px #6699CC dotted;
		text-align: left;
		font-family: Verdana, sans-serif, Arial;
		font-weight: normal;
		font-size: 14px;
		color: #3A6BA5;
		background-color: #fafafa;
		padding: 6px;
	}
	
-->
</style></head><body>



<p align="left"><font color="#ff0000" size="6"><span lang="en-ca"><b>&nbsp; 
 
</b></span><b>&nbsp;&nbsp;&nbsp; <span lang="en-ca">&nbsp;&nbsp; </span></b></font><span lang="en-ca"><font color="#ff0000" size="6"><b>&nbsp;&nbsp;&nbsp;&nbsp; AdaBoost<br>
</b></font></span></p><span style="font-family: monospace;"><span style="font-weight: bold;">This is just a small practice as I find Adaboost hard to understand and I need to do some improvement of this algorithm.<br>
1. Generating the sample data is a kind of trick because I pretend that
the event happens with the probability of each "classifier" which I
later need to find out.<br>
2. The algorithm is based on <a href="documents/adaboost.pdf">this wonderful handout</a>. It says it is better to do calculation "iteratively" and I still have no idea what it means.<br>
3. Based on the trick of generating samples of "1" above, the result of
"combined-classifier" only achieves about 90% hit rate. I don't know if
it is all right, meaning whether this<br>
is typical statistical error when generating sample by probability or
this is the limit of AdaBoost. In other words, can AdaBoost perfectly
"restore" the true "weight" of each classifier?<br>
4. <span style="text-decoration: underline; font-style: italic; background-color: rgb(51, 255, 51);">My
next experiment would be to create some "fake classifier" which simply
randomly vote when generating samples. Obviously they are like "noise"
and see if AdaBoost can find out.</span><br style="text-decoration: underline; font-style: italic; background-color: rgb(51, 255, 51);">
<span style="text-decoration: underline; font-style: italic; background-color: rgb(51, 255, 51);">And
more interesting experiment in plan is to create some "group
classifier" which means that some classifier are useless as they are
sort of "depending" other more reliable classifier. In other words,
these are "sleeping congressman" who never know what to vote except
just vote when the party leader wants them to vote. Obviously they
should not play as much weight as the "leader of the group" as the
"representative" can vote for them. Let's see if AdaBoost can find out
this.</span><br>
<br>
<br>
<br>
<br>
<br>
&nbsp; <br>
#include &lt;ctime&gt;<br>
#include &lt;iostream&gt;<br>
#include &lt;bitset&gt;<br>
#include &lt;map&gt;<br>
#include &lt;set&gt;<br>
#include &lt;vector&gt;<br>
#include &lt;cstdlib&gt;<br>
#include &lt;cmath&gt;<br>
#include &lt;cstring&gt;<br>
<br>
using namespace std;<br>
const int MaxMember = 10;<br>
<br>
struct SampleStruct<br>
{<br>
&nbsp;&nbsp;&nbsp; double committeeVote;<br>
&nbsp;&nbsp;&nbsp; double sampleWeight;<br>
};<br>
<br>
// assume the last bit is the true result of event, or y[i], all other bits are vote of members<br>
typedef bitset&lt;MaxMember+1&gt; MyBitSet;<br>
<br>
typedef vector&lt;pair&lt;MyBitSet, SampleStruct&gt; &gt; MyBitSetWeightVector;<br>
typedef vector&lt;MyBitSet&gt; MyBitSetVector;<br>
<br>
typedef vector&lt;float&gt; FloatVector;<br>
typedef vector&lt;int&gt; IntVector;<br>
<br>
class AdaBoost<br>
{<br>
public:<br>
&nbsp;&nbsp;&nbsp; int selectMember(int num)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (num &gt;= MaxMember)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; num = MaxMember;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (int member = 0; member &lt; num; member ++)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int index = selectNextMember();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt;
index &lt;&lt; " is new member selected with probability=" &lt;&lt;
probability[index] &lt;&lt; endl;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (index &lt; MaxMember)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; updateNewMember(index);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; bool testSample(const MyBitSet&amp; sample)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; double result = 0.0;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; MaxMember; i ++)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (selectedMember.test(i))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; result += (sample.test(i) ? 1.0 : -1.0) *
committeeVote[i];<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; double event = (sample.test(MaxMember) ? 1.0 : -1.0);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; " the Event is "
&lt;&lt; event &lt;&lt; " and vote is " &lt;&lt; result &lt;&lt; endl;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return result*event &gt; 0.0;<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; void testPerformance(int num)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; MyBitSetVector testData;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int i;<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (i = 0; i &lt; num; i ++)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; MyBitSet myBitset;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; generateBitset(myBitset);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; testData.push_back(myBitset);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int counter = 0;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (i = 0; i &lt; testData.size(); i ++)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (testSample(testData[i]))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; counter ++;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "hit rate is " &lt;&lt; (double)counter /(double) num &lt;&lt; endl;<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; void testPerformance()<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int i;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int counter = 0;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (i = 0; i &lt; sampleData.size(); i ++)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; const MyBitSet&amp; myBitset = sampleData[i].first;<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (testSample(myBitset))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; counter ++;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "hit rate is "
&lt;&lt; (double)counter /(double) sampleData.size() &lt;&lt; endl;<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; void init(int num)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; initialize(num);<br>
&nbsp;&nbsp;&nbsp; }<br>
private:<br>
&nbsp;&nbsp;&nbsp; void updateNewMember(int index)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; double alpha = 0.5 * log((totalWeight - currentTotalError)/currentTotalError);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; selectedMember.set(index);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; committeeVote[index] = alpha;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; double alphaValue = exp(alpha);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; sampleData.size(); i ++)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; const MyBitSet&amp; mySet = sampleData[i].first;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; bool event = mySet.test(mySet.size()-1);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; bool vote = mySet.test(index);<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SampleStruct&amp; sample = sampleData[i].second;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // reset<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; totalWeight -= sample.sampleWeight;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (event &amp;&amp; !vote || !event &amp;&amp; vote)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // calculate new value<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sample.sampleWeight *= alphaValue;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // calculate new value<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sample.sampleWeight /= alphaValue;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // plus new value<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; totalWeight += sample.sampleWeight;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // update vote value<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sample.committeeVote += (vote?1.0:-1.0)*alpha;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; int selectNextMember()<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int i, index;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // find the first available and initialize<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (i = 0; i &lt; MaxMember; i ++)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!selectedMember.test(i))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; currentTotalError = calculateTotalError(i);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; index = i;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (i = index + 1; i &lt; MaxMember; i ++)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!selectedMember.test(i))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; double totalError = calculateTotalError(i);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (totalError &lt; currentTotalError)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; index = i;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; currentTotalError = totalError;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return index;<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; double calculateTotalError(int index)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; double totalError = 0.0;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (int i = 0; i &lt;&nbsp; sampleData.size(); i ++)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; const MyBitSet&amp; mySet = sampleData[i].first;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; bool event = mySet.test(MaxMember);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; bool vote = mySet.test(index);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (event &amp;&amp; !vote || !event &amp;&amp; vote)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; totalError +=
exp(-1*(event?1.0:-1.0)*sampleData[i].second.committeeVote);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return totalError;<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; void generateBitset(MyBitSet&amp; myBitset)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int event = 0;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; bool bHappen;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // the event is random...<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; event = rand() % 1000;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (event &gt; 800)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; myBitset.set(MaxMember);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; bHappen = true;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; myBitset.reset(MaxMember);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; bHappen = false;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int num = rand() % 1000;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; MaxMember; i ++)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if ( num&nbsp; &lt; probability[i])<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; myBitset.set(i, bHappen);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; myBitset.set(i, !bHappen);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; void generateSample(int num)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; num; i ++)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; MyBitSet myBitset;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; generateBitset(myBitset);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SampleStruct sample;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sample.committeeVote = 0.0;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sample.sampleWeight = 1.0;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sampleData.push_back(make_pair(myBitset, sample));<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; void initialize(int num)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; probability.clear();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; memset(committeeVote, 0, sizeof(committeeVote));<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; MaxMember; i ++)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; probability.push_back(rand()%1000);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sampleData.clear();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; generateSample(num);<br>
<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; totalWeight = num;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; currentTotalError = 0.0;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; selectedMember.reset();<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; double totalWeight;<br>
&nbsp;&nbsp;&nbsp; double currentTotalError;<br>
&nbsp;&nbsp;&nbsp; MyBitSet selectedMember;<br>
&nbsp;&nbsp;&nbsp; IntVector probability;<br>
&nbsp;&nbsp;&nbsp; MyBitSetWeightVector sampleData;<br>
<br>
&nbsp;&nbsp;&nbsp; double committeeVote[MaxMember];<br>
};<br>
<br>
int main()<br>
{<br>
&nbsp;&nbsp;&nbsp; srand(time(NULL));<br>
&nbsp;&nbsp;&nbsp; AdaBoost ada;<br>
&nbsp;&nbsp;&nbsp; ada.init(10000);<br>
&nbsp;&nbsp;&nbsp; ada.selectMember(MaxMember);<br>
&nbsp;&nbsp;&nbsp; //ada.selectMember(2);<br>
<br>
&nbsp;&nbsp;&nbsp; ada.testPerformance();<br>
&nbsp;&nbsp;&nbsp; return 0;<br>
}<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
///////////////////////////////////////////////////////////////////////////////<br>
running result:(5000 samples)<br>
1 is new member selected with probability=933<br>
6 is new member selected with probability=908<br>
3 is new member selected with probability=732<br>
7 is new member selected with probability=589<br>
5 is new member selected with probability=393<br>
9 is new member selected with probability=340<br>
4 is new member selected with probability=321<br>
2 is new member selected with probability=229<br>
0 is new member selected with probability=56<br>
8 is new member selected with probability=29<br>
&nbsp;the Event is -1 and vote is -4.13416<br>
&nbsp;the Event is -1 and vote is -4.13416<br>
&nbsp;the Event is -1 and vote is 0.323252<br>
&nbsp;the Event is -1 and vote is -3.74175<br>
&nbsp;the Event is 1 and vote is 1.51351<br>
&nbsp;the Event is -1 and vote is -1.51351<br>
&nbsp;the Event is -1 and vote is -4.13416<br>
&nbsp;the Event is -1 and vote is -3.74175<br>
&nbsp;the Event is -1 and vote is -3.33565<br>
&nbsp;the Event is 1 and vote is 3.33565<br>
&nbsp;the Event is 1 and vote is 2.22078<br>
...<br>
...<br>
the Event is -1 and vote is -3.74175<br>
&nbsp;the Event is -1 and vote is -1.63758<br>
&nbsp;the Event is -1 and vote is -4.19125<br>
&nbsp;the Event is -1 and vote is -1.63758<br>
&nbsp;the Event is -1 and vote is -3.33565<br>
&nbsp;the Event is -1 and vote is -2.6208<br>
&nbsp;the Event is -1 and vote is -1.63758<br>
&nbsp;the Event is -1 and vote is -1.63758<br>
&nbsp;the Event is -1 and vote is -3.74175<br>
hit rate is 0.9449<br>
<br>
<br>
/*<br>
<br>
struct MyBitSetComp<br>
{<br>
&nbsp;&nbsp;&nbsp; bool operator()(const MyBitSet&amp; left, const MyBitSet&amp; right)const<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return left.to_string().compare(right.to_string()) &lt; 0;<br>
&nbsp;&nbsp;&nbsp; }<br>
};<br>
<br>
typedef map&lt;MyBitSet, int, MyBitSetComp&gt; BitsetMap;<br>
<br>
typedef map&lt;MyBitSet, float, MyBitSetComp&gt; BitsetWeightMap;<br>
<br>
<br>
<br>
int probability[MaxMember] =<br>
{100, 800, 900, 400, 780, 560, 230, 550, 340, 199};<br>
<br>
<br>
<br>
void generate(int count, BitsetMap&amp; myBitsetMap)<br>
{<br>
&nbsp;&nbsp;&nbsp; typedef pair&lt;BitsetMap::iterator, bool&gt; BitsetMapResult;<br>
&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; count; i ++)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; MyBitSet myBitset;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; generateBitset(myBitset);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; BitsetMap::iterator it = myBitsetMap.find(myBitset);<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (it != myBitsetMap.end())<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; it-&gt;second ++;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; myBitsetMap.insert(make_pair(myBitset, 1));<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
}<br>
<br>
void display(const BitsetMap&amp; myBitsetMap)<br>
{<br>
&nbsp;&nbsp;&nbsp; for (BitsetMap::const_iterator it = myBitsetMap.begin(); it != myBitsetMap.end(); ++ it)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt;"[" &lt;&lt;
it-&gt;first.to_string() &lt;&lt; "]" &lt;&lt; it-&gt;second&lt;&lt;
endl;<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; cout &lt;&lt; "total:" &lt;&lt; myBitsetMap.size() &lt;&lt; endl;<br>
}<br>
<br>
void analysis(const BitsetMap&amp; myBitsetMap)<br>
{<br>
&nbsp;&nbsp;&nbsp; int total = 0;<br>
&nbsp;&nbsp;&nbsp; int counter[MaxMember] ={0};<br>
<br>
&nbsp;&nbsp;&nbsp; for (BitsetMap::const_iterator it = myBitsetMap.begin(); it != myBitsetMap.end(); ++ it)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; total += it-&gt;second;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; it-&gt;first.size(); i ++)<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (it-&gt;first.test(i))<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; counter[i] += it-&gt;second;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; MaxMember; i ++)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "[" &lt;&lt; counter[i] &lt;&lt; "]" &lt;&lt; endl;<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; cout &lt;&lt; "total:" &lt;&lt; total &lt;&lt; endl;<br>
}<br>
<br>
void test1()<br>
{<br>
&nbsp;&nbsp;&nbsp; srand(time(NULL));<br>
&nbsp;&nbsp;&nbsp; BitsetMap myBitsetMap;<br>
&nbsp;&nbsp;&nbsp; generate(1000, myBitsetMap);<br>
&nbsp;&nbsp;&nbsp; display(myBitsetMap);<br>
&nbsp;&nbsp;&nbsp; analysis(myBitsetMap);<br>
}<br>
*/<br>
<br>
</span></span><br>
<pre></pre>

<pre></pre>

<pre></pre>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; <a href="PocketRuler.htm">                  







                       <img src="picture/back.gif" style="border: medium none ;" alt="back.gif (341 bytes)" height="35" width="32"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<a href="index.htm">
<img src="picture/up.gif" style="border: medium none ;" alt="up.gif (335 bytes)" height="32" width="35"></a>       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                         
<img src="picture/next.gif" style="border: medium none ;" alt="next.gif (337 bytes)" height="35" width="32">          


</p>

</body></html>