繁体   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