高次元データの最近傍?


163

私は数日前に、与えられたベクトルの最近傍を見つける方法について質問しました。私のベクトルは21次元になりました。先に進む前に、私は機械学習や数学のドメインからではないため、いくつかの基本的な質問を自問し始めています。

  • ユークリッド距離は、そもそも最近傍を見つけるための良い測定基準ですか?そうでない場合、私の選択肢は何ですか?
  • さらに、k近傍を決定するための適切なしきい値をどのように決定するのでしょうか。この値を把握するために実行できる分析はありますか?
  • 以前は、kd-Treesを使用するよう提案されましたが、Wikipediaのページでは、高次元の場合、kd-Treeはブルートフォース検索とほぼ同等であると明確に述べています。その場合、100万点のデータセットで最近傍を効率的に見つけるための最良の方法は何ですか?

誰かが上記の質問のいくつか(またはすべて)を明確にしていただけますか?


metaoptimize.comで質問してみてください
pajton

4
「高次元」は、一部の人と一部のデータでは20、他の人では50または100または1000です。可能であれば、番号を付けてください。たとえば、「xxを使用して、dim 21、1000000データポイントを実行しました」のようにします。
denis

kD-Treeは、一度に1つの次元に沿ってデータを2つに分割します。20の次元と1Mのデータポイントしかない場合、ツリーのレベルは約1になります。ここで、レベルはすべての軸で分割されることを意味します。実際の深さはないので、ツリーのブランチを無視するメリットはありません。バイナリツリーのように実装されている場合でも、それをバイナリツリーとして考えるのではなく、クワッドツリー、オクトツリーなどに似ていると便利です。
phkahler、2011年

@denis、ヒッグスデータセットの「dim 21、1000000 data points」でしたか?
nikk

1
Higgsデータセットをダウンロードするためのリンクは次のとおりです。28の属性を持つ1,100万回の観測。最後の列はラベルです。信号の場合は1、ノイズの場合は0です。archive.ics.uci.edu/ml/datasets/HIGGS
nikk

回答:


179

私は現在、音楽情報の検索について、分類、最近傍探索などの問題を研究しています。

近似最近傍ANN)アルゴリズムに興味があるかもしれません。アイデアは、アルゴリズムが十分に近い近傍(おそらく最も近い近傍ではない)を返すようにすることです。そうすることで、複雑さが軽減されます。kd-treeについて言及しました。それは一例です。しかし、あなたが言ったように、kd-treeは高次元ではうまく機能しません。実際、現在のすべてのインデックス付け手法(空間分割に基づく)は、十分に高い次元の線形検索に低下します[1] [2] [3]。

最近提案されたANNアルゴリズムの中で、おそらく最も一般的なのは、局所性に敏感なハッシュLSH)です。ただし、従来のハッシュとは異なり、場所に依存するハッシュでは、近くのポイントが同じビンに配置されます。

LSHにはいくつかの大きな利点があります。まず、それは簡単です。データベース内のすべてのポイントのハッシュを計算し、それらからハッシュテーブルを作成するだけです。クエリするには、クエリポイントのハッシュを計算し、同じビン内のすべてのポイントをハッシュテーブルから取得します。

第二に、そのパフォーマンスをサポートする厳密な理論があります。クエリ時間があることを示すことができるサブリニア速く線形検索よりも、すなわち、データベースのサイズに。どれだけ速くなるかは、許容できる近似の程度に依存します。

最後に、LSHはのどのLpノルムとも互換性があります0 < p <= 2。したがって、最初の質問に答えるには、ユークリッド距離メトリックでLSHを使用するか、マンハッタン(L1)距離メトリックでLSHを使用できます。ハミング距離とコサイン類似性のバリアントもあります。

まともな概要は、2008年にIEEE Signal Processing MagazineのMalcolm SlaneyとMichael Caseyによって書かれました[4]。

LSHは一見どこにでも適用されています。試してみてください。


[1] Datar、Indyk、Immorlica、Mirrokni、「p-stable分布に基づく局所性に敏感なハッシュ方式」、2004年。

[2] Weber、Schek、Blott、「高次元空間における類似性検索方法の定量分析とパフォーマンス研究」、1998年。

[3] Gionis、Indyk、Motwani、「ハッシュによる高次元の類似性検索」、1999年。

