ロジスティック回帰 - yesまたはno

ロジスティック回帰は、分類問題を解決することです。コードの一部は、YESまたはNOに答えるために必要とされます。メッセージが来たときに、そのようなスパイシーなチキンメールなどのカテゴリーでは、このメッセージがスパムであるかどうかを特定する必要があります。

簡単な例

借りAndrew Ng言われるために生徒の成績や大学のアプリケーションの例Logistic Regressionアルゴリズムを。あなたは歴史の学生の2つのクラスを持っているし、レコードが入院することになっていると仮定し、あなたが学生の新しいバッチが大学に入学するかどうかを予測する必要があります。ここで次のように一部のデータは次のとおりです。

exam1 exam2 入場料(0:失敗しました。1:渡されました)
34.62365962451697 78.0246928153624 0
30.28671076822607 43.89499752400101 0
35.84740876993872 72.90219802708364 0
60.18259938620976 86.30855209546826 1
79.0327360507101 75.3443764369103 1
45.08327747668339 56.3163717815305 0
61.10666453684766 96.51142588489624 1

ここexam1exam2モデルへの入力、すなわちとして得点Xモデルの出力が許可されるかどうか、すなわちY、前記でY \ {1,0}

関数を想定

私たちは、関数が前提と定義しH _ {\シータ}(X)、それが認められるかどうかの確率を予測するために、この関数を使用して、。だから我々はことを願っていますH _ {\シータ}(X)範囲は[0、1]です。sigmoid関数は、関数のマッチング度が非常に高いです。以下は、あるsigmoidイメージの機能:

私たちは、使用されpython、この機能を達成するために:

import numpy as np

def sigmoid(z):
    g = np.zeros(z.size)
    g = 1 / (1 + np.exp(-z))
    return g
复制代码

私たちは、それは仮定グラム(\シータ)のように定義されます。

グラム(\シータ)= \ theta_0 + \ theta_1 * X_1 + \ theta_2 * X_2 = \ ^ TXシータ

我々は作ることができるH _ {\シータ}(X)ように定義します:

H _ {\シータ}(X)= H _ {\シータ}(G(\シータ))= 1 /(1 + E ^ { -  \シータ^ TX})

コスト関数J(\シータ)

与えられたH(\シータ)定義の後、我々は定義することができますJ(\シータ)

J(\シータ)= 1 / M \ sum_ {i = 1} ^ mCost(H _ {\シータ}(X ^ I)、Y ^ I)

ときに最適なソリューションのグローバル実行勾配降下を見つけるために、J(\シータ)関数が凸関数でなければなりません。だから我々はできるCost、次のように定義されます:

コスト(H _ {\シータ}(X)、Y)= -log(H _ {\シータ}(x))をY = 1の場合
コスト(H _ {\シータ}(X)、Y)= -log(1  - 時間_ {\シータ}(x))をY = 0の場合

最終的に得られる勾配降下アルゴリズムは、差動への使用が必要です。

\ FRAC {\部分} {\部分の\ theta_j} J(\シータ)= 1 / M * \ sum_ {i = 1} ^ M(H _ {\シータ}(X ^ {I}) -  y ^ {I} )* X_ {J} ^ {I}

使用してpython次のように実装:

import numpy as np
from sigmoid import *


def cost_function(theta, X, y):
    m = y.size
    cost = 0
    grad = np.zeros(theta.shape)

    item1 = -y * np.log(sigmoid(X.dot(theta)))
    item2 = (1 - y) * np.log(1 - sigmoid(X.dot(theta)))

    cost = (1 / m) * np.sum(item1 - item2)

    grad = (1 / m) * ((sigmoid(X.dot(theta)) - y).dot(X))

    return cost, grad
复制代码

私たちは、使用scipyするアルゴリズムの最適化をある程度行うこと。

import scipy.optimize as opt
def cost_func(t):
    return cost_function(t, X, y)[0]


def grad_func(t):
    return cost_function(t, X, y)[1]


theta, cost, *unused = opt.fmin_bfgs(f=cost_func, fprime=grad_func,
                                     x0=initial_theta, maxiter=400, full_output=True, disp=False)
复制代码

この方法により、使用する必要がモデルで得ることができます\シータしたがって、モデル訓練良いです。

可視化

観測データとの間に法律を容易にするために、我々はアウトデータを視覚化することができます


def plot_data(X, y):
    x1 = X[y == 1]
    x2 = X[y == 0]

    plt.scatter(x1[:, 0], x1[:, 1], marker='+', label='admitted')
    plt.scatter(x2[:, 0], x2[:, 1], marker='.', label='Not admitted')
    plt.legend()

def plot_decision_boundary(theta, X, y):
    plot_data(X[:, 1:3], y)

    # Only need two points to define a line, so choose two endpoints
    plot_x = np.array([np.min(X[:, 1]) - 2, np.max(X[:, 1]) + 2])

    # Calculate the decision boundary line
    plot_y = (-1/theta[2]) * (theta[1]*plot_x + theta[0])

    plt.plot(plot_x, plot_y)

    plt.legend(['Decision Boundary', 'Admitted', 'Not admitted'], loc=1)
    plt.axis([30, 100, 30, 100])
    plt.show()
复制代码

効果はこのようなものです:

見通し

計算すると\シータ後の進路我々は予測するこれを使用することができますので、あなたが書くことができるpredict機能を

import numpy as np
from sigmoid import *


def predict(theta, X):
    m = X.shape[0]
    p = np.zeros(m)

    prob = sigmoid(X.dot(theta))
    p = prob > 0.5
    return p
复制代码

X確率がより大きい場合、データ、0.5時間、私たちは、大学のアプリケーションのために予測することができます。

上記のロジスティック回帰アルゴリズムロジスティック回帰の基本的な実現には、あなたの助けのために、この記事ことを期待してMLには非常に基本的な、非常に強力なアルゴリズムです

ます。https://juejin.im/post/5d05def26fb9a07efb69842cで再現

おすすめ

転載: blog.csdn.net/weixin_34306446/article/details/93173270