简单二分类(手动输入初始聚类点)

这篇博客介绍了如何基于样本点与手动输入的初始聚类点距离进行二分类。通过计算每个样本到各个初始聚类点的距离,将其分配到最近的类别,并计算分类后的簇均值。提供了数据下载链接,展示数据分布图、分类结果以及分类上色的区别图。文章指出,不同的初始聚类点会导致不同的分类效果。
摘要由CSDN通过智能技术生成

根据样本点距初始聚类点的距离,将样本点分类。样本点距离那个初始聚类点最近就分为哪一类,手动输入初始聚类点(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():分类上色区别图
在这里插入图片描述
不同的初始聚类点会有不同的分类效果图,代码中的初始聚类点仅供参考。
本人不才,如有错误欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值