[4] Slaney、Casey、「最近傍を見つけるための局所性に敏感なハッシュ」、2008年。


1
@Steve:返信ありがとうございます。LSHの実装に関する提案はありますか?私が見たのはMITからのものだけだった。他のパッケージが浮かんでいますか?
Legend

1
それ以外に、いや、私は他の人を知りません。私は特定の目的のために自分でPythonを作成することになりました。基本的に、各ハッシュテーブルはPython辞書として実装されます。dここで、d[k]はキーを持つ1つのビンkです。d[k]ハッシュがであるすべてのポイントのラベルが含まれますk。次に、各ポイントのハッシュを計算するだけです。式を参照してください。(1)[4]、またはセクション3 [1]。
Steve Tjoa

@Steve:ご協力ありがとうございます。今から実装を始めます。たまたまこの方法論が大規模なデータセットに対してどのように機能するかについて何か考えがありますか?
レジェンド

1
LSHをサポートする別のリファレンス:Comparing Nearest Neighbor Algorithms in High-Dimensional Space、Hendra Gunadi、2011。cs.anu.edu.au/ student / projects / 11S2 / Reports /
Oliver Coleman

1
@SteveTjoa:キーワードと埋め込み式を視覚的に把握するのは難しいと感じました。LSHについてはすでに1つのハイライトがありましたが、補足しました。最善の意図だけで。ただし、元に戻すこともできます。結局それはあなたの答えです。:)
Regexident 2013年

81

I.距離メトリック

まず、データセット内の特徴(列)の数は、kNNで使用する距離メトリックを選択する際の要因にはなりません。正確にこの質問に向けられた出版された研究はかなり多く、比較のための通常の基準は次のとおりです。

  • データの基礎となる統計的分布;

  • データを構成する特徴間の関係(それらは独立しています-つまり、共分散行列はどのように見えるか); そして

  • データの取得元の座標空間。

データのサンプリング元の分布について事前の知識がない場合、少なくとも1つの(十分に文書化された完全な)調査により、ユークリッド距離が最良の選択であると結論付けられます。

メガスケールのWebレコメンデーションエンジンおよび現在の学術研究で使用されているYEuclideanメトリック。ユークリッド距離は、直感的な意味と計算スケールで計算されます。つまり、ユークリッド距離は、2点が2次元空間にあるか22次元空間にあるかにかかわらず、同じ方法で計算されます。

私にとって数回失敗しただけです。それらのケースのそれぞれで、ユークリッド距離は失敗しました。たとえば、パスの長さ(距離)が加算されないため、通常はこれを認識します。たとえば、距離空間がチェス盤の場合、マンハッタン距離はユークリッド距離よりも優れています。距離空間が地球で距離がトランスの場合も同様です。 -大陸便、極座標系に適した距離メトリックは良い考えです(たとえば、ロンドンからウィーンまでは2.5時間、ウィーンからサンクトペテルブルグまでは同じ方向に多かれ少なかれ3時間ですが、ロンドンからセントまで。Petersburgは5.5時間ではなく、3時間強です。)

ただし、データが非デカルト座標系に属している場合を除いて、距離メトリックの選択は通常重要ではありません。(CS学生からのこのブログ投稿を参照し、kNN分類器への影響を調べることによっていくつかの距離メトリックを比較します-カイ二乗は最良の結果を与えますが、違いは大きくありません;より包括的な研究は学術論文の比較研究最近傍の距離関数-マハラノビス(本質的には次元共分散を説明するために正規化されたユークリッド)がこの研究で最高でした。

重要な条件の1つ:距離メトリックの計算を意味のあるものにするには、再スケーリングする必要がありますデータ-これを行わずにkNNモデルを構築して正確な予測を生成することはほとんどありません。たとえば、運動パフォーマンスを予測するためのkNNモデルを構築していて、期待変数が身長(cm)、体重(kg)、体脂肪(%)、および安静時の脈拍(1分あたりの拍数)である場合、一般的なデータポイントは次のようになります:[180.4、66.1、11.3、71]。明らかに、距離の計算は高さによって支配されますが、体脂肪率による寄与はほとんど無視できます。別の言い方をすれば、代わりにデータが異なる方法で報告され、体重がキログラムではなくグラムであった場合、元の値86.1は86,100になり、結果に大きな影響を与えます。欲しくない。

X_new = (X_old - mu) / sigma


II。データ構造

kdツリー構造のパフォーマンスが心配な場合、ボロノイテッセレーションは概念的には単純なコンテナーですが、パフォーマンスが大幅に向上し、kdツリーよりも適切にスケーリングされます。

データ

これは、kNNトレーニングデータを永続化するための最も一般的な方法ではありませんが、この目的でのVTの適用と、その結果としてのパフォーマンスの利点は十分に文書化されています(たとえば、このMicrosoft Researchレポートを参照)。これの実際的な重要性は、「主流」の言語を使用している場合(例:TIOBEインデックス)、VTを実行するためのライブラリーを見つける必要があることです。私はPythonとRで、各言語に複数のオプションがあることを知っています(たとえば、CRANで利用可能なR のボロノイパッケージ)

kNNにVTを使用すると、次のように機能します。

データからw個の点をランダムに選択します。これらはボロノイ中心です。ボロノイセルは、各中心に最も近いすべての隣接ポイントをカプセル化します。各ボロノイセンターに異なる色を割り当て、特定のセンターに割り当てられた各ポイントにその色が塗られるように想像してみてください。十分な密度がある限り、これを行うと、各ボロノイ中心の境界が(2つの色を分ける境界として)うまく表示されます。

ボロノイセンターの選択方法 2つの直交するガイドラインを使用します。wポイントをランダムに選択した後、トレーニングデータのVTを計算します。次に、各ボロノイセンターに割り当てられたデータポイントの数を確認します。これらの値はほぼ同じである必要があります(データ空間全体で均一なポイント密度が与えられている場合)。2次元では、これにより同じサイズのタイルを持つVTが発生します。これが最初のルールで、2番目のルールです。反復によるwを選択します-変数パラメーターとしてwを使用してkNNアルゴリズムを実行し、パフォーマンス(VTをクエリして予測を返すのに必要な時間)を測定します。

したがって、100万のデータポイントがあると想像してください.....ポイントが通常の2Dデータ構造またはkdツリーで永続化されている場合、平均でそれぞれについて数百万の距離計算を実行します。応答変数を予測する新しいデータポイント。もちろん、これらの計算は単一のデータセットに対して実行されます。V / Tを使用すると、2つの異なるデータ母集団に対して、次の2つのステップで最近傍探索が実行されます。最初にボロノイ中心に対して、次に最近傍が見つかると、その中心は、実際の最近傍を見つけるために検索されます(連続距離計算により)。これらの2つのルックアップを組み合わせると、1つの総当たりルックアップよりもはるかに高速になります。これは簡単に確認できます。1Mのデータポイントの場合、250のボロノイセンターを選択してデータスペースをテッセレーションするとします。平均して、各ボロノイセルには4,000のデータポイントがあります。したがって、平均500,000の距離計算(ブルートフォース)を実行する代わりに、はるかに少ない、平均125 + 2,000を実行します。

III。結果の計算(予測応答変数)

kNNトレーニングデータのセットから予測値を計算するには、2つのステップがあります。1つ目は、n、つまりこの計算に使用する最近傍の数を特定することです。2つ目は、予測値への寄与重みを付ける方法です。

最初のコンポーネントのW / R / Tを使用すると、最適化問題(最小二乗最適化とよく似ている)を解くことにより、nの最適値を決定できます。それが理論です。実際には、ほとんどの人はn = 3を使用します。どのような場合でも、n = 1、n = 2、n = 3などの一連のテストインスタンスに対して(予測値を計算するために)kNNアルゴリズムを実行し、nの関数としてエラーをプロットするのは簡単です。nのもっともらしい値を開始したいだけの場合も、n = 3を使用します。

2番目のコンポーネントは、各近傍の寄与をどのように重み付けするかです(n> 1と仮定)。

最も単純な重み付け手法は、各隣接要素に1 /(dist * K)の重み付け係数を乗算するか、その隣接要素からテストインスタンスまでの距離の逆数に、経験的に得られた定数Kを乗算することです。Iこの手法のファンではありません。これは、最も近いネイバーに重みを付けすぎることが多いためです(同時に、より遠いものに比べて重みが小さくなります)。これの重要性は、特定の予測がほぼ完全に単一の近傍に依存している可能性があることであり、これにより、ノイズに対するアルゴリズムの感度が向上します。

この制限を実質的に回避する、より良い重み付け関数は、ガウス関数です。これは、Pythonでは次のようになります。

def weight_gauss(dist, sig=2.0) :
    return math.e**(-dist**2/(2*sig**2))

kNNコードを使用して予測値を計算するには、応答変数を予測するデータポイント( 'テストインスタンス')に最も近いn個の近傍を識別し、n個の近傍のそれぞれについて一度、weight_gauss関数を呼び出して、この関数は、各近隣の重みをテストポイントに返します。この関数は、各近隣の重みを返します。これは、加重平均計算でその近隣の係数として使用されます。


2
正解です。私の経験と比較して包括的かつ正確です。
Ted Dunning、2012年

いい答え、+ 1、新しい最近の答えをここに追加しましたが、よろしいですか?
gsamaras

1
「それで、100万のデータポイントがあると想像してください。.....ポイントが通常の2Dデータ構造またはkdツリーに永続化されている場合、応答が新しいデータポイントごとに平均で数百万の距離計算を実行します。予測したい変数。」同意しない。KDツリーはO(sqrt(n))2Dで検索が複雑であることを証明できます。
アントワーヌ

16

あなたが直面しているものは、次元の呪いとして知られています。PCAやICAなどのアルゴリズムを実行して21次元すべてが本当に必要であることを確認し、21未満でほぼ同じ結果品質で使用できる線形変換を見つけることが役立つ場合があります。

更新: 私はRangayyanの 『Biomedical Signal Processing』という本でそれらに遭遇しました(正しく覚えているといいのですが)。ICAは簡単な手法ではありませんが、フィンランドの研究者によって開発されたものであり、そのためのMatlabコードはダウンロードして公開されていると思います。PCAはより広く使用されている手法であり、Rまたは他のソフトウェア実装を見つけることができるはずです。PCAは、線形方程式を繰り返し解くことによって実行されます。私はそれをどのようにして覚えたかについてはあまりにも昔に行った。=)

アイデアは、信号を独立した固有ベクトル(実際には離散固有関数)とそれらの固有値(ケースでは21)に分割することです。各固有値は、各固有関数が各測定に提供する寄与量を示します。固有値が小さい場合、対応する固有関数をまったく使用せずに信号を非常に厳密に表すことができます。これにより、次元を取り除くことができます。


+1ありがとうございます。これは非常に興味深い提案であり、完全に理にかなっています。最後のリクエストとして、これをインタラクティブに行う方法を説明する(PythonまたはRまたはその他の言語のいずれかによる)実践的なチュートリアルに精通していますか(つまり、プロセス全体を段階的に説明しています)。私は昨日からいくつかの文書を読みましたが、それらのほとんどは私の理解から離れているようです。助言がありますか?
レジェンド

4
Nitpicking:ICAは次元削減アルゴリズムではありません。コンポーネントのスコアリング方法がわからないため、そのように使用しないでください。
Gael Varoquaux、2011年

12

上位の回答は良いですが古いので、2016年の回答を追加したいと思います


述べたように、高次元の空間では、次元の呪いが隅々に潜んでいるため、人気のあるkdツリーなどの従来のアプローチは、総当たりのアプローチと同じくらい遅くなります。その結果、近似最近傍検索(ANNS)に関心を向けます。これにより、ある程度の精度が優先され、プロセスが高速化されます。正確なNNの適切な近似が得られます。


価値のあるホットなトピック:

  1. RazenshteynのようなLSHの現代的なアプローチ。
  2. RKDフォレスト:ランダム化されたkdツリー(RKD)のフォレスト。これは、FLANNで説明されているか、私が所属していた最近のアプローチでは、kd-GeRaFです。
  3. ここで説明するように、ローカルに最適化された製品の量子化を表すLOPQ。これは、新しいBabenko + Lemptitskyのアプローチと非常によく似ています。

私の関連する回答を確認することもできます:

  1. 高次元のポイントの2つのセット:もう一方のセットで最近傍点を見つける
  2. 異なるデータ構造での最近傍クエリの実行時間の比較
  3. PCL kdツリーの実装が非常に遅い

8

