【问题标题】:K-means clustering, changing colour of data to depending on closest centroidK-means 聚类,根据最近的质心改变数据的颜色
【发布时间】:2018-10-12 18:51:13
【问题描述】:

我下面的 python 代码对一组数据执行非常简单的 K-means 聚类。存在的问题是我需要根据最接近的质心来改变数据点的颜色。任何人都可以帮我解决我应该做的事情吗?

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt


def calc_dist_euclidean(vec_1, vec_2):

    distances = np.sqrt(((vec_1 - vec_2[:, np.newaxis]) ** 2).sum(axis=2))
    dist_euclidean = np.argmin(distances, axis=0)

    return dist_euclidean


def init_cent(dataset, k):

    centroids = dataset.copy()
    np.random.shuffle(centroids)

    return centroids[:k]


def k_means(dataset, k):

    centroids = init_cent(dataset, k)

    distances = calc_dist_euclidean(dataset, centroids)

    cluster_assigning = np.array([dataset[distances == k].mean(axis=0) for k in range(centroids.shape[0])])

    return centroids, cluster_assigning


df = pd.read_csv('bristol_vacation_rentals_2016.csv')

dataset = df[['latitude', 'longitude']].values

k = 3

centroids, cluster_assigning = k_means(dataset, k)
plt.subplot(121)
plt.scatter(dataset[:, 0], dataset[:, 1], s=2)
plt.scatter(centroids[:, 0], centroids[:, 1],  c='r', s=50)
plt.xlabel('latitude')
plt.ylabel('longitude')

plt.subplot(122)
plt.scatter(dataset[:, 0], dataset[:, 1], s=2)
plt.scatter(cluster_assigning[:, 0], cluster_assigning[:, 1], c='r', s=50)
plt.xlabel('latitude')
plt.ylabel('longitude')
plt.show()

【问题讨论】:

  • 顺便说一句,如果您在代码中提供采样数据,我们会更容易。不要从未提供的 csv 文件中加载数据集,而是将其替换为以下内容: dataset = np.random.rand(100).reshape(50, 2)

标签: python k-means


【解决方案1】:

为了方便起见,我将重用来自k_means() 函数的变量distances,并返回它:

def k_means(dataset, k):

    centroids = init_cent(dataset, k)

    distances = calc_dist_euclidean(dataset, centroids)

    cluster_assigning = np.array([dataset[distances == k].mean(axis=0) for k in range(centroids.shape[0])])

    return centroids, distances, cluster_assigning

然后,您可以根据相应的集群绘制质心和数据点,该集群定义一个包含每种颜色的 numpy 数组 colors,并使用 colors[distances] 为每个数据点创建一个颜色的 numpy 数组:

df = pd.read_csv('bristol_vacation_rentals_2016.csv')

dataset = df[['latitude', 'longitude']].values

k = 3
colors = np.array(['r', 'g', 'b'])

centroids, distances, cluster_assigning = k_means(dataset, k)
plt.subplot(121)
plt.scatter(dataset[:, 0], dataset[:, 1], c=colors[distances], s=2)
plt.scatter(centroids[:, 0], centroids[:, 1],  c=colors, s=50)
plt.xlabel('latitude')
plt.ylabel('longitude')

plt.subplot(122)
plt.scatter(dataset[:, 0], dataset[:, 1], c=colors[distances], s=2)
plt.scatter(cluster_assigning[:, 0], cluster_assigning[:, 1], c=colors, s=50)
plt.xlabel('latitude')
plt.ylabel('longitude')
plt.show()

【讨论】:

    猜你喜欢
    • 2019-01-25
    • 2019-06-22
    • 2018-07-02
    • 2020-02-21
    • 2017-03-22
    • 2018-09-19
    • 1970-01-01
    • 2021-11-25
    • 2013-02-07
    相关资源
    最近更新 更多