pikesaku’s blog

個人的なプログラム勉強メモです。記載内容について一切の責任は持ちません。

OpenStack Ironic調査メモ

news.mynavi.jp
OpenStack Ironicを動かしてみました Part1 - テックセンター - Blog - テックセンター - Dell コミュニティ
OpenStack Ironicを動かしてみました Part2 - テックセンター - Blog - テックセンター - Dell コミュニティ

www.slideshare.net


・ベアメタル・プロビジョニングを実施
 
・サーバの電源操作や起動順位の操作が必要 
 
PXE、IPMIを利用。対応したドライバを提供
 
・より幅広い物理マシンを扱うために、各ベンダーに対応したドライバも提供
 
・物理インスタンス時、ディスク初期化などクリーニング処理を実施
 
・役割は以下の通り。
 ハイパフォーマンスコンピューティング(HPC)
 データベースホスティング
 高性能かつ高セキュリティ要件のための専用ハードウェア
 クラウドインフラの高速デプロイ
 
・物理マシン情報を事前に設定する必要あり。情報は以下の通り。

登録情報 説明
物理マシン情報 IPMIのIPアドレスとユーザー名とパスワード、サーバSPEC、MACアドレス
対応するベアメタルドライバ ベアメタルドライバ。IPMIが汎用的に利用される。特定HWベンダ向けとしてCIMC、iLO、DRACがあり
対応するデプロイイメージ 最初にブートするイメージ

 
・ユーザー操作時に指定が必要な情報は以下の通り

登録情報 説明
ユーザーイメージ 物理マシンに書き込まれるOSイメージ
フレーバー 指定したフレーバーを超えるスペックを持つ物理マシンが選択
ネットワーク デプロイ後に接続するNW。物理スイッチと連動し実現

 
・Ironic物理インスタンス起動フロー
 ①Novaがフレーバー選択し、Ironicにデプロイ指示
 ②IronicはGlace、Neutronと連携しデプロイイメージをTFTPサーバにコピー
 ③Ironicは対象サーバにIPMI経由でPXE設定&起動をする。
 ④TFTPサーバが対象サーバにデプロイイメージを送信し、デプロイイメージが起動
  ※対象サーバのMACアドレス情報も見てデプロイイメージ送信判断
 ⑤デプロイイメージにより対象サーバのローカルディスクがIronic稼働ホストのiSCSIターゲットとして認識
 ⑥IronicがddコマンドでOSイメージをiSCSIターゲットに書き込み。
 ⑦Ironicがローカルディスクから起動する設定をして対象サーバを再起動する。
 
 

詳解ディープラーニングを読んで(必要な数学知識-微分編)

読んだ本

 
Amazon CAPTCHA
 

DeepLearningに必要な数学知識

偏微分
線形対数
 

まず微分とは?

 
y = f(x)
 
fという関数がある時、xの各点における傾きを示す関数を導くことを微分する」という。
傾きを示す関数を導関数or微分という。
導関数により値がゆっくり変わるのか、急激に変わるのか、その変化の仕方を表す。
detail.chiebukuro.yahoo.co.jp

 
微分の表記方法は複数あり。上記の関数の場合、以下の通り。(他にも表記方法あり。以下は一部)
微分の記法 - Wikipedia
 

①y'

②f'(x)

f:id:pikesaku:20170810204639p:plain
 
※dはdifferntiation(微分)
 
微分は変数が一つ
 
微分」を導く定義式は以下の通り。
 
f:id:pikesaku:20170813142546p:plain
 
x2点の時のyの値の差分をx2点間の距離で割り、傾きを算出している。
∆xはx2点間の距離(∆はMacではoptions+jで入力可能)
 

偏微分とは?

 
変数を2つ以上持つ関数に対し、いづれか1つの変数に関して微分すること
 
例) 2変数関数 z=f(x,y)の場合 
 
表記方法は以下の通り
f:id:pikesaku:20170813145206p:plain
f:id:pikesaku:20170813145211p:plain
 
dではなく∂(デル)
sigmac.hatenablog.jp
 
定義式は以下の通り。
 
f:id:pikesaku:20170813144724p:plain
 
導関数ではなく偏導関数という。
 
例) f(x,y) = x^2 + 3y + 1の場合
 
xの偏微分