質問に1つずつ回答するには:

  • いいえ、ユークリッド距離は高次元空間では悪い指標です。基本的に高次元では、データポイントには互いに大きな違いがあります。これにより、特定のデータポイントとその最近傍および最近傍の間の距離の相対的な差が減少します。
  • 多くの論文/研究が高次元のデータに含まれていますが、ほとんどのものは多くの数学的な高度化を必要とします。
  • KDツリーは高次元データには適していません...絶対に避けてください

ここに、正しい方向に進むための素晴らしいペーパーがあります。「いつ最も近い隣人に意味がありますか?」ベイヤーらによって。

20K以上のサイズのテキストデータを操作します。テキストに関するアドバイスが必要な場合は、私がお手伝いできるかもしれません。


1
+1その紙を印刷して今読んでいます。それまでの間、最近傍を特定する方法について他に提案はありますか?距離メトリックと近傍自体の定義の両方に欠陥がある場合、一般的に、特徴ベクトルに基づいて近似マッチングを実行する必要がある高次元の問題をどのように解決しますか?助言がありますか?
レジェンド

1
テキストの場合、コサイン類似度をよく使用します。私は自分でテキスト分類に取り組んでおり、高次元の場合、線形カーネルを使用したSVMが最も効果的であるようです。
BiGYaN

@BiGYaNスペースをどのように定義しましたか。単語ベクトルまたは埋め込みベクトルのbageに基づいているのですか?
user3487667

@ user3487667、スペースは、問題をどのように定式化するかによって異なります。単純な単語モデルについて話していました。
BiGYaN 2016年

5

コサイン類似度は、高次元ベクトルを比較する一般的な方法です。これは距離ではなく類似度であるため、最小化するのではなく最大化する必要があることに注意してください。ドメイン固有の方法を使用してデータを比較することもできます。たとえば、データがDNA配列である場合、変異の確率などを考慮した配列類似性を使用できます。

使用する最近傍の数は、データの種類、ノイズの量などによって異なります。一般的な規則はありません。特定のデータと問題に最適なものを見つけるには、範囲内のすべての値を試す必要があります。 。人々は直感的に、データが多いほど、必要な隣人が少なくなると理解しています。考えられるすべてのデータがある架空の状況では、分類する単一の最近傍を探すだけで済みます。

k Nearest Neighborメソッドは、計算コストが高いことが知られています。これは、サポートベクターマシンのような他のアルゴリズムを利用する主な理由の1つです。


これは面白い。私の場合にSVMをどのように利用できるかについて詳しく説明していただけますか?k最近傍は監視されていないようで、SVMは監視されていると思いました。私が間違っていたら訂正してください。
レジェンド

2
トレーニングデータには正しいクラスの注釈が付けられているため、両方の方法が監視されます。特徴ベクトルしかなく、それらが属するクラスがわからない場合、kNNまたはSVMを使用できません。教師なし学習方法は、通常、クラスタリングアルゴリズムと呼ばれます。彼らは類似したデータのグループを識別できますが、グループが何を意味するのかを教えてくれません。
コリン

説明していただきありがとうございます。あなたが正しいです。それは確かに教師付き手法です。私は、カテゴリと呼ばれるものが実際にクラスであることも理解していませんでした:)
Legend

4

kd-treesは確かに、高次元データではあまりうまく機能しません。最も近いエッジ(1次元の偏差)は、ほとんどの場合、既知の最近傍への全次元の偏差よりも小さいため、枝刈りステップはもはやあまり役に立ちません。

しかし、さらに、kdツリーは、私が知っているすべてのLpノルムでのみうまく機能し、距離ベースのアルゴリズムを次元数の増加とともに低下させる距離集中効果があります。

詳細については、次元の呪いとそのさまざまなバリエーション(複数の側面があります!)を参照してください。

ユークリッド最近傍を盲目的に近似するための多くの用途があるとは確信していません。たとえば、LSHやランダム投影を使用します。そもそもはるかに微調整された距離関数を使用する必要があるかもしれません!


1段落目と2段落目の参照はありますか?
チャック、

いいえ、しかし、それらは通常の「次元の呪い」のインスタンス化(cf、survey)からかなり明白であり、ユークリッド以外のものをサポートするkdツリーを見つけようとします...他の距離をサポートすることは可能ですが、一般的ではありません(ELKIすべてのミンコフスキー距離+二乗ユークリッドを許可しますが、ほとんどはユークリッドしかありません)。kdツリーが剪定にのみ1つの次元を使用することを考慮し、これをすべての次元を含む距離と比較してください。さらに、分割は各次元で分割できません。
Erich Schubert

