カテゴリー: 機械学習

  • Numpy

    Numpy

    はじめに

    `numpy`を使うと複雑な計算ができるようになるが、機会学習でよくつかう計算についてまとめた。

    x転置x

    .dotの後に、掛けるものを2つ置けばよい。

    XtX= np.dot(X.T,X)
    print(XtX)

    逆行列

    linear algebra(リニアアルジェブラ): 線形代数

    numpyの場合は、linalg.invを使って描写する。

    XtX_inv = np.linalg.inv(XtX)
    print(XtX_inv)
  • UnicodeDecodeError: ‘utf-8’ codec can’t decode byte

    UnicodeDecodeError: ‘utf-8’ codec can’t decode byte

    はじめに

    Pythonで機械学習の勉強をはじめるようになって、ファイルを読み込むことが多くなった。

    その際、UTF-8フォーマットじゃないと何かと

    “` UnicodeDecodeError: ‘utf-8’ codec can’t decode byte “`

    というエラーに陥ることになってしまったので、手順をまとめる

    nkfコマンドのinstall

    macでデフォルトで入っていないのでbrewコマンドでinstallする

    “`brew install nkf “`

    変換

    まずは作業前

     

    $ file --mime data.csv
    data.csv: text/plain; charset=unknown-8bit

    変換コマンド

    “` nkf -w –overwrite data.csv “`

    $ file --mime data.csv
    data.csv: text/plain; charset=utf-8

    文字コードが代わり、エラーは出なくなった。

     

  • 行列演算の基礎

    行列演算の基礎

    はじめに

    重回帰分析をするにあたり必要な計算があるので整理する。

    • ベクトルの定義
    • 行列の定義
    • 転置
    • 逆行列
    • 行列積

    numpyはimportされているものとする

    import numpy as np

    ベクトルの定義

    #  ベクトルの定義
    x = np.array([[1],[2],[3]])
    print(x)

    行列の定義

    X = np.array([[1,2],[3,4]])
    print(X)

     

    転置

    # 転置
    Xt = X.T
    print(Xt)

    逆行列  

    linear algebra (リニア・アルジェブラ)線形代数の意味 
    Inverse (インバース) 逆行列の意味

    X_inv = np.linalg.inv(X)
    print(X_inv)

    行列積

    XX_inv = np.dot(X,X_inv)
    print(XX_inv)

    10
    8.88の16乗1

    x掛けるxの逆行列で行列積が求まる。

    よく使う計算

    以下の様なnumpyの配列を作り、行、列の数を取得したり、forループで値を取得したりする

    import numpy as np
    x = np.array([[1,2,3]])
    print (x)
    print ('-----')
    
    X = np.array([[1,2],[3,4]])
    row, cal = X.shape
    
    print(row)
    print(cal)
    print ('-----')
    
    for x in X:
        print ('-----')
        print (x)
    ~                                                                                       
    ~                         

    実行結果

    $ python sample.py
    [[1 2 3]]
    -----
    2
    2
    -----
    -----
    [1 2]
    -----
    [3 4]
    

     

    演習

    xとyを以下の通り定義する。xの1行目にはダミー値として1をセットする事。

    # X definitions
    print('# X definitions')
    X = np.array([
        [1,2,3],
        [1,2,5],
        [1,3,4],
        [1,5,9]
    ])
    
    print(X)
    
    # Y definitions
    print('# Y definitions')
    y = np.array([
      [1],
      [5],
      [6],
      [8]
    ])
    
    print(y)

    実行結果

    # X definitions
    [[1 2 3]
     [1 2 5]
     [1 3 4]
     [1 5 9]]
    # Y definitions
    [[1]
     [5]
     [6]
     [8]]

    また、wは以下の通りとし、stepを分けて計算する

    # Step1
    print('# Step1')
    step1 = np.dot(X.T, X)
    print(step1)
    
    # Step2
    print('# Step2')
    step2 = np.linalg.inv(step1)
    print(step2)
    
    # Step3
    print('# Step3')
    step3 = np.dot(X.T,y)
    print(step3)
    
    # Step4
    print('# Step4')
    step3 = np.dot(X.T,y)
    step4 = np.dot(step2,step3)
    print (step4)

    実行結果は以下の通り

    # Step1
    [[  4  12  21]
     [ 12  42  73]
     [ 21  73 131]]
    # Step2
    [[ 1.76530612 -0.39795918 -0.06122449]
     [-0.39795918  0.84693878 -0.40816327]
     [-0.06122449 -0.40816327  0.24489796]]
    # Step3
    [[ 20]
     [ 70]
     [124]]
    # Step4
    [[-0.14285714]
     [ 0.71428571]
     [ 0.57142857]]

     

     

  • 線形代数 スカラー・ベクトル・行列を整理する

    線形代数 スカラー・ベクトル・行列を整理する

    はじめに

    重回帰分析を進めるにあたりスカラー、ベクトル、行列を整理。ベクトルと行列の足し算・引き算についてまとめた。

    スカラー

    “` x, y, z, M, N “`

    数学に出てくる記号

    ベクトル

    複数の定数、複数の変数を集めたもの。
    スカラーが複数個集まれば、ベクトルになる。
    教科書やノートではベクトルのxはスカラーのxと混乱するのを防ぐべく、太文字で書くのが一般的。

    エクセルのカラムをイメージするとよい

    横向きにする事も可能。
    その場合は転置の記号(T)を付ける

    行列

    ベクトルに対して横方向を持ったもの

    この場合は、3 * 2の行列

    行列の演算(足し算・引き算)について

    対応するところを合わせる

    足し算の場合

    引き算の場合

    条件

    計算するベクトルの行と列の数が同じである事

    行列の演算(掛け算)について

    基本的に行列の割り算はない。分数をかける事により掛け算のみで代用できるため。

    行列は対応するところを計算するわけではない。

    例えばこのような行列があった場合

    縦、横に補助線を引く

    左側と右側を掛ける。

     

    条件

    足し算・引き算とは違い、サイズが同じでなくても良い。

    内側の2つが同じである事。

    “`N… Aの行 
    M… Aの列
    O… Bの行
    P… Bの列 “`

    だとすると

    AとBの行列を掛ける場合、
    M=Oが一致している事。

    また、算出されるCの行と列の数はN・Pになる

    ベクトル・行列を掛けるとどうなるか

    転置の公式

    ベクトルで微分の公式

    最後に

    本記事はキカガクさんの Udemyで勉強したノートになります。
    あくまでも私のノートになりますので詳しく知りたい方はキカガクさんのコースを受講してみてください

    https://www.udemy.com/kikagaku_blackbox_2

     

     

  • 単回帰分析の傾きをPython(numpy)で求める

    単回帰分析の傾きをPython(numpy)で求める

    はじめに

    単回帰分析をする際、重要になるのが、「傾き」と「切片」。
    「切片」はセンタリングを行うことにより省略可能だが、「傾き」を計算するのは複雑な式を用いる。 難しそうなインパクトが強すぎて中身がまったく頭に入ってこない。 これをnumpyで実装する。

    実装

    準備

    まずは定数を定義

    # -*- coding: utf-8 -*-
    
    import numpy as np
    # ベクトルの定義
    # numpyでは([])で括る
    
    # 与えられたもの部屋の広さとか
    x = np.array([1,3,5,10,20])
    # その結果。値段など。
    y = np.array([2.5,6,11,21,38])
    
    # 全ての配列を表示
    print ("全ての配列を表示")
    print (x)
    print (y)

    描写するとこのような感じになる。 データの中心化を行う。値から、平均分を引く

    ## データの中心化
    # 平均の算出
    print x.mean()
    print y.mean()
    
    print ("中心化")
    # cはcenteringの略とする
    # pandsでも中心化する方法は存在する
    xc = x -x.mean()
    print (xc)
    
    yc = y - y.mean()
    print(yc)
    

    描写するとこのような感じになる。
    グラフの形は変わらず、全体的に中心になった。  

    傾きを計算する

    改めて計算式を確認。
    分母、分子をそれぞれ別々に計算する。 numpyで計算する際は、このようになる

    # 分母はxc * xcで、最後に足す
    xcxc = xc * xc
    print xcxc
    print ("分母:")
    print xcxc.sum()

        次に分子

    xcyc = xc * yc
    print ("分子:")
    print xcyc.sum()
    

    最後に分子と分母を組み合わせる

    answer = xcyc.sum()/xcxc.sum()
    print ("傾き:")
    print (answer)
    

     

    実施結果

    $ python regression.py
    全ての配列を表示
    [1 2 3]
    [2.  3.9 6.1]
    2.0
    4.0
    中心化
    [-1.  0.  1.]
    [-2.  -0.1  2.1]
    パラメータaの計算
    [1. 0. 1.]
    分母:
    2.0
    分子:
    4.1
    傾き:
    2.05

    傾きを元に実践を引いてみるとこのようになる 悪くなさそう。 実は実際はscikit-learnを使うともっと早いようだ。  

  • csvデータを簡単にグラフに描写する

    csvデータを簡単にグラフに描写する

    はじめに

    CSVファイルなどを手軽にグラフ化したいことがある。そんな時matplotlib.pyplotを使えば直ぐに簡易的なグラフに描写することができて便利だ csvの中身は以下のものとする

    a b
    10.5    22
    15.4    7.23
    11.8    7.1
    81.2    7.3
    15.1    13.4
    9.2 11.4
    

    実装方法

    import pandas as pd
    
    df = pd.read_table('~/Documents/sample.csv')
    a = df['a']
    b = df['b']
    
    import matplotlib.pyplot as plt
    plt.scatter(a,b)

    scatterが散布図を指定する事になる。

  • pandasでtab区切りのデータを読ませる

    pandasでtab区切りのデータを読ませる

    はじめに

    pandasでデータを読み込もうとした際、read_csvを使ったがタブが¥tとして読み込まれてしまい、期待通りの結果にならなかった ちなみに読み込んだデータはこちら

    $ cat ~/Documents/sample.csv 
    a   b
    10.5    22
    15.4    7.23
    11.8    7.1
    81.2    7.3
    15.1    13.4
    9.2 11.4

    原因

    pandasではcsvを読み込む処理と、tab区切りのデータを読み込ませる処理が明確に分かれている

    対処

    read_csvをread_tableに修正することで期待通りに読み込むことができた。 また、表示する件数を絞りたい場合はhead()を利用する 3を引数に渡すことで表示件数を3件に絞ることが可能になる。