月: 2019年1月

  • GAE(Google App Engine)を試した

    GAE(Google App Engine)を試した

    はじめに

    GAE(Google App Engine)を使い始めたので、一度ここで整理をした。

    app.yml

    これがGAEの根幹

    runtime: python27
    api_version: 1
    threadsafe: true
    
    handlers:
    - url: /.*
      script: main.app

    使用する言語や、url /で受ける際に呼び出されるscript (この場合はmail.app)が書かれている。

    scriptに書くこと

    https://cloud.google.com/appengine/docs/standard/python/quickstart?hl=ja#mainpy

    を少し終了し、編集した。

    import webapp2
    
    class MainPage(webapp2.RequestHandler):
        def get(self):
            self.response.headers['Content-Type'] = 'text/plain'
            self.response.write('Wecome to Main Page')
    
    class sub(webapp2.RequestHandler):
        def get(self):
            self.response.headers['Content-Type'] = 'text/plain'
            self.response.write('This page is sub')
    
    
    app = webapp2.WSGIApplication([
        ('/', MainPage),
        ('/sub', sub),
    ], debug=True)

    / でリクエストされるとMainPageクラスが呼び出され、

    /subでリクエストがくるとsunクラスが呼び出されるという簡単なページ。

    アプリケーションのテスト

    Googleのプラットフォームにあげる前に、自身の環境でテストをすることが可能である。

    dev_appserver.py app.yaml

    ちなみに、dev_appserver.pyはgoogle-cloud-sdkをinstallすればbinの配下に入っている。

    $ which dev_appserver.py
    /Users/sumito.tsukada/google-cloud-sdk/bin/dev_appserver.py

    デフォルトでこのdev_appserver.pyを実施した場合、localhost:8080に繋げればアプリケーションの試験が可能だ

    http://localhost:8080/

    デプロイ

    gcloud app deploy

    GAEコンソール画面

    デプロイされたことを確認できた。

    ブラウザ確認

    自動でブラウザが立ち上がり動作確認をすることが可能。

    gcloud app browse

     

  • 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

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

     

  • VyOSでDoS対策をする

    VyOSでDoS対策をする

    はじめに

    VyOSをFirewallとして使っている人向けのシンプルなDoS対策を紹介

    特定IPからのアクセスをdrop(拒否)する

    以下のコマンドは123.45.1.10からの接続の全てを拒否する。

    set firewall name FW-eth0 rule 100 action 'drop'
    set firewall name FW-eth0 rule 100 source address ‘123.45.1.10’

    直近2秒間で100アクセスあったらdropする

    ALBとかにはない機能。以下のコマンドは
    http(80番)へ直近2秒間で100アクセスあったら止める。

    set firewall name FW-eth0 rule 51 action 'drop'
    set firewall name FW-eth0 rule 51 destination port '80'
    set firewall name FW-eth0 rule 51 protocol 'tcp'
    set firewall name FW-eth0 rule 51 recent count '100'
    set firewall name FW-eth0 rule 51 recent time '2'

    ただし、攻撃者がブラウザを閉じ、別のブラウザから攻撃して来た場合は、drop対象からはずれ、また100アクセスを超えたらブロック対象になる。

     

     

     

  • 行列演算の基礎

    行列演算の基礎

    はじめに

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

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

    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を使うともっと早いようだ。  

  • Google App Engineをコマンドで起動停止する

    Google App Engineをコマンドで起動停止する

    はじめに

    コマンドでGoogle App Engineを停止する。 
    前提条件としてgcloudコマンドがインストールされてあること。

    script

    #!/bin/bash
    set -eu
    
    env=$1
    method=$2
    
    # allocations ID取得
    ID=$(gcloud app services describe $1 | tail -n1 | awk '{print $1}' | sed "s/://g")
    echo $ID
    
    if [ $method == 'stop' ]; then
        gcloud app versions stop $ID -q
    elif [ $method == 'start'  ]; then
        gcloud app versions start $ID -q
    else
        echo ‘check your parameter’
    fi
    
    gcloud app versions list

    引数にサービス名を加えて実行する “` ./script.sh tsukada-test stop “`   “` ./script.sh tsukada-test start “` 本来ならCloudFunctionで実装したかったが、大いにはまってしまったので、急遽この方法で対応した。  

    注意事項

    コマンドを見てもらえばわかる通り、versionの指定はあっても、serviceの指定がない。

    そのため、万が一 service は違うけど、動いているversionが同じ。と言う場合、意図しない方も影響を受けてしまう。

    実はオプションで “` –service “` が用意されている。

    https://cloud.google.com/sdk/gcloud/reference/app/versions/stop?hl=ja

    必要な場合はこのオプションを活用すればよい。

     

  • 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件に絞ることが可能になる。

  • S3でアクセス欄に「エラー」と表示される件を対処する

    S3でアクセス欄に「エラー」と表示される件を対処する

    はじめに

    AWSの権限周りは複雑に設定できるだけに難しい。今回の件もその一つ。アクセス欄が「エラー」になるのでその対処を行う。

    問題

    掲題のとおり。エラーになるのだ。

    対処

    ご察しの通りロールが足りないのが問題。

    実際どのロールかというと、以下のとおり。

    以下の設定はS3のディレクトリの確認や、権限まわりを表示させることができる

            {
                "Action": [
                    "s3:ListAllMyBuckets",
                    "s3:GetBucketPublicAccessBlock",
                    "s3:GetBucketPolicyStatus",
    
                    "s3:GetAccountPublicAccessBlock",
    
                    "s3:GetBucketAcl"                
                ],
                "Effect": "Allow",
                "Resource": "arn:aws:s3:::*"
            },

    この対処を行うと、エラーは解消される。