2017年4月24日月曜日

開発環境

行列プログラマー(Philip N. Klein (著)、 松田 晃一 (翻訳)、 弓林 司 (翻訳)、 脇本 佑紀 (翻訳)、 中田 洋 (翻訳)、 齋藤 大吾 (翻訳)、オライリージャパン)の2章(ベクトル)、2.12(ラボ: ドット積を用いた投票記録の比較)、2.12.5(平均的でない民主党員)、課題 2.12.7、2.12.8 を取り組んでみる。

課題 2.12.7、2.12.8

2.12.8の説明。2.12.7の考え方はは分配則の右辺、2.12.8の考え方は分配則の左辺だから、同じ結果が得られる。

コード(Emacs)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import random


def create_voting_dict(strlist):
    return {s.split()[0]: [int(n) for n in s.split()[3:]] for s in strlist}


def policy_compare(sen_a, sen_b,  voting_dict):
    return sum([x * y for x, y in zip(voting_dict[sen_a], voting_dict[sen_b])])


def most_similar(sen, voting_dict):
    l = voting_dict[sen]
    names = list(voting_dict.keys())
    names.remove(sen)
    result = names[0]
    a = policy_compare(sen, result, voting_dict)
    for name in names[1:]:
        t = policy_compare(sen, name, voting_dict)
        if t > a:
            a = t
            result = name
    return result


def least_similar(sen, voting_dict):
    l = voting_dict[sen]
    names = list(voting_dict.keys())
    names.remove(sen)
    result = names[0]
    a = policy_compare(sen, result, voting_dict)
    for name in names[1:]:
        t = policy_compare(sen, name, voting_dict)
        if t < a:
            a = t
            result = name
    return result


def find_average_similarity(sen, sen_set, voting_dict):
    return sum([policy_compare(sen, s, voting_dict) for s in sen_set]) / len(sen_set)


def find_average_record(sen_set, voting_dict):
    votings = [voting_dict[sen] for sen in sen_set]
    return list(map(lambda x: sum(x) / len(sen_set), zip(*votings)))

filename = 'voting_record_dump109.txt'

with open(filename) as f:
    mylist = list(f)

if __name__ == '__main__':
    voting_dict = create_voting_dict(mylist)
    names = list(voting_dict.keys())

    print('2.12.7')
    r_names = {s.split()[0] for s in mylist if s.split()[1] == 'R'}
    sen = names[0]
    average = find_average_similarity(sen, r_names, voting_dict)
    for name in names[1:]:
        t = find_average_similarity(name, r_names, voting_dict)
        if t > average:
            average = t
            sen = name
    print(average)
    print(sen)

    print('2.12.8')
    average_democrat_record = find_average_record(r_names, voting_dict)
    sen = names[0]
    average = sum([x * y for x,
                   y in zip(average_democrat_record, voting_dict[sen])])
    for name in names[1:]:
        t = sum([x * y for x,
                 y in zip(average_democrat_record, voting_dict[name])])
        if t > average:
            average = t
            sen = name
    print(sen)

入出力結果(Terminal, IPython)

$ ./sample12_7.py
2.12.7
39.6
Allen
2.12.8
Allen
$

0 コメント:

コメントを投稿