shonen.hateblo.jp

やったこと,しらべたことを書く.

今すぐC#で機械学習を始めるための手っ取り早い手順

使うもの

インストール

VisualStudioをインストールする.

プロジェクト作成

  • コンソールアプリケーションを選択.
  • 言語はC#

Nugetパッケージ

『Nugetパッケージの管理』を開き,次を検索してインストール

  • Accord (Accord.NET)
  • Accord.MachineLearning (Accord.NET)

その他必要なものは自動的にセットアップされる.

K-means

早速K-meansしてみよう

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloAccord
{
    class Program
    {
        static void Main(string[] args)
        {
            var rand = new Random();
            int N = 100;

            double[][] points = Enumerable.Range(0, N)
                .Select((i) => Enumerable.Range(0,2).Select((j) => rand.NextDouble()).ToArray() )
                .Where((e) => Math.Abs(e[0] + e[1] - 1.0) > 0.1).ToArray();

            var kmeans = new Accord.MachineLearning.KMeans(2);

            var clusters = kmeans.Learn(points);
            int[] labels = clusters.Decide(points);

            int[] cluster0 = labels.Select((e, i) => e == 0 ? i : -1).Where((e) => e >= 0).ToArray();
            int[] cluster1 = labels.Select((e, i) => e == 1 ? i : -1).Where((e) => e >= 0).ToArray();

            Console.Out.WriteLine("Polygon");
            foreach (var i in cluster0)
                Console.Out.WriteLine(string.Join(" ", points[i]));
            Console.Out.WriteLine("...");

            Console.Out.WriteLine("Polygon");
            foreach (var i in cluster1)
                Console.Out.WriteLine(string.Join(" ", points[i]));
            Console.Out.WriteLine("...");

            Console.In.ReadLine(); // pause key
        }
    }
}

やっている事

  • 二次元平面上の[0,1]区間に点をN個打つ.
  • Math.Abs(e[0] + e[1] - 1.0) > 0.1 を満たす点を残し他を削除する.
  • 点群を2つの群に分類するようK-meansを使ってクラスタリング学習.
  • 学習結果を使って,元の点群をクラスタリング
  • 1つ目の群,2つめの群の順に点を出力する

visualize

出力した内容はCSAcademyのGeometry Widgetに貼り付けられる内容になっている

csacademy.com

f:id:m_buyoh:20180324035240p:plain

2つの群に分類できている.