K 均值聚类,将数据颜色更改为取决于最近的质心
K-means clustering, changing colour of data to depending on closest centroid
我的 python 下面的代码对一组数据执行非常非常简单的 K 均值聚类。存在的问题是我需要根据最接近的质心来更改数据点的颜色。谁能帮我做点什么?
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()
为了简单起见,我会重用 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()
我的 python 下面的代码对一组数据执行非常非常简单的 K 均值聚类。存在的问题是我需要根据最接近的质心来更改数据点的颜色。谁能帮我做点什么?
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()
为了简单起见,我会重用 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()