f'(x)=((((x+∆x)^2)+3y+1)-(x^2 + 3y + 1))/∆x
f'(x)=((x^2+2x∆x+∆x^2+3y+1)-(x^2+3y+1))/∆x
f'(x)=(x^2+2x∆x+∆x^2+3y+1)-x^2-3y-1)/∆x
f'(x)=2x∆x+∆x^2/∆x
f'(x)=2x+∆x

∆xはlimでなくなるため、偏微分は2x
 
yの偏微分

f'(y)=((x^2+3(y+∆y)+1)-(x^2+3y+1))/∆y
f'(y)=((x^2+3y+3∆y+1)-(x^2+3y+1))/∆y
f'(y)=(x^2+3y+3∆y+1-x^2-3y-1)/∆y
f'(y)=3∆y/∆y
f'(y)=3

∆yはlimでなくなるため、偏微分は3
 

微分係数とは?

 
変数が任意の値の時の微分
例) 関数f(x,y) = x^2 + 3y + 1のx=aの場合
f'(a)=2a
 
上記関数をグラフにすると以下
x^2 + 3y + 1 - Google 検索
 
xの偏微分はyが任意の値の時のもの。(yが任意の値の時の平面で切断した時のグラフの断面)
yの偏微分はxが任意の値の時のもの。(xが任意の値の時の平面で切断した時のグラフの断面)
 

偏微分の基本公式

 
偏微分も基本的な算術演算子を用いることができる。
公式は以下の通り。
 
f:id:pikesaku:20170813162413p:plain
 
f:id:pikesaku:20170813162538p:plain
 

合成関数

 
以下の関係の関数f,uがある時
y=f(u)
u=g(x)
これらを関数zでまとめると以下表記
z=f(g(x))
zを合成関数と呼ぶ。
合成関数zの微分を関数f,gの微分を使って表記すると以下
z'(x)=f'(u)*g'(x)
 
合成関数の微分は、それぞれの関数の微分を掛け算したものになる。
これを連鎖律(chain rule)と呼ぶ
 
証明は以下の通り。
以下2つの関数の場合

y=u^2
u=x^2

 
これを普通に微分すると

y=x^4
y'=4x^3

 
※以下公式利用

y=x^n 
y'=nx^(n-1)

 
合成関数の連鎖律を使い微分すると、、、

1つ目の関数fを微分

y=u^2
f'(u)=((u+∆u)^2-u^2)/∆u
f'(u)=(u^2+2u∆u+∆u^2-u^2)/∆u
f'(u)=(2u∆u+∆u^2)/∆u
f'(u)=2u+∆u
f'(u)=2u

 
2つ目の関数を微分

u=x^2
〜省略〜
g'(x)=2x

 
2つの微分を掛け算

z'(x)=2u*2x
z'(x)=2(x^2)*2x
z'(x)=4x^3

 
普通に微分した場合と、合成関数の連鎖律を使った場合が同じ結果となった。
 

偏微分の合成関数

 
偏微分も合成関数の連鎖律が適用できるとのこと。
導出には微分という考え方がある。
※難しそうなので、公式だけ覚える。 
 
以下のように多変数関数zおよびui(i=1,...,n)が以下の式で与えられた場合
f:id:pikesaku:20170813194447p:plain
 
以下の公式が成り立つ。
f:id:pikesaku:20170813194444p:plain
 
連鎖律はニューラルネットワークの理論で頻繁に用いられるよう。
ひとまず理解はさておき、覚えて先に進んでみる。

ロジカルシンキングについてメモ

参考

 
Amazon CAPTCHA
 

相手に物事を伝える時

以下を含めること
・明快な課題
・課題に対する回答
・相手に期待する反応

※「自分はこう考える」はダメ。相手にどう伝わるか意識する。

Python統計学勉強会参加メモ

Jupiter Notebook

参考

jupyter.org

インストー
$ pip3 install --upgrade pip
$ pip3 install jupiter

起動
$ jupyter notebook


上記コマンド実行後に出力されたTokenつきURLにアクセスする。
http://localhost:8888/?token=397ffd660a92ec8bc712d3f963853735553cff7b852aade9

メモ

実行しても既存の実行済みデータは保持される。
対話式と同様にオブジェクトでコード完了させると、内容がprintされる。
例)
f:id:pikesaku:20170730202753p:plain

※以降のPythonコードはJupiterで実行

一様分布乱数

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
np.random.seed()
result = np.random.randint(1,101,10000)
plt.hist(result, bins=5)


f:id:pikesaku:20170730204255p:plain

