diff options
author | Patrick Simianer <p@simianer.de> | 2014-06-14 16:46:27 +0200 |
---|---|---|
committer | Patrick Simianer <p@simianer.de> | 2014-06-14 16:46:27 +0200 |
commit | 26c490f404731d053a6205719b6246502c07b449 (patch) | |
tree | 3aa721098f1251dfbf2249ecd2736434c13b1d48 /perceptron/perceptron1.cc |
init
Diffstat (limited to 'perceptron/perceptron1.cc')
-rw-r--r-- | perceptron/perceptron1.cc | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/perceptron/perceptron1.cc b/perceptron/perceptron1.cc new file mode 100644 index 0000000..0d9957b --- /dev/null +++ b/perceptron/perceptron1.cc @@ -0,0 +1,143 @@ +#include <iostream> +#include <vector> +#include <utility> +#include <string> +#include <boost/assign/std/vector.hpp> +#include <cassert> +#include <cmath> + +using namespace std; +using namespace boost::assign; + + +double +isupper_f(string s) +{ + if ( isupper(s[0]) ) return 0; + return 1; +} + +double +len_f(string s) +{ + return s.size(); +} + +double +dotprod(vector<double> a, vector<double> b) +{ + assert(a.size() == b.size()); + double sum; + for (size_t i = 0; i < a.size(); i++) { + sum += a[i] * b[i]; + } + return sum; +} + +vector<double> +vadd(double x, vector<double> v) +{ + for (size_t i = 0; i < v.size(); i++) { + v[i] += x; + } + return v; +} + +vector<double> +vadd(vector<double> v, vector<double> w) +{ + assert(v.size() == w.size()); + for (size_t i = 0; i < v.size(); i++) { + v[i] += w[i]; + } + return v; +} + +vector<double> +vsub(vector<double> v, vector<double> w) +{ + assert(v.size() == w.size()); + for (size_t i = 0; i < v.size(); i++) { + v[i] -= w[i]; + } + return v; +} + +vector<double> +vmult(double x, vector<double> v) +{ + for (size_t i = 0; i < v.size(); i++) { + v[i] *= x; + } + return v; +} + +double +vlen(vector<double> v) +{ + return sqrt(dotprod(v, v)); +} + +vector<double> +vnorm(vector<double> v) +{ + double len = vlen(v); + for (size_t i = 0; i < v.size(); i++) { + v[i] /= len; + } + return v; +} + + +int main(void) +{ + vector<double> classes; + vector<string> words; + classes += -1., 1., -1., 1., -1., 1., -1., 1., -1., 1.; + words += "Haus","house","Mauer","plant","Zeug","hello","Maus","worker","Quartz","point"; + + vector<pair<double, string> > examples; + for (size_t i = 0; i < classes.size(); i++) { + pair<double, string> p; + p.first = classes[i]; + p.second = words[i]; + examples.push_back(p); + } + + vector<double> weights; + weights += 0.,0.; + + double eta = 0.5; + double bias = 0.; + + for (size_t t = 0; t < 2; t++) + { + for (size_t x = 0; x < examples.size(); x++) { + vector<double> feats; + feats += isupper_f(examples[x].second), len_f(examples[x].second); + double err = dotprod(weights, feats); + //if ( (examples[x].first == 1 && err < 0) || (examples[x].first == -1 && err >= 0) ) { + if ( examples[x].first * (err + bias) <= 0 ) { + weights = vadd(weights, vmult(examples[x].first*eta, feats)); + bias += examples[x].first*eta; + } + cout << "w " << weights[0] << " " << weights[1] << " bias " << bias << endl; + } + cout << "--" << endl; + } + + cout << endl; + for (size_t x = 0; x < examples.size(); x++) { + vector<double> feats; + feats += isupper_f(examples[x].second), len_f(examples[x].second); + cout << dotprod(weights, feats) + bias << endl; + } + + vector<double> f; + f += isupper_f("Bauer"), len_f("Bauer"); + cout << "test: " << dotprod(weights, f) + bias << endl; + + + return 0; +} + |