質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.91%

決定領域のコード

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 189

assa

score 30

イメージ説明
質問は決定領域のコードでこの下のコードを実行すると、
データーはプロっとされるのですが、
決定境界を表す直線が出てきません。(グラフを二つに分ける)
どこを変えるといいのでしょうか。
間違えている箇所がわかりません。
教えてください。
plot_decision_regionsこの関数が決定領域の図です。

特徴量は2つです。
zのあたいは0か1です。

よろしくお願いします。

import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
%matplotlib inline
from matplotlib.colors import ListedColormap

iris=datasets.load_iris()
x=iris.data[:,[2,3]]
y=iris.target
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=1,stratify=y)

plot_decision_regions(x=x_train_01_subset,
                     y=y_train_01_subset,
                     classifier=lrgd)

class LogisticRegressionGD:
    def __init__(self,eta=0.05,n_iter=100,random_state=1):
        self.eta=eta
        self.n_iter=n_iter
        self.random_state=random_state

    def fit(self,x,y):
        rgen=np.random.RandomState(self.random_state) #インスタンス
        self.w_=rgen.normal(loc=0.0,scale=0.01,size=1+x.shape[1]) #特徴量+バイアス
        self.cost_=[]

        for i in range(self.n_iter):
            net_input=self.net_input(x)
            out_put=self.activation(net_input)
            errors=(y-out_put)
            self.w_[1:]+=self.eta*x.T.dot(errors)
            self.w_[0]+=self.eta*errors.sum()

            cost=-y.dot(np.log(out_put))-((1-y).dot(np.log(1-out_put)))
            self.cost_.append(cost)            


    def net_input(self,x):
        return np.dot(x,self.w_[1:])+self.w_[0]

    def activation(self,z):
        return 1./(1.+np.exp(np.clip(z,-250,250)))

    def predict(self,x):
        return np.where(self.activation(self.net_input(x))>=0.5,1,0)


def plot_decision_regions(x,y,classifier,test_idx=None,resolution=0.02):


    markers=('s','x','o','^','v')
    colors=('blue','red','lightgreen','gray','cyan')
    cmap=ListedColormap(colors[:len(np.unique(y))])


    x1_min,x1_max=x[:,0].min()-1,x[:,0].max()+1
    x2_min,x2_max=x[:,1].min()-1,x[:,1].max()+1

    xx1,xx2=np.meshgrid(np.arange(x1_min,x1_max,resolution),
                       np.arange(x2_min,x2_max,resolution))

    z=classifier.predict(np.array([xx1.ravel(),xx2.ravel()]).T)

    z=z.reshape(xx1.shape)
    plt.contourf(xx1,xx2,z,alpha=0.8,cmap=cmap)
    plt.xlim(xx1.min(),xx1.max())
    plt.ylim(xx2.min(),xx2.max())

    for idx,c1 in enumerate(np.unique(y)):
        plt.scatter(x=x[y==c1,0],y=x[y==c1,1],
                   alpha=0.8,
                   c=colors[idx],
                   marker=markers[idx],
                   label=c1,
                   edgecolor='black')


x_train_01_subset=x_train[(y_train==0)|(y_train==1)]
y_train_01_subset=y_train[(y_train==0)|(y_train==1)]
lrgd=LogisticRegressionGD(eta=0.05,n_iter=1000,random_state=1)
lrgd.fit(x_train_01_subset,y_train_01_subset)
plot_decision_regions(x=x_train_01_subset,
                     y=y_train_01_subset,
                     classifier=lrgd)
コード
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

コピペミスだと思いますが、シグモイド関数の分母の指数が e^{-x} でなく、e^x になっていて、間違っています。

- 1.0 / (1.0 + np.exp(np.clip(z, -250, 250)))
+ 1.0 / (1.0 + np.exp(-np.clip(z, -250, 250)))

イメージ説明

書籍のコードは GitHub に上がっているようなので、動かない場合はこちらのものと比較するとよいかと思います。

python-machine-learning-book-2nd-edition/ch03.ipynb at master · rasbt/python-machine-learning-book-2nd-edition

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/08 01:50

    原因がわかりました。self.activation() 内の式が間違っています。

    キャンセル

  • 2020/07/08 01:53

    本当にありがとうございました

    キャンセル

  • 2020/07/08 01:54

    実行したらできました。
    ありがとうございました

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る