2016-06-25 2 views
1

私は分類作業のためのパーセプトロンアルゴリズムを取得しようとしていますが、何かが欠けていると思います。これは、ロジスティック回帰で達成決定境界である:Rの手動パーセプトロンの例 - 結果は受け入れられますか?

enter image description here

赤いドットがテスト1と2

This is the dataに、より良い実行した後、大学に入って、これはロジスティック回帰のためのコードですRで次のよう

dat = read.csv("perceptron.txt", header=F) 
colnames(dat) = c("test1","test2","y") 
plot(test2 ~ test1, col = as.factor(y), pch = 20, data=dat) 
fit = glm(y ~ test1 + test2, family = "binomial", data = dat) 
coefs = coef(fit) 
(x = c(min(dat[,1])-2, max(dat[,1])+2)) 
(y = c((-1/coefs[3]) * (coefs[2] * x + coefs[1]))) 
lines(x, y) 

パーセプトロンの「手動」実装するためのコードは次のとおり

これにより
# DATA PRE-PROCESSING: 
dat = read.csv("perceptron.txt", header=F) 
dat[,1:2] = apply(dat[,1:2], MARGIN = 2, FUN = function(x) scale(x)) # scaling the data 
data = data.frame(rep(1,nrow(dat)), dat) # introducing the "bias" column 
colnames(data) = c("bias","test1","test2","y") 
data$y[data$y==0] = -1 # Turning 0/1 dependent variable into -1/1. 
data = as.matrix(data) # Turning data.frame into matrix to avoid mmult problems. 

# PERCEPTRON: 
set.seed(62416) 
no.iter = 1000       # Number of loops 
theta = rnorm(ncol(data) - 1)   # Starting a random vector of coefficients. 
theta = theta/sqrt(sum(theta^2))   # Normalizing the vector. 
h = theta %*% t(data[,1:3])    # Performing the first f(theta^T X) 

for (i in 1:no.iter){     # We will recalculate 1,000 times 
    for (j in 1:nrow(data)){    # Each time we go through each example. 
     if(h[j] * data[j, 4] < 0){   # If the hypothesis disagrees with the sign of y, 
     theta = theta + (sign(data[j,4]) * data[j, 1:3]) # We + or - the example from theta. 
     } 
     else 
     theta = theta      # Else we let it be. 
    } 
    h = theta %*% t(data[,1:3])   # Calculating h() after iteration. 
} 
theta         # Final coefficients 
mean(sign(h) == data[,4])    # Accuracy 

、私は次の係数を得る:

 bias  test1  test2 
9.131054 19.095881 20.736352 

glm()ロジスティック回帰関数で計算されたものと一致88%の精度、:89%mean(sign(predict(fit))==data[,4]) - 論理的に、直線の方法はありません上記のプロットから明らかなように、すべての点を分類する。実際には、唯一の10回反復し、精度をプロット、~90%はちょうど1繰り返しの後に到達さ:ロジスティック回帰の訓練分類性能を持つラインにいる

enter image description here

、コードではないと思われます概念的に間違っている。

質問:それはロジスティック回帰と大差係数を取得するにはOKです:

(Intercept)  test1  test2 
    1.718449 4.012903 3.743903 

答えて

1

これはStackOverflowの質問よりもCrossValidated質問の本当に多くのですが、私は先に行くとお答えします。

はい、これらの2つのテクニックの間の係数の大きさを直接比較することはできないので、非常に異なる係数が得られると予想されます。

あなたは、シグモイドコスト関数に基づいて二項分布とロジットリンクを使用しているlogit(ロジスティック)モデルを使用しています。係数は、この文脈でのみ意味がある。あなたはまた、ロジットでインターセプト用語を持っています。

これはパーセプトロンモデルには当てはまりません。したがって、係数の解釈は全く異なる。

ここでは、どのモデルが優れているかについては何も言いません。あなたの質問には、私たちがそれを判断できるようなパフォーマンスメトリックはありません。相互認証を行うか、少なくとも保留サンプルを使用する必要があるかを判断する。

+0

私はそれをここに掲示するのかCVに掲げるのかについてのフェンスにいました。あなたの答えをありがとう。もし私のコードが正しいなら、私は疑問に思います。 2.パーセプトロンからの係数を使用して決定境界線を生成できるかどうか(どのように知っていますか?) 3.私の「手動」アプローチにおける1列(偏り)の列が、傍受と等価でないかどうか(私はここでの答えは「theshold」値であると仮定します)。 – Toni

+0

@トーニ私はあなたのパーセプトロンプロセスの論理をチェックしていません。なぜあなたは手動でそれをやっているのですか?パッケージを使用している場合は、それが正しいことを確認することができ、決定境界線プロットを生成するのに役立ちます。 –

+0

私は、いくつかのおもちゃのデータで愚かな、初歩的な例をコーディングの演習を通過するとき、私ははるかに良い手順を理解するようになる気がします。あなたは新しい係数から決定境界をプロットする方法を知っていますか? – Toni

関連する問題