簡體   English   中英

如何根據屬性數量動態創建字典?

[英]How to create a dictionary dynamically based on number of attributes?

我有一個帶有 6 個屬性和 1 個 class 的 CSV 文件,我使用 Pandas 讀取了該文件。

CsvFile = "/path/to/file.csv"
df = pd.read_csv(CsvFile)

我的 CSV 的前 5 行:

x,y,x1,y1,x2,y2,class
92,115,120,94,84,102,3
84,102,106,79,84,102,3
84,102,102,83,80,102,3
80,102,102,79,84,94,3
84,94,102,79,80,94,3

因為我有 6 個屬性,所以我想在 Python(6 個鍵,每個鍵 5 個值)中創建一個字典,其中包含 kmeans 的質心。

numberOfClusters = 5
centroids =
{
    i+1: [random.uniform(0.0, 255.0), random.uniform(0.0, 255.0),
          random.uniform(0.0, 255.0), random.uniform(0.0, 255.0),
          random.uniform(0.0, 255.0), random.uniform(0.0, 255.0)]
    for i in range(numberOfClusters)
}

問題 nr.1:如您所知,將random.uniform(0.0, 255.0)復制粘貼的次數與我想要獲得的隨機點一樣多,以匹配我的 CSV 文件中的屬性數量並不是很有效率。 知道如何在沒有復制粘貼的情況下做到這一點嗎?

以類似的方式,在下面的代碼中,我計算歐幾里得距離。

for i in centroids.keys():
    df['distance_from_{}'.format(i)] = (
        np.sqrt(
            (df['x'] - centroids[i][0]) ** 2
            + (df['y'] - centroids[i][1]) ** 2
            + (df['x.1'] - centroids[i][2]) ** 2
            + (df['y.1'] - centroids[i][3]) ** 2
            + (df['x.2'] - centroids[i][4]) ** 2
            + (df['y.2'] - centroids[i][5]) ** 2
        )
    )

問題 nr.2:如果我有更多屬性,我必須添加更多df['x'] - centroids[i][0]) ** 2 ,而如果我有更少,則刪除一個或多個。 我怎樣才能使這個過程自動化一點?

不使用 scikit 的 kmeans 的原因是我想計算每個集群的權重。

如果鍵數是您可以使用的問題

n=0
with open('filename.csv','r') as f:
    l=f.readline().strip()
    n=len(l.split(','))

其中 n 保存鍵的數量

第一個問題:將您的列表替換為

[random.uniform(0.0, 255.0) for x in range(6)]

第二個問題:

np.sqrt(np.sum(np.pow(df[df.columns[:5]] - centroid[i], 2)) should work.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM