質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

1128閲覧

データの並びを比較して正答率(スコア)を算出する方法

退会済みユーザー

退会済みユーザー

総合スコア0

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/02/10 13:54

あるデータを元に算出したA,Bの集団があります。そのデータをスコア順で並べた時、理想(正解)は以下の様になります。

A,A,A,A,B,B,B,B

Aのデータは左に寄ってBのデータは右に寄るのが理想です。

しかし、実際にこのA,Bを並べてみると

B,A,A,B,A,A,B,B

の様に並んだとします。この時、正解の並びから実際に並んだAとBのスコア(正答率)を出したい時、どの様に計算すればよいかわかりません。
イメージとしては、正解の並び通りに並ぶとA,B共に正答率100%、Aが右かBが左にズレるほどスコアが小さくなり正答率が落ちる様にしたいです。
使用している言語はPythonです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

バブルソートしてスワップした回数を数えるのはいかがでしょうか(大きいほど正答率は低い)。
数え方はHow to count number of swaps in a bubble sort?が参考になるかと。

Python

1# 「スワップ率」 2def swap_rate(l): 3 4 # 必要スワップ回数 5 def swap_count(l): 6 count = 0 7 for j in range(len(l)): 8 for i in range(1, len(l)-j): 9 if l[i-1] > l[i]: 10 count += 1 11 l[i-1], l[i] = l[i], l[i-1] 12 return count 13 14 # 最悪スワップ回数 15 def max_count(l): 16 from collections import Counter 17 c = Counter(l) 18 assert len(c.values()) == 2 # 2種類のみで構成されたリスト 19 20 l_len = len(l) 21 max_cnt = 1 22 for v in c.values(): 23 max_cnt *= l_len - v 24 25 # 検算 26 #l2 = sorted(l,reverse=True) 27 #assert swap_count(l2) == max_cnt 28 29 return max_cnt 30 31 swap_cnt = swap_count(l) 32 max_cnt = max_count(l) 33 return 1 - (swap_cnt/max_cnt) 34 35 36for s in ['AAAABBBB','BBBBAAAA','AAABABBB','BAAABBBA','BAABAABB']: 37 r = swap_rate(list(s)) 38 print(s,r) 39""" 40AAAABBBB 1.0 41BBBBAAAA 0.0 42AAABABBB 0.9375 43BAAABBBA 0.5625 44BAABAABB 0.625 45"""

投稿2019/02/10 14:06

編集2019/02/11 07:10
can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ド単純で恐縮ですが。

基礎を100%として、
一番左にB もしくは 一番右にA がある場合⇒それぞれ -21.875 %
左から2番目にB もしくは 右から2番目にA がある場合⇒それぞれ -15.625 %
左から3番目にB もしくは 右から3番目にA がある場合⇒それぞれ -9.375 %
左から4番目にB もしくは 右から4番目にA がある場合⇒それぞれ -3.125 %

値は4番目と5番目の間(言わば4.5番目)を中央(0)としてその距離で取り、
全て足すとマイナス100%になるようにしています。

can110さんの例を借ります。
'AAAABBBB' 100%
'BBBBAAAA' 0% (100-21.875-15.625-9.375-3.125-3.125-9.375-15.625-21.875)
'AAABABBB' 93.75% (100-3.125-3.125)
'BAAABBBA' 50% (100-21.875-3.125-9.375-15.625)
'BAABAABB' 62.5% (100-21.875-3.125-3.125-9.375)

投稿2019/02/11 07:55

torisan

総合スコア678

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Bの位置が右側にあるほど高い値…ということで,
簡単に,データ列内のBの位置のindexの総和とかを考えるとどうでしょう.
(indexが0から始まるとして)
最良の
A,A,A,A,B,B,B,B の場合,総和は 4+5+6+7 = 22
最悪の
B,B,B,B,A,A,A,A の場合,総和は 0+1+2+3 = 6


6~22の範囲を適当に正規化する

投稿2019/02/12 04:40

fana

総合スコア11654

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

素直に正解率の計算でいいと思います。一致箇所の数を長さで割るだけです。

投稿2019/02/10 14:08

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kts_h

2019/02/10 15:09

一致した箇所の箇所の数が同じでも、Aが右にずれるほどスコアが下がるので、それをどう考えるかが問題ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問