35112


4.62365962451697,78.0246928153624,0  
↑のような形式で99行あるex2data1.txtを読み込んで、このファイルに対してロジスティック回帰分析をpythonで行いたいのですが、学習率α等を変えても何故か図のような結果になってしまいます。間違っているところがありましたら指摘していただきたく存じます。

[code]

    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    
    def sigmoid(X):
        return 1/(1 + np.exp(-X))
    data = pd.read_csv("ex2data1.txt", header=None)
    X = np.array([data[0],data[1]]).T
    y = np.array(data[2])
    
    O = np.ones(len(y))
    m = float(len(y))
    Xm = X/m
    X1 = np.c_[O,Xm]
    
    pos = (y==1)
    neg = (y==0)
    plt.scatter(X[pos,0], X[pos,1], marker='+', c='b')
    plt.scatter(X[neg,0], X[neg,1], marker='o', c='y')
    plt.legend(['Admitted', 'Not admitted'], scatterpoints=1)
    plt.xlabel("Exam 1 Score")
    plt.ylabel("Exam 2 Score")
    
    alpha = 0.5
    theta = np.array([1,1,1])
    
    for i in range(1000): #gradient
        h = sigmoid(np.inner(theta, X1))
        theta1_tmp = 1/m * np.sum((h-y)*X1[:, 0])
        theta2_tmp = 1/m * np.sum((h-y)*X1[:, 1])
        theta3_tmp = 1/m * np.sum((h-y)*X1[:, 2])
        theta = theta - alpha*np.array([theta1_tmp, theta2_tmp, theta3_tmp])
    
    theta0 = theta[0]
    theta1 = theta[1]
    theta2 = theta[2]
    
    plot_x = np.array([min(X[:,0])-2, max(X[:,0])+2])
    plot_y = - (theta0 + theta1*plot_x) / theta2
    plt.plot(plot_x, plot_y, 'b')
    
    plt.show()
    
[/code]

[![出力結果](https://i.stack.imgur.com/g5MNK.png)](https://i.stack.imgur.com/g5MNK.png)


CC BY-SA 3.0
2017-04-13T15:23:34.933
33987
2017-05-31T12:46:04.303
22545
question
python 機械学習
Logistic Regression実装について

[code]

    theta1_tmp = 1/m * np.sum((h-y)*X1[:, 0])
    
[/code]

の式から下記のステートメントは

[code]

    O = np.ones(len(y))
    m = float(len(y))
    Xm = X/m #後で1/mが出るので不要
    X1 = np.c_[O,Xm]
    
[/code]

こうかと思います。

[code]

    O = np.ones(len(X)) #入力の数分1初期化テンソルを作成(yとXは同じ数だと思うので元の式でも良いが一応定義としてXに修正)
    m = float(len(X)) #入力データ数
    X1 = np.c_[O,X] #1初期化テンソルおよび入力データ
    
[/code]

また手元で試してみましたが学習回数1000回ではエントロピー(下記クロスエントロピーのコスト関数の値をループ分の箇所に挿入してprint)が収束しませんでした。

[code]

    1/m * np.sum((-y*np.log(h) - (1-y)*np.log(1-h)))
    
[/code]

上記の値が1000回程度では0.8(これはかなり悪い値)でした。

データも私が自前で用意したものになりますのである程度結果も異なってくるかと思いますが、  
訓練回数50000回/学習率は0.001(これ以上にしたら発散した)でエントロピーの値が0.3(これもあまり良くない値0.1以下にしたい)になりましたが、plot上の境界線は「それなりに」分類できている状態となりました。  
[![結果](https://i.stack.imgur.com/4GwTl.png)](https://i.stack.imgur.com/4GwTl.png)


CC BY-SA 3.0
2017-05-29T13:20:40.493
35112
2017-05-31T12:46:04.303
2017-05-31T12:46:04.303
19716
19716
33987
answer