private void button_Click(object sender, EventArgs e)
{
var x = np_arange(-5.0, 5.0, 0.1);
var y = sigmoid(x);
var plt = new Chart();
plt_plot(plt, x, y);
plt_xlim(plt, -6.0, 6.0);
plt_ylim(plt, -0.1, 1.1);
plt_show(plt);
}
private U[] np_arange<T, U>(T start, T end, U step) where T : struct where U : struct
{
var start_ = Convert.ToDouble(start);
var end_ = Convert.ToDouble(end);
var step_ = Convert.ToDouble(step);
return Enumerable.Range(0, (int)((end_ - start_) / step_ + 1)).Select(x => (U)(dynamic)(start_ + x * step_)).ToArray();
}
private double[] sigmoid<T>(T[] x) where T : struct
{
return x.Select(n => 1 / (1 + Math.Exp(-Convert.ToDouble(n)))).ToArray();
}
private void plt_plot<T, U>(Chart plt, T[] x, U[] y) where T : struct where U : struct
{
var x_ = x.Select(n => Convert.ToDouble(n)).ToArray();
var y_ = y.Select(n => Convert.ToDouble(n)).ToArray();
plt.Size = new System.Drawing.Size(500, 350);
plt.ChartAreas.Add("area");
plt.Legends.Add("legend");
plt.Series.Add("line");
plt.ChartAreas["area"].AxisX.MajorGrid.Enabled = false;
plt.ChartAreas["area"].AxisX.LabelStyle.Format = "0.0";
plt.ChartAreas["area"].AxisX.Minimum = x_.First();
plt.ChartAreas["area"].AxisX.Maximum = x_.Last();
plt.ChartAreas["area"].AxisY.MajorGrid.Enabled = false;
plt.ChartAreas["area"].AxisY.LabelStyle.Format = "0.0";
plt.ChartAreas["area"].AxisY.Minimum = y_.First();
plt.ChartAreas["area"].AxisY.Maximum = y_.Last();
plt.Series["line"].ChartType = SeriesChartType.Line;
foreach (var n in x.Zip(y, Tuple.Create))
{
plt.Series["line"].Points.AddXY(n.Item1, n.Item2);
}
}
private void plt_xlim(Chart plt, double minimum, double maximum)
{
plt.ChartAreas["area"].AxisX.IntervalOffset = 0.0;
plt.ChartAreas["area"].AxisX.Minimum = minimum;
plt.ChartAreas["area"].AxisX.Maximum = maximum;
plt.ChartAreas["area"].AxisX.Interval = 2;
}
private void plt_ylim(Chart plt, double minimum, double maximum)
{
plt.ChartAreas["area"].AxisY.IntervalOffset = 0.1;
plt.ChartAreas["area"].AxisY.Minimum = minimum;
plt.ChartAreas["area"].AxisY.Maximum = maximum;
plt.ChartAreas["area"].AxisY.Interval = 0.2;
}
private void plt_show(Chart plt)
{
Bitmap bitmap = new Bitmap(plt.Width, plt.Height);
plt.DrawToBitmap(bitmap, new Rectangle(System.Drawing.Point.Empty, plt.Size));
Cv2.ImShow("plot", BitmapConverter.ToMat(bitmap));
}
参考文献:
斎藤康毅(2016)『ゼロから作るDeep Learning』オライリー・ジャパン