# -*- coding: utf-8 -*-
import collections
import math

# 学習率の初期値
eta0 = 0.1
# 学習率の調整値
eta = 0.9

# シグモイド関数
def sigmoid(z):
    return 1.0 / (1 + math.exp(-z))

def update(w, features, label, eta):
    # 特徴量の内積を計算
    z = sum([w[f] for f in features])
    predict = sigmoid(z)
    # 正解との誤差を計算
    g = predict - label
    # パラメータベクトルの更新
    for f in features:
        w[f] = w[f] - (eta * g)

def top_output(n, w):
    top = 1
    for x in w:
        print '{0}\t{1}'.format(top, x)
        top += 1
        if top > n:
            break
    print "----------"

def main():
    t = 0
    w = collections.defaultdict(float)
    fr = open('sentiment.tsv', 'r')
    for line in fr.readlines():
        features = line.strip('\n').split('\t')
        # ロジスティック回帰はラベルは0か1でしか扱えないので変換
        if features[0] > 0:
            label = 1
        else:
            label = 0
        update(w, features[1:], label, (eta0 * (eta**t)))
        t += 1

    # 下位TOPxx
    data = sorted(w.items(), key=lambda x:x[1])
    top_output(10, data)
    # 上位TOPxx
    data = sorted(w.items(), key=lambda x:x[1], reverse=True)
    top_output(10, data)

if __name__ == '__main__':
    main()