・1行目はおまじない
・1〜100(101-1)までの数字をランダムに10000個生成
・histメソッドでヒストグラム生成
・binsは集計する区間数。100までを5個に分ける=>20づつ集計

メモメモ後でまとめる。。。。

Python統計学勉強会メモ

jupiterのきまりごと

実行してもすでに読み込み済み内容は保持される。
変数名で終わりになるとprintされる

ndarray型とは?

足し算や掛け算で利用した際は、要素同士を計算してくれる。

正規分布とは
ある値を中心とし、そこを起点にある程度のばらつきをもったデータの集合

2こうぶんぷ


numpy.random.binomial(n, p, size=None) 

2こうぶんぷは偶然なのかを調査

bostonデータはボストンを500くらいに区切った区画ごとのデータ

機会学習ではtargetは正解データ

昔はtex最近はjupiterでやる人おおい。
jupiterからダウンロードで図を保存可能

plt.hist(prices, 20, cumulative=True) 

cumulativeオプションで累積グラフになる

y, binEdges = np.histogram(prices, bins=20) 
histgramはグラフではなく、データとして取得するメソッド

pythonは戻り値が2つ以上つかえる。pythonの特徴



plt.plot(bincenters, y.cumsum()) 

cumsumは累積を出してくれる。



abc分析とは?

ヒストグラムのY軸の値順になれべかえたものが、ABC分析

np.average(prices) 

平均値 = average

中央値= median
成績順にならべかえた時、真ん中の人がどの点数であったか?

3人いて以下の点数であったとき
10 20 100

平均43.333333
中央20

四分位数とは?
集団を順位別に4分割し、その分割の句切れ目を、それぞれ
第一四分位数
第二四分位数
第三四分位数
という。

これで傾向がわかる。
100点満点テストの場合、
第二四分位数の位置の人の点数が30点であれば、難しいテストだったのかな?など



pandas
データ解析用のライブラリ

boston

boston.target

boston.data
がある。
機会学習のデータセットは、targetが正解データ

Dataframeを使う際はcolumは大事。データを指定して取り出す時に使う。インデックス(数字)を指定しても可能だが、面倒・間違いやすい

plt.scatter(df['RM'], df['PRICE'], s=100, alpha=0.5) 

sは点のサイズ

alphaは透明度
plt.figure(figsize=(12, 8))
plt.scatter(df['RM'], df['PRICE'], s=100, alpha=0.5) 


データフレームにすると散布図が楽

相関係数

y=x
これは相関係数1

y=-x
これは相関係数-1

dataframeを使うと相関係数の一覧が簡単に出せる
df'CRIM', 'RM', 'PRICE'.corr() 

どの要素とどの要素が連動しているか?

感覚的に0.4~0.5あれば、関係性あると講師は考えている
一般的には0.5
ただケースバイケース。


df.corr()
これで実行すると、全要素の解析をしてくれる。

相関係数は線形であるかを見ている。
そのため、関連性はあっても線形でない場合は、0になる。

直線でない場合は、低くなる点に注意。

波線など。。。。


df.describe()

代表値の一覧が観れる。


df['PERROOM'] = df['PRICE'] / df['RM'] 
こんな感じでフィールド追加できる
これはndarrayだから

std = np.std(df['PERROOM']) 
このstdで標準偏差

plt.figure(figsize=(20,10))
plt.scatter(df['RM'], df['PRICE'], c = df['DEV'], s = 200, alpha = 0.5) 

plt.figure(figsize=(20,10))
plt.scatter(df['RM'], df['PRICE'], c = df['DEV'], s = 200, alpha = 0.5)
plt.colorbar()

このcは色をきめる。
部屋と価格で散布図だが、そこに色の情報も追加している。


回帰直線とは?

最小二乗方

これは、直線を作って、そことの距離が近い線をもとめる。

計算したら、面倒

これを、scikit-learnを使うと楽

pvalue 
stderr 

を使うケースは、講師の経験上でもない。

y = ax + b
aがslope(傾き)
bがインターセプト(雪片)

plotx = np.arange(3, 10, 1)
3から10までの1づつデータを生成

■人口知能の機能
回帰
分類→画像認識で利用される

回帰直線を作ると、データのない部分についても推測で使える。
ただし、、、、データのない部分については、回帰直線だと間違いが多い。

非線形なデータは回帰直線だと間違いが多くなる。

この場合、

回帰曲線が使える。

次元数を上げていくと、複雑なパターンを扱える。

y = ax^2+bx+c

