python - 将数据点分成簇并取每个簇的平均值
问题描述
假设我在 2x4 矩阵中有一些数据(4 个数据点,2 个特征)
X = np.array([[4,3,5,6], = [x1 x2 x3 x4]
[7,4,6,5]])
一个“最近的”3x4 矩阵,表示离每个数据点 x 最近的簇 k。(3 个集群,4 个数据点)
C = [[1 0 1 0]
[0 0 0 1]
[0 1 0 0]]
我想找到一种使用 numpy 计算每个集群中数据点的平均值的有效方法。
我的想法是构建一个如下所示的矩阵:
idea = [[x1 0 x3 0 ]
[0 0 0 x4]
[0 x2 0 0 ]]
将各列中的元素相加,然后除以 中的各个元素np.sum(c,axis=1)
,因为平均值应该只考虑属于该集群的数据点(即不考虑零点)。
此示例的最终预期输出应该是一个 3x2 矩阵:
output = [(x1+x3)/2 = [ [4.5 6.5]
x4 [6 5 ]
x2 ] [3 4 ]]
- 我什至无法构建一个看起来像我的矩阵的
idea
矩阵。 - 我不知道这是否是解决此问题的最有效方法
我想避免使用任何 for 循环。
解决方案
这是您的策略的矢量化实现:
X = np.array([[4, 3, 5, 6],[7, 4, 6, 5]])
C = np.array([[1, 0, 1, 0], [0, 0, 0, 1], [0, 1, 0, 0]])
output = X @ C.T / np.sum(C, axis=1)
print(output)
# => [[4.5 6. 3. ]
# [[6.5 5. 4. ]]
由于您的点X
是列,我认为让输出的列成为集群的质量中心更自然。如果您愿意,可以转置结果。
推荐阅读
- amazon-web-services - 具有特定前缀的用于自动复制的 Amazon S3 标签?
- git - 如何解决 TeamCity GitVersion 无限循环错误?
- json.net - 不同的 Newtonsoft.Json.dll dotnet 发布与使用 Visual Studio 发布
- spring-boot - SpringBootTest , content() 功能已随 sprint-test 5.2.6
- ios - 更新 Xcode 后 pod 文件出现错误,如何解决?
- c++ - 类中的c ++ int被设置为值,似乎无处不在
- python - Python3 - Windows:pip 在安装请求时出错
- python - 如何解决 Python 3.6 itertools 错误?
- pandas - 大熊猫中日期时间的字符串反转
- javascript - 确定用户在使用 v-calender 时所处的月份