python 2クラスのロジスティック回帰(确率的勾配降下法版)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 2クラスのロジスティック回帰(确率的勾配降下法版)相关的知识,希望对你有一定的参考价值。

#coding: utf-8
import numpy as np
import matplotlib.pyplot as plt
import theano
import theano.tensor as T

"""
2クラスロジスティック回帰をtheanoで実装
"""

def plot_data(X, y):
    # positiveクラスのデータのインデックス
    positive = [i for i in range(len(y)) if y[i] == 1]
    # negativeクラスのデータのインデックス
    negative = [i for i in range(len(y)) if y[i] == 0]

    plt.scatter(X[positive, 0], X[positive, 1], c='red', marker='o', label="positive")
    plt.scatter(X[negative, 0], X[negative, 1], c='blue', marker='o', label="negative")

if __name__ == "__main__":
    # 訓練データをロード
    data = np.genfromtxt("ex2data1.txt", delimiter=",")
    data_x = data[:, (0, 1)]
    data_y = data[:, 2]

    # 訓練データ数
    m = len(data_y)

    # 訓練データをプロット
    plt.figure(1)
    plot_data(data_x, data_y)

    # 訓練データの1列目に1を追加
    data_x = np.hstack((np.ones((m, 1)), data_x))

    # データをシャッフル
    p = np.random.permutation(m)
    data_x = data_x[p, :]
    data_y = data_y[p]

    # 訓練データを共有変数にする
    X = theano.shared(np.asarray(data_x, dtype=theano.config.floatX), borrow=True)
    y = theano.shared(np.asarray(data_y, dtype=theano.config.floatX), borrow=True)

    # パラメータを共有変数にし、0で初期化
    # 訓練データに1を加えたのでバイアスもthetaに含めてしまう
    theta = theano.shared(np.zeros(3, dtype=theano.config.floatX), name='theta', borrow=True)

    # 訓練データのインデックスを表すシンボルを定義
    index = T.lscalar()

    # コスト関数の微分を構築
    # 確率的勾配降下法なので全データの和ではなく、index番目のデータのみ使う
    h = T.nnet.sigmoid(T.dot(theta, X[index,:]))
    cost = -y[index] * T.log(h) - (1 - y[index]) * T.log(1 - h)

    # コスト関数の微分
    g_theta = T.grad(cost=cost, wrt=theta)

    # 更新式
    learning_rate = 0.0001
    updates = [(theta, theta - learning_rate * g_theta)]

    # 訓練用の関数を定義
    # index番目の訓練データを使ってパラメータ更新
    train_model = theano.function(inputs=[index], outputs=cost, updates=updates)

    # 確率的勾配降下法
    max_epoch = 5000
    for epoch in range(max_epoch):
        for i in range(m):
            current_cost = train_model(i)
        print epoch, current_cost

    # 更新されたパラメータを表示
    t = theta.get_value()
    print "theta:", t

    # 決定境界を描画
    plt.figure(1)
    xmin, xmax = min(data_x[:,1]), max(data_x[:,1])
    xs = np.linspace(xmin, xmax, 100)
    ys = [- (t[0] / t[2]) - (t[1] / t[2]) * x for x in xs]
    plt.plot(xs, ys, 'b-', label="decision boundary")
    plt.xlabel("x1")
    plt.ylabel("x2")
    plt.xlim((30, 100))
    plt.ylim((30, 100))
    plt.legend()
    plt.show()

以上是关于python 2クラスのロジスティック回帰(确率的勾配降下法版)的主要内容,如果未能解决你的问题,请参考以下文章

python Theanoによるロジスティック回帰の実装

csharp クラスのプロパティ,フィールド情报を取得する:リフレクションを使用する

csharp 的SerialPortクラスのラッパー

java 例外について独自クラスの作成

text Java的サブクラスのコンストラクタ

java java的の実行可能クラスの雏形.CLIからの呼び出し用。