2次元は一回カーブできる。
P33は2次元。資料謝り


res = opt.curve_fit(fit_func, df['RM'], df['PRICE']) 
これで回帰曲線を得ることができる

2次元方程式では、1回だけカーブできる。

2回カーブするには、3次元方程式
ax^3+bx^2+cx+d

必ずしも多次元にすればいいというわけではなし。
多次元

この予測は距離にじょうでやってるが、人口知能では、きょりにじょうは使わない。

def fit_func(x, a, b, c, d): ⭐️この引数の順番は大事
  return a * x**3 + b * x**2 + c * x + d 
res = opt.curve_fit(fit_func, df['RM'], df['PRICE'])
上記ではfit_funcは、関数を渡している。

このresの中は、
(array([  2.47012408, -22.64326546,  66.05885736]),
 array([[  8.44020212e-02,  -1.08471220e+00,   3.44183985e+00],
        [ -1.08471220e+00,   1.40942558e+01,  -4.52003372e+01],
        [  3.44183985e+00,  -4.52003372e+01,   1.46506533e+02]]))
In [ ]:

これは何を意味しているのか?

IoT検定の教科書



X, Y = np.meshgrid(plotx, ploty) 


回帰分析に使えるデータセットは、

ボストンと疾患データ


日本は
data.gov

2,3次元回帰では難しい場合にSVMをつかう。これは人口知能による回帰
高次元ベクトル解析

環境作る方法

1 自分でライブラリ構成する場合
2 anacondaを使う場合
3 pyenv
4 pycharm→ここからjupiter note bookを作れる。ただ動きが変な場合あり。

anaconda navigator

anacondaはライブラリ管理ツール

anacondaにもcondaという管理コマンドがあり。
condaはpipと同じもの。
condaの方が依存関係などがよく管理されてる。

時系列データとは?

メモ&要約

 

時系列データとは?

 
時系列データとは「ある一定の間隔で測定された結果の集まり」
 
連続する2つのデータ間は直線的に変化すると仮定
 
時系列データは主に以下4つの変動要因を持つ
①傾向変動
長期的に見て上昇(増加)傾向なのか、それとも下降(減少)傾向なのかを示す。人口増加やGDPの成長等。
細かい変化ではなく大きな傾向をとらえる際に見る要素
 
②循環変動
ある周期性をもって現れる変化を示すもの
景気循環のように3~10年程度の期間で繰り返し起こる変化を示す
傾向変動と違って、上昇と下降の動きがセットで含む
 
③季節変動
文字通り季節ごとに繰り返される変化を示すもの
1年を周期とした変動のパターンを見る
 
④不規則変動
上記3つの変動要素では説明がつかない短期的な変化を示すもの
例) 自然災害による株価の変動
 
ログデータにも時間情報はあるが、これは時系列データではない。
 

事例列データの主な活用目的

 
時間軸に沿ってある数値が変化していく傾向を理解することで、これから先に起こることを(ある程度)予測すること
例) 「この周期的な変化がこの先も繰り返されるなら、今は●●だけど、きっと近い将来に▲▲になる!」

Jubaanomalyを使って不正ログイン検知

作ったプログラムは以下

①make_test_data.py

学習データにするログイン記録データを生成するツール。
1行あたりのフォーマットは以下。
日時, 接続元IPアドレス
オプションでログインソースの傾向を決められる。
本物のログイン記録になるっぽく少しいじってる。
 

②study.py

①で出力した学習データを学習するツール
 

③test.py(作成中)

②で作った学習モデルに対してテストをするツール
以下3つのデータをインプットさせ、外れ値を出力する。
1) 学習済みデータ
2) 未学習データだが不正ログインではないログインデータ
3) 不正ログインのログインデータ
 

④mylib.py

②、③のプログラムの共有ライブラリ
 

実行方法は以下(作成中)

 
 
 

①make_test_data.py

# -*- coding: utf-8 -*-

import argparse
import random
import ipaddress
import pandas as pd
import numpy as np
import datetime


all_prefixes = [
    # http: // bgp.he.net / AS4713
    # 上記URLより適当に選択
    '20.197.0.0/20',       # Computer Sciences Corporation US
    '27.114.0.0/17',       # NTT Communications Corporation JP
    '58.88.0.0/13',        # NTT Communications Corporation JP
    '60.32.0.0/12',        # NTT Communications Corporation JP
    '61.4.152.0/23',       # NDS Co.,Ltd JP
    '103.211.116.0/24',    # Internet Gateway Japan CH
    '166.119.72.0/21',     # Ministry of Agriculture, Forestry and Fisheries JP
    '169.145.224.0/20',    # SAP America Inc. US
    '170.252.144.0/23',    # Accenture LLP US
    '203.215.128.0/24'     # Servcorp SmartOffice1 GB
]