3

多くは、なぜあなたが最も近い隣人を知りたいと思うかに依存します。データセットのモードを見つけることが本当に必要な場合は、平均シフトアルゴリズムhttp://en.wikipedia.org/wiki/Mean-shiftを調べることができます。


2
私が知る限り、平均シフトは高次元データのクラスタリングには適していません。K-Meansはより良い選択かもしれません。
fdermishin

3

ブール機能のtf-idfの余弦は、ほとんどの問題でうまく機能すると思います。それは、Luceneのような多くの検索エンジンでその実績のあるヒューリスティックが使用されているためです。私の経験におけるユークリッド距離は、テキストのようなデータに対して悪い結果を示しています。異なる重みとk-examplesの選択は、トレーニングデータとブルートフォースパラメーターの選択で行うことができます。


3

iDistanceは、高次元データでの正確なknn検索におそらく最適です。ボロノイの近似テサレーションと見なすことができます。


3

私は同じ問題を経験しましたが、次のことが言えます。

  1. ユークリッド距離は良い距離測定基準ですが、マンハッタン距離よりも計算コストが高く、結果がわずかに悪い場合があるため、後者を選択します。

  2. kの値は経験的に見つけることができます。さまざまな値を試して、結果のROC曲線またはその他の精度/再現率を確認して、許容できる値を見つけることができます。

  3. ユークリッド距離とマンハッタン距離はどちらも三角形の不等式を尊重するため、メトリックツリーで使用できます。実際、データが10を超えるディメンションを持っている場合、KDツリーのパフォーマンスは大幅に低下します(私はその問題を自分で経験しました)。私はVP-treesがより良いオプションであることを発見しました。


3

KD Treesは21の次元で正常に機能します。早期に終了した場合、たとえばすべてのポイントの5%を見てください。 FLANNは、128 次元の SIFTベクトルと一致させるためにこれ(およびその他の高速化)を行います。(残念ながらFLANNはユークリッド計量し、迅速かつ固体 scipy.spatial.cKDTreeは LPのみメトリックを行い、これらは、またはのために十分であってもなくてもよい、あなたのデータ。)ここではもちろんの速度精度のトレードオフです。

(Ndata、Nquery、データ分布を説明できれば、人々が同様のデータを試すのに役立つかもしれません。)

4月26日、実行可能性の非常に大まかなアイデアを与えるために、私の古いmac ppcでカットオフを使用するcKDTreeの実行時間を追加しました。

kdstats.py p=2 dim=21 N=1000000 nask=1000 nnear=2 cutoff=1000 eps=0 leafsize=10 clustype=uniformp
14 sec to build KDtree of 1000000 points
kdtree: 1000 queries looked at av 0.1 % of the 1000000 points, 0.31 % of 188315 boxes; better 0.0042 0.014 0.1 %
3.5 sec to query 1000 points
distances to 2 nearest: av 0.131  max 0.253

kdstats.py p=2 dim=21 N=1000000 nask=1000 nnear=2 cutoff=5000 eps=0 leafsize=10 clustype=uniformp
14 sec to build KDtree of 1000000 points
kdtree: 1000 queries looked at av 0.48 % of the 1000000 points, 1.1 % of 188315 boxes; better 0.0071 0.026 0.5 %
15 sec to query 1000 points
distances to 2 nearest: av 0.131  max 0.245

2

あなたはz次数曲線を試すことができます。3次元の場合は簡単です。


0

ユークリッド距離は、そもそも最近傍を見つけるための良い測定基準ですか?そうでない場合、私の選択肢は何ですか?

今日、かなり一般的なアプローチであるソフト部分空間クラスタリングをお勧めします。この方法では、最も重要な次元を見つけるために特徴の重みが計算されます。たとえば、ユークリッド距離を使用するときにこれらの重みを使用できます。一般的な問題については、次元の呪いを参照してください。また、この記事は何らかの方法であなたを啓発することができます:

数値とカテゴリの混合データセットの部分空間クラスタリングのためのk平均法クラスタリングアルゴリズム

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.