[ad_1]
公開されているポケモンの統計情報に対して階層的クラスタリングを実行します。 各
ポケモンは、データ セット内の行によって定義されます。 色々な方法があるので
ポケモンの強さを特徴付けるために、統計を短い機能に要約します
ベクター。 この課題では、ポケモンの品質を 6 つの数字で表す必要があります。
攻撃、Sp。 攻撃、速度、防御、SP。 防御力とHP
各ポケモンが 6 次元の特徴ベクトル (x1、…、x6) として表された後、
最初の n 個のポケモンを階層的凝集クラスタリング (HAC) でクラスタ化する必要があります。
あなたの関数は scipy.cluster.hierarchy.linkage() と同様に動作するはずです
メソッド=「完了」。
プログラム概要
CSV 形式のデータは、ファイル Pokemon.csv にあります。 注意、スターターはありません
この割り当てのコード。 行き詰まったら過去のスターターコードを参照
課題。 この割り当てのために、いくつかの Python 関数を作成する必要があります。 がここにあります
参照用にそれぞれの概要を説明します。
1. load_data(filepath) — CSV ファイルへのパスを含む文字列を受け取り、
辞書のリストとしてのデータポイント。 セクション 0.1
2. calc_features(row) — 前の関数からロードされたデータから 1 行の dict を取得します。
関数は、そのポケモンに対応する特徴ベクトルを次のように計算します。
上で指定され、それを形状 (6,) の numpy 配列として返します。 これのdtype
配列は int64 である必要があります。 セクション 0.2
3. hac(features) — 完全なリンケージ階層的凝集クラスタリングを実行します
(x1, . . , x6) 特徴表現を持つポケモンで、numpy を返します
クラスタリングを表す配列。 セクション 0.3
4. imshow_hac(Z, names) — 上の階層的凝集クラスタリングを視覚化します
ポケモンの特徴表現。 セクション 0.4
1
必要に応じて他のヘルパー関数を実装することもできますが、これらは私たちが提供する関数です。
テスト中です。 特に、最終的な python ファイルは関数のスイートにすぎません。
関数の外で実行されるコードがあります。 コードをテストするには、「メイン」が必要になる場合があります
まとめて入れる方法。 実行中のテストコードを削除してください
関数の外に置くか、 if __name__==”__main__”: でラップします。 これについては、
セクション 0.5。
プログラムの詳細
0.1 load_data(ファイルパス)
まとめ。 [20pts]
• 入力: 文字列、読み取るファイルへのパス。
• 出力: リスト。各要素は、読み取ったファイルの 1 行を表す dict です。
詳細。
1. 引数 filepath で指定されたファイルを読み込みます。 からの DictReader に注意してください
Python の csv モジュールは便利ですが、Python のバージョンによっては、
通常の辞書の代わりに OrderedDicts を返します。 dictに変換することを確認してください
この機能を使用する場合は適切です。
2. 辞書のリストを返します。ここで、データセットの各行は、
列ヘッダーをキーとして、行要素を値として。
ファイルが存在し、適切にフォーマットされた CSV であると想定できます。
0.2 calc_features(行)
まとめ。 [20pts]
• 入力: 1 匹のポケモンを表す dict。
• 出力: 形状 (6,) および dtype int64 の numpy 配列。 最初の要素は x1 など
6 番目の要素は x6 です。
詳細。 この関数は、1 匹のポケモンを表す dict を入力として受け取り、計算します。
特徴表現 (x1、…、x6)。 具体的には、
1. x1 = 攻撃
2. x2 = SP。 攻撃
3. x3 = スピード
4. x4 = 防御力
5. x5 = SP。 定義
6. x6 = HP
2
dict のこれらの統計は int ではない場合があることに注意してください。 関連する各統計をintに変換してください
各xiを計算するとき。 各 xi を順番に持つ numpy 配列を返します: x1, . . . 、×6。 の
この配列の形状は (6,) である必要があります。 この配列の dtype は int64 である必要があります。 覚えて、
この機能は、ロードしたすべてのポケモンではなく、一度に 1 つのポケモンに対してのみ機能します。
load_data を同時に。 正確なデータ構造を出力していることを確認してください
指定された適切なタイプを選択しないと、ポイントが大幅に減少する危険があります。
0.3hac(特徴)
まとめ。 [50pts]
• 入力: 形状 (6,) の numpy 配列のリスト。各配列は (x1, . . , x6) 機能です
セクション 0.2 で計算された表現。 特徴ベクトルの総数、
つまり、入力リストの長さは n です。 注、異なる n でコードをテストします。
セクション 0.5 に記載)。
• 出力: 形状 (n−1) × 4 の numpy 配列。任意の i に対して、Z[i, 0] とZ[i, 1] を表す
クラスタリングの i 回目の反復でマージされた 2 つのクラスターのインデックス
アルゴリズム。 次に、Z[i, 2] = d(Z[i, 0]、Z[i, 1]) は、間の完全なリンケージ距離です。
i 番目の反復でマージされた 2 つのクラスター (これは実際の値であり、
他の数量と同様に整数)。 最後に、Z[i, 3] 形成された新しいクラスターのサイズ
つまり、このクラスター内のポケモンの総数です。 注意、オリジナル
ポケモンは 0,…,n−1 でインデックス付けされたクラスターと見なされ、そのクラスターは
アルゴリズムの i 回目の繰り返し (i≥1) で構築されたクラスター インデックスは (n−1) + i です。
また、以下に指定されているタイブレーク ルールに従う必要があります。
詳細。 この機能については、SciPy の HAC の動作を模倣してください。
関数、リンケージ()。 実装でこの関数を使用しない場合がありますが、
結果を検証するために使用することを強くお勧めします! これは、コードをテストする方法です。
距離。 完全リンケージを使用して、階層的凝集クラスタリングを実行します
講義で詳述されているアルゴリズム。 標準のユークリッド距離関数を使用して
2 点間の距離を計算します。 独自の距離を実装できます
関数または numpy.linalg.norm() を使用します。 他の距離関数は機能しない場合があります
期待されるので、最初に CSL マシンで動作することを確認してください! 減額は自己責任で
パッケージ距離関数を使用して得られる可能性のあるポイント。
概要。 hac() を実装するために従うことができる 1 つの可能なパスを次に示します。
1. 開始データ ポイントのそれぞれに 0 から n −1 までの番号を付けます。 これらは彼らのオリジナルです
クラスター数。
3
2. (n −1) × 4 の配列またはリストを作成します。 この配列/リストを行ごとに繰り返します。 ために
各行、
(a) マージする 2 つのクラスターを決定し、それらの数を入れます。
行の 1 番目と 2 番目の要素 Z[i, 0] とZ[i, 1]. 最初の要素
記載されている、Z[i, 0] 2 つのクラスタ インデックスのうち、小さい方のインデックスを指定する必要があります。
(b) 2 つのクラスター間の完全結合距離は、3 番目のクラスターに入ります。
行の要素、Z[i, 2]
(c) クラスター内のポケモンの総数は、4 番目の要素 Z に入ります。[i, 3]
複数のポケモンを含むクラスターをマージすると、そのインデックス (最初または
行の 2 番目の要素) は、n + クラスターがあった行のインデックスによって与えられます。
作成した。
3. データ構造を返す前に、NumPy 配列でない場合は変換します。
すでに。
n が大きい場合にこのメソッドを効率的に実行するには、距離行列を維持する必要があります
ポイント間の距離を再計算したり、
クラスター。 800匹のポケモンすべてで効率的にhacを実行できるはずです。 を作成するには
以下を活用する距離行列:
d 次元空間に n 個のベクトル x1、x2、…、xn のセットがあるとします。 広場
2 つのベクトル xi と xj の間の距離は、次のように表すことができます。
𝑥𝑖−𝑥𝑗||||2= 𝑥𝑖||||2+𝑥𝑗||||2−2(𝑥𝑖•𝑥𝑗)
計算を簡単にするために、次のように定義されるグラミアン行列 G を使用できます。
ベクトル xi と xj のすべてのペアのドット積をエントリとする行列. 対角線
G の要素はベクトル g を形成します。これは、長さの 2 乗を表します。
ベクトル。 これらの項を組み合わせることで、平方距離行列 D² を次のように書くことができます。
1 のベクトルと、ベクトル g からグラミアンの 2 倍を引いたものの転置の和
行列 G. つまり、D² は、ベクトル g と
1 のベクトルの転置、およびグラミアン行列 G の 2 倍の減算。
D² の平方根を取るために必要な距離行列。この手順を忘れないでください。
𝐷2=𝑥1𝑖||||2
2
1||⎛
⎝
⎞
⎠
+𝑥2𝑖||||2
2
1||⎛
⎝
⎞
⎠
−2*𝑋1@𝑋2.𝑇
私たちの問題では、機能入力をnumpyに変換することから始める必要があります
形状 (n,6) の配列を X と呼びましょう。次の 3 つのコンポーネントがあります。
comp1 = , comp2 = , comp3 =𝑥1𝑖||||2
2
1||⎛
⎝
⎞
⎠
𝑥2𝑖||||2
2
1||⎛
⎝
⎞
⎠
−2*𝑋1@𝑋2.𝑇
4
Comp1 と comp2 は、X² の合計を取ることによって作成されます。 Comp1 には形状が必要です
(n,1) と comp2 は (n,) の形をしている必要があります。 Comp3 には、元の X が X1 および X2 として含まれているだけです。
たとえば、distance_matrix という NumPy 配列がある場合、
distance_matrix[3,4] インデックス 3 のポケモン間のユークリッド距離に等しい
機能入力の4。 出力を比較できます
scipy.spatial.distance_matrix、これにはユークリッド距離を使用していることに注意してください
割り当て。
タイブレーク。 マージする次の 2 つのクラスターを選択するときは、
最小完全連結距離。 複数のペアが同じ場合
距離があるため、それらの間で選択するための追加の基準が必要です。 私たちはこれを
インデックスに関するタイブレーク ルールは次のとおりです。 (i1, j1), . . . ,(ih, jh) はクラスタのペア
等しい距離のインデックス、つまり d(i1, j1) = · · · = d(ih, jh) とし、すべての t に対して it < jt と仮定します (したがって
各ペアはソートされます)。 最小の最初のインデックス i を持つペアを選ぶことでタイブレークします。 もしも
最初のインデックス i を持つペアが複数あるため、それらをさらに区別する必要があります。
これらのペアが (i, t1),(i, t2), . . . 等々。 これらのペアをタイブレークするには、
最小の 2 番目のインデックスを持つペア、つまり、これらのペアの中で最小の t 値。 なれ
このタイブレーク戦略では、linkage() と同じ結果が得られない可能性があることに注意してください。
0.4 imshow_hac(Z、名前)
まとめ。 [10pts]
• 入力: hac からの numpy 配列 Z 出力、および対応する文字列名のリスト
サイズ n × 1 のポケモンの名前。
• 出力: なし。単純に plt.show() 階層クラスタリングを視覚化するグラフ。
ラベルを名前に設定して scipy モジュールでデンドログラムを使用する必要があります
葉の回転 = ??.
詳細。 あなたのプロットはおそらく x ラベルを切り取ります。 グラフが下のようになるには
デンドログラムの前にサブプロットを作成し、tight_layout() を呼び出す必要がある例
plt.show() の前の図。
5
ポケモンのさまざまなサイズのリストの成功した視覚化の例を次に示します。
N = 15 N = 10
0.5 テスト
コードをテストするには、main メソッドまたは jupyter で次の行を実行してみてください
n のさまざまな選択に関するノート:
features_and_names = [(calc_features(row), row[‘Name’]) load_data(‘Pokemon.csv’) の行[:n]]
z = ハック([row[0] features_and_names の行の場合])
名前 = [row[1] features_and_names の行の場合]
imshow_hac(Z,名前)
hac 関数については、最大 800 までの n の小さな値と大きな値の両方でテストします。
ポケモンセット。 imshow_hac の n <= 30 でテストします。 その後、比較することができます
リンケージ()が提供するものへのクラスタリング(set method = ‘complete’を覚えておいてください)、および
さまざまなクラスタリングの視覚化を見てください。
提出の詳細
• hw4_
• zip ファイル内には、hw4.py という名前のファイルが 1 つだけ存在する必要があります。
• すべてのコードは、関数内または if __name__==”__main__” の下に含める必要があります。
• 送信前にすべてのデバッグ出力を削除してください。
私が試したこと:
import numpy as np import pandas as pd from scipy.cluster.hierarchy import linkage, dendrogram import matplotlib.pyplot as plt import csv def load_data(filepath): """ This function takes in the path to a CSV file and returns a list of dictionaries, where each dictionary represents a row of the CSV file. """ data = [] with open(filepath) as f: reader = csv.DictReader(f) for row in reader: data.append(row) return data def calc_features(row): """ This function takes in a dictionary representing one Pokemon and returns a numpy array of shape (6,) and dtype int64 containing the six specified features. """ x1 = int(row['Attack']) x2 = int(row['Sp. Atk']) x3 = int(row['Speed']) x4 = int(row['Defense']) x5 = int(row['Sp. Def']) x6 = int(row['HP']) features = np.array([x1, x2, x3, x4, x5, x6], dtype=np.int64) return features def hac(features): """ This function takes in a list of numpy arrays of shape (6,), where each array is an (x1, . . . , x6) feature representation as computed in the calc_features method. It performs complete linkage hierarchical agglomerative clustering and returns a numpy array representing the clustering. """ Z = linkage(features, method='complete') return Z def imshow_hac(Z, names): """ This function takes in a numpy array representing the clustering returned by the hac method, and a list of names corresponding to the original data points. It visualizes the hierarchical agglomerative clustering on the Pokemon’s feature representation. """ plt.figure(figsize=(10, 5)) dendrogram(Z, labels=names) plt.show()
解決策 1
私たちは立ち往生している人々を喜んで助けますが、それは私たちがあなたのためにすべてをするためにここにいるという意味ではありません! 私たちがすべての作業を行うことはできません。あなたはこれに対して報酬を受け取っているか、またはそれはあなたの成績の一部であり、私たちがあなたのためにすべてを行うことはまったく公平ではありません.
だから私たちはあなたが仕事をする必要があり、あなたが行き詰まったときにあなたを助けます. それは、あなたが提出できる段階的な解決策を提供するという意味ではありません!
現在の状況と、プロセスの次のステップを説明することから始めます。 次に、その次のステップを機能させるために何を試みたか、またその際に何が起こったかを教えてください。
開始するのに問題がある場合は、これが役立つ場合があります。 問題を解決するためのコードの書き方、初心者向けガイド[^]
[ad_2]
コメント