parser = argparse.ArgumentParser(description='making test data tool')
parser.add_argument('-n', '--num',      dest='num',      help='num',                     required=True, type=int)
parser.add_argument('-b', '--base',     dest='base',     help='num of base ips',         required=True, type=int)
parser.add_argument('-r', '--rate',     dest='rate',     help='rate of base ips(0-100)', required=True, type=int)
parser.add_argument('-p', '--prefixes', dest='prefixes', help='num of prefixes' + '(1-' + str(len(all_prefixes)) + ')', required=True, type=int)
args = parser.parse_args()


def get_target_ips(prefixes):
    target_ips = list()
    num_per_prefix = int(args.num / len(prefixes))
    for prefix in prefixes:
        # 大きなサブネットのIPで占有されないよう同じ数だけ選択
        if num_per_prefix > len(list(ipaddress.ip_network(prefix))):
            num_per_prefix = len(list(ipaddress.ip_network(prefix)))
        target_ips += random.sample(list(ipaddress.ip_network(prefix)),num_per_prefix)
    return target_ips


def get_base_ips(target_ips):
    # ターゲットIPからランダムにベースとなるIPを選択
    ips = random.sample(target_ips, args.base)
    num_of_base_ips = int(args.num / 100 * args.rate)

    # ベースとなるIPの出現回数に偏りをつける。
    # まずは平均をとる。
    num_per_ips = dict()
    for ip in ips:
        num_per_ips[ip] = int(num_of_base_ips / len(ips))
    # 次にランダムに2つチョイスし、出現回数の偏りをつける操作を行う。
    if len(ips) > 1:
        for _ in range(args.base):
            random_ips = random.sample(ips, 2)
            goukei = num_per_ips[random_ips[0]] + num_per_ips[random_ips[1]]
            num_per_ips[random_ips[0]] = int(goukei * 2 / 3)
            num_per_ips[random_ips[1]] = goukei - num_per_ips[random_ips[0]]

    base_ips = list()
    for ip,num in num_per_ips.items():
        base_ips += [ip for _ in range(num)]

    return base_ips


def get_random_date():
    we_th  = 4
    we  = 0
    non_regular_th = 3
    non_regular = 0
    while True:
        td = datetime.timedelta(days=365)
        end = datetime.datetime.now()
        start = end - td
        dts = (end - start).total_seconds()
        random_date = start + pd.Timedelta(np.random.uniform(0, dts), 's')
        if random_date.weekday() >= 5:
            we += 1
            if we >=  we_th:
                return random_date
            continue
        if random_date.hour >= 18 or 0 <= random_date.hour <= 8:
            non_regular += 1
            if non_regular >= non_regular_th:
                return random_date
            continue
        return random_date


def chk_args():
    if args.prefixes >= len(all_prefixes):
        print('Error: -p NUM must be smaller than ' + str(len(all_prefixes)))
        exit()


if __name__ == '__main__':
    chk_args()
    prefixes = random.sample(all_prefixes, args.prefixes)
    target_ips =  get_target_ips(prefixes)
    base_ips = get_base_ips(target_ips)
    if (args.num - len(base_ips)) > len(target_ips):
        other_ips = target_ips
        other_ips += random.sample(target_ips, args.num - len(base_ips) - len(target_ips))
    else:
        other_ips = random.sample(target_ips, args.num - len(base_ips))
    all_ips = base_ips + other_ips
    all_ips = [[ip, get_random_date()] for ip in all_ips]
    for ip in all_ips:
        print(str(ip[1].strftime("%Y/%m/%d %H:%M:%S")) + ',' + str(ip[0]))

 

②study.py

# -*- coding: utf-8 -*-

import signal
import argparse
from mylib import *

#parser = argparse.ArgumentParser(description='jubaanomaly study tool')
#parser.add_argument('name',                            help='data name')
#parser.add_mutually_exclusive_group('-f', '--file',    dest='file',    help='file', type=argparse.FileType('r'))
#parser.add_mutually_exclusive_group('-d', '--display', dest='display', help='display studied data', action="store_true", default=False)
#args = parser.parse_args()


parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('name', help='name')
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('-f', dest='file',    help='file',    type=argparse.FileType('r'))
group.add_argument('-d', dest='display', help='display', action='store_true')
args = parser.parse_args()


if __name__ == '__main__':
    signal.signal(signal.SIGINT, do_exit)
    if args.display:
        anom = connect_srv(args.name, 'display')
        display_studied_data(anom)
    else:
        anom = connect_srv(args.name, 'study')
        study_data = get_study_data(args.file)
        result = input_data(args.name, anom, study_data, 'study')

 

③test.py

 

④mylib.py

# -*- coding: utf-8 -*-

import signal
import datetime
import dateutil.parser

from cymruwhois import Client
from jubatus.anomaly import client
from jubatus.common import Datum


def err_fin(mes):
    print('Error: ' + mes)
    exit(1)


def warn_continue(mes):
    print('Warn: ' + mes)


def connect_srv(name, mode):
    try:
        anom = client.Anomaly("127.0.0.1", 9199, name)
        anom.clear()
    except:
        err_fin('failed to connect to server')

    if mode == 'test' or mode == 'display':
        try:
            anom.load(name)
        except:
            err_fin('failed to load data')
    return anom


def display_studied_data(anom):
    try:
        data = anom.get_all_rows()
    except:
        err_fin('failed to display data')
    if not data:
        warn_continue('no data')
    else:
        for ent in data:
            print(ent)


def do_exit(sig, stack):
    print('You pressed Ctrl+C.')
    print('Stop running the job.')
    exit(0)


def get_study_data(file):
    tmp_data1 = [line.strip().split(',') for line in file]
    tmp_data2 = list()
    for ent in tmp_data1:
        try:
            dt = dateutil.parser.parse(ent[0])
        except:
            err_fin('invalid date format: ' + ent[0])
        tmp_data2.append([dt.strftime('%Y%m%d-%H:%M:%S'), dt.weekday(), dt.strftime('%H'), ent[1]])

    src_ips = {ent[3] for ent in tmp_data2}
    src_ips_info = get_src_ips_info(src_ips)

    study_data = list()
    for ent in tmp_data2:
        src_ip = ent[3]
        src_ip_int = ip2int(src_ip)
        study_data.append(ent + [src_ip_int] + src_ips_info[src_ip])
    return study_data


def get_src_ips_info(src_ips):
    src_ips_info = dict()
    c = Client()
    for r in c.lookupmany(src_ips):
        src_ips_info[r.ip] = [r.asn, r.prefix, r.cc, r.owner]
    return src_ips_info


def ip2int(src_ip):
    o = [int(i) for i in src_ip.split('.')]
    src_ip_int = (16777216 * o[0]) + (65536 * o[1]) + (256 * o[2]) + o[3]
    return src_ip_int


def input_data(user, anom, data, mode):
    datum = Datum()
    result = list()
    for ent in data:
        #['20170101-00:00:00', 6, '00', '8.8.8.8', 134744072, '15169', '8.8.8.0/24', 'US', 'GOOGLE - Google Inc., US']
        date = ent[0]
        weekday_and_hour = int(str(ent[1]) +  str(ent[2]))
        ip = ent[3]
        ip_int = ent[4]
        asn = ent[5]
        cc = ent[6]
        owner = ent[7]

        string_data = [date, ip, asn, cc, owner]
        num_data = [weekday_and_hour]

        for ent in string_data:
            datum.add_string('string_data_' + str(string_data.index(ent)), ent)
#            print('string_data_' + str(string_data.index(ent)), ent)

        for ent in num_data:
            datum.add_number('num_data_' + str(num_data.index(ent)), ent)
#            print('num_data_' + str(num_data.index(ent)), ent)

        result.append(anom.add(datum))

    anom.save(user)
    return result

機械学習関係の勉強会メモ⑤

メモ

pythonのscikit-learnの勉強家
 
今のAIサービスは、ほとんど教師ありで実現されている。
http://postd.cc.practical-machibe-learning-problems

機械学習アルゴリズムとして以下があり。
・回帰
・決定木
SVM
 
回帰は、XからYを出力する規則をみつける手法
重回帰はXを構成する要素を複数にする。回帰の実践では、こちらの手法が採用されている。
 
機械学習ではデータ集め、前処理が時間かかる。
 
決定木は回帰より精度が高い傾向があり。
出力過程を可視化が可能
PDFで出力可能
 
SVMもより精度が高い傾向があり。