開発環境
- macOS Sierra - Apple (OS)
- Emacs (Text Editor)
- Python 3.6 (プログラミング言語)
行列プログラマー(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 コメント:
コメントを投稿