根据样本点距初始聚类点的距离,将样本点分类。样本点距离那个初始聚类点最近就分为哪一类,手动输入初始聚类点(k个),并计算分类后各簇的均值。
数据下载链接:
链接:https://pan.baidu.com/s/1GT2HGMRtYJsVm7iWMi4qRw
提取码:up6x
复制这段内容后打开百度网盘手机App,操作更方便哦
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import loadmat
mat = loadmat("./data/ex7data2.mat")
X = mat['X']
def plot_data(X):
plt.figure(figsize=(8, 5))
plt.scatter(X[:, 0], X[:, 1], label='point')
plt.xlabel("X1")
plt.ylabel("X2")
plt.legend()
plt.title("X")
plt.grid(True)
plot_data(X)
plt.show()
def find_closest_centroids(X, centroids): # 簇分配
m = X.shape[0] # 样本个数
k = centroids.shape[0] # 聚类个数
idx = np.zeros(m)
for i in range(m):
min_dist = 1000 # 初始距离
for j in range(k):
dist = np.sum((X[i, :] - centroids[j, :])**2)
if dist < min_dist:
min_dist = dist
idx[i] = j
return idx
def compute_centroids(X, idx): # 计算各簇均值
centroids = []
for i in range(len(np.unique(idx))): # np.unique() means K
u_k = X[idx == i].mean(axis=0) # 求每列的平均值
centroids.append(u_k)
return np.array(centroids)
init_centroids = np.array([[3, 1], [6, 3], [2, 5]]) # 手动设置初始聚类中心
idx = find_closest_centroids(X, init_centroids)
print(idx)
print(compute_centroids(X, idx))
cluster1 = X[np.where(idx == 0)[0], :]
cluster2 = X[np.where(idx == 1)[0], :]
cluster3 = X[np.where(idx == 2)[0], :]
plt.figure(figsize=(8, 5))
plt.scatter(cluster1[:, 0], cluster1[:, 1], s=30, color="r", label="cluster 1")
plt.scatter(cluster2[:, 0], cluster2[:, 1], s=30, color="g", label="cluster 2")
plt.scatter(cluster3[:, 0], cluster3[:, 1], s=30, color="b", label="cluster 3")
plt.legend()
plt.show()
输出结果:
plt.show():数据X的分布图
print(idx):各样本的分类属别
[2. 1. 1. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2.
2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2.
2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2.
由于篇幅受限后面省略]
print(compute_centroids(X, idx)):均值坐标
[[3.04367119 1.01541041]
plt.show():分类上色区别图
不同的初始聚类点会有不同的分类效果图,代码中的初始聚类点仅供参考。
本人不才,如有错误欢迎指正。