MainPage.xaml.cs
// some theory: http://www.willamette.edu/~gorr/classes/cs449/linear2.html
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
// data set: function: w0*x0 + w1*x1 + ... + wn
//
// x0, x1, ... | y1
// x0, x1, ... | y2
// ...
// x0, x1, ... | ym
//
namespace TrainedSum
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
int i, j, m, n, iter;
int[] datax;
int [] y;
float[] temp;
float[] grad;
float[] w;
float gradsize;
float delta = 0.0001f;
float error = 0.01f;
int[] numbers;
m = 7; n = 5;
datax = new int[m * n];
y = new int[m];
temp = new float[m];
grad = new float[n + 1];
w = new float[n + 1];
numbers = new int[n];
// data set
datax[0] = 1; datax[1] = 2; datax[2] = 3; datax[3] = 4; datax[4] = 5; y[0] = 15;
datax[5] = 0; datax[6] = 3; datax[7] = 4; datax[8] = 5; datax[9] = 6; y[1] = 18;
datax[10] = 3; datax[11] = 4; datax[12] = 5; datax[13] = 6; datax[14] = 7; y[2] = 25;
datax[15] = 4; datax[16] = 5; datax[17] = 6; datax[18] = 7; datax[19] = 8; y[3] = 30;
datax[20] = 0; datax[21] = 0; datax[22] = 0; datax[23] = 0; datax[24] = 10; y[4] = 10;
datax[25] = 6; datax[26] = 7; datax[27] = 9; datax[28] = 10; datax[29] = 12; y[5] = 44;
datax[30] = 0; datax[31] = 0; datax[32] = 0; datax[33] = 0; datax[34] = 0; y[6] = 0;
// initial w
w[0] = Convert.ToInt32(w0.Text);
w[1] = Convert.ToInt32(w1.Text);
w[2] = Convert.ToInt32(w2.Text);
w[3] = Convert.ToInt32(w3.Text);
w[4] = Convert.ToInt32(w4.Text);
w[5] = Convert.ToInt32(w5.Text);
iter = 0;
do
{
for (j = 0; j < m; j++)
{
temp[j] = 0;
for (i = 0; i < n; i++)
{
temp[j] += datax[j * n + i] * w[i];
}
temp[j] += w[n] - y[j];
}
for (i = 0; i < n; i++)
{
grad[i] = 0;
for(j = 0; j < m; j++)
{
grad[i] += temp[j] * datax[j*n+i];
}
}
grad[n] = 0;
for(j = 0; j < m; j++)
{
grad[n] += temp[j];
}
gradsize = 0;
for (i = 0; i <= n; i++)
{
gradsize += grad[i] * grad[i];
}
gradsize = (float) Math.Sqrt(gradsize);
for (i = 0; i <= n; i++)
{
w[i] -= grad[i]/gradsize * delta;
}
iter++;
}
while (gradsize > error && iter < 1000000);
numbers[0] = Convert.ToInt32(number1.Text);
numbers[1] = Convert.ToInt32(number2.Text);
numbers[2] = Convert.ToInt32(number3.Text);
numbers[3] = Convert.ToInt32(number4.Text);
numbers[4] = Convert.ToInt32(number5.Text);
float result;
result = numbers[0]*w[0] + numbers[1]*w[1] + numbers[2]*w[2] +
numbers[3]*w[3] + numbers[4]*w[4] + w[5];
resultstring.Text = "The result is: " + Convert.ToString(result)
+ " iter: " + Convert.ToString(iter)
+ " w0: " + Convert.ToString(w[0])
+ " w1: " + Convert.ToString(w[1])
+ " w2: " + Convert.ToString(w[2])
+ " w3: " + Convert.ToString(w[3])
+ " w4: " + Convert.ToString(w[4])
+ " w5: " + Convert.ToString(w[5]);
}
}
}