summaryrefslogtreecommitdiff
path: root/perceptron/perceptron1.cc
diff options
context:
space:
mode:
Diffstat (limited to 'perceptron/perceptron1.cc')
-rw-r--r--perceptron/perceptron1.cc143
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;
+}
+