機械学習

機械学習

【初心者用】機械学習(Machine Learning)とは

今回は機械学習についてざっくり説明していきます。 初めてプログラミングを学ぶなら「tech boostオンライン」 機械学習とは 機械学習(machine learning)とは、人間の学習能力を機械で再現しようとする技術のことを言います...
回帰

【python,scikit-learn】重回帰 〜簡単な例で試す〜

重回帰を簡単例を用いて説明・実装します。 基本的にpython、scikit-learnを用いてわかりやすく説明・実装します。
回帰

【入門】単回帰 〜scikit-learnを使って実装〜

回帰とは 回帰とは得られたデータxを \(Y=f(X)\)という関数に当てはめることを言います。 この関数のことをモデルとも言います。 例えば、以下のようなデータがあった場合、 以下のように\(Y=f(X)\)に当てはめることです。 そ...
回帰

【数式をていねいに】最小二乗法 〜単回帰のパラメータを求める〜

今回は最小二乗法を紹介します。 最小二乗法とは、データ群とモデル(関数)の二乗誤差を最小にするパラメータを求める手法で、回帰問題等でよく用いられる手法です。 今回は単回帰の最もシンプルな例を用います。 少し数式が多くなりますが丁寧に解説...
機械学習

機械学習でよく使うデータセット

irisデータセット IMDB映画レビューデータセット ロイターのニュースワイヤーデータセット 住宅価格回帰データセット 糖尿病患者のデータセット
機械学習

【編集中】EMアルゴリズム

※編集中 概要 2つの変数からなる確率分布p(x,z)が与えられている. しかし、我々が観測可能なのはXのみ観測可能であり、Zは実際には見えない。 Xしか観測できないが、p(x,y)の推定を行う 尤度関数 $l(\theta)$ の最大化...
教師なし学習

rubyでk-meansを手軽に使えるライブラリ

k-meansをrubyから使えるライブラリ作りました。 k-meansについては前に軽くまとめたので、そちらを www.tcom242242.net 本ライブラリの使い方 サンプル 今回は以下のようなデータをk-meansでクラスタリン...
機械学習

EMアルゴリズムで混合ガウス分布のパラメータ推定できるライブラリ(ruby)

作ったもの EMアルゴリズムで混合ガウス分布のパラメータ推定ができるライブラリをrubyで作りました。 github.com 使い方 まず、本ライブラリのインストール 1次元データに対して githubにおいてある “samp...
deeplearning(深層学習)

CNNの伝搬と逆伝搬

※これから少しづつ改良していきます。 はじめに 少しCNNを触る機会があったので、 CNNにおいての伝搬、逆伝搬のところを勉強して自分用としてまとめた。 正直、数式はほとんど以下のサイトと同じである。 こちらの都合により \(a\) を \...
教師なし学習

【機械学習、教師なし学習】K-meansでクラスタリングしてみる 〜scikit-learnを使って〜

#!/usr/bin/ruby
# -*- encoding: utf-8 -*-

$LOAD_PATH.push(File::dirname($0)) ;
require "pry"
require "yaml"

#
# == k_means 
#
class K_Means

  attr_accessor :datas, :k, :c_list
  def initialize(datas: [[2, 3],[2, 8],[2, 3],[3, 5],[6, 3],[5, 3]], k: 2, dim: 2)
    @datas = datas
    sliced_datas = @datas.each_slice(k).to_a
    @k = k 
    @cluster_list = @k.times.map {|n| Cluster.new(n, nil,sliced_datas[n] , dim)}
    @dim = dim 
  end
  
  
  def fit()
    loop {
      @cluster_list.each{|c| c.reset_v_list()}
      @datas.each {|d|
        min_dist = 100000
        min_cluster_id = -1
        @cluster_list.each {|c|
          dist = calc_dist(d, c)
          if dist < min_dist 
            min_cluster_id = c.id 
            min_dist = dist
          end
        }
        @cluster_list[min_cluster_id].add_v(d)
      }

      @cluster_list.each{|c| c.calc_center()}
      break if !change_clusters_center?
    }

    formated_cluster_list = format_for_log()

    open("result.yaml", 'w') do |io|
      YAML.dump(formated_cluster_list, io)
    end
  end

  def format_for_log()
    result = @cluster_list.map {|c| c.format_hash()}
  end

  def calc_dist(v, cluster)
    dist_sum = 0.0
    v.each_with_index { |v_x, i|
      dist_sum += (cluster.vec[i] - v_x).abs
    } 
    return dist_sum/v.size
  end
 
  def change_clusters_center?()
    @cluster_list.each {|c|
      return true if(c.change_center?) 
    } 
    return false
  end 

  #
  # cluster 
  # cluster has id, vec, and v_list
  #
  class Cluster
    attr_accessor :id, :vec, :v_list, :last_vec

    def initialize(id, vec=nil, v_list=nil, dim=1)
      @id = id
      @v_list= v_list
      @vec = dim.times.map{0.0} if vec == nil
      @dim = dim
      calc_center()
    end

    def calc_center() 
      @last_vec = Marshal.load(Marshal.dump(@vec))
      vec_sum = Array.new
      @v_list.each { |v|
        v.each_with_index { |v_x, i| 
          vec_sum[i] ||= 0.0
          vec_sum[i] += v_x 
        } 
      }
      vec_sum.each_with_index { |new_vec, i| @vec[i] = new_vec/@v_list.size.to_f } 
    end 

    def add_v(v)
      @v_list.push(v)
    end

    def reset_v_list()
      @v_list = []
    end

    def change_center?
      @dim.times { |i|
        return true if @vec[i] != @last_vec[i]
      }
      return false
    end

    def format_hash()
      cluster_hash = {}
      cluster_hash[:id] = @id
      cluster_hash[:vec] = @vec
      cluster_hash[:v_list] = @v_list
      return cluster_hash
    end
  end
end

#
# for experiment
#
if($0 == __FILE__) then
  dim, data_num = 2, 200
  datas = data_num.times.map { |t|
    data = dim.times.map { rand()*10 }
  }
  # datas=[[10, 4],[2, 8],[7, 3],[3, 5],[6, 3],[5, 3],[2, 4],[2, 3], [1, 4], [1, 3], [6, 6], [10, 1],[1, 1], [8, 1], [1, 6], [10, 6]]
  # datas=[[2, 3],[2, 8],[2, 3],[3, 5],[6, 3],[5, 3]]
  k_means = K_Means.new(datas: datas, k: 3, dim: dim) 
  puts "calculating..."
  k_means.fit() 
  puts "finish"
end
タイトルとURLをコピーしました