机器学习-模式识别(5)基于K-means的动态聚类

在这里插入图片描述
在这里插入图片描述

要求:

(1)迭代过程中,每一轮迭代、每一类样本的总数、错分的个数、相应的错误率;
(2)画图展示每一轮迭代中,这几个类别的类中心与上一次类中心的总误差变化趋势。(一般来说,是随着迭代次数增加而快速减小的),或者称为纵坐标为在其上进行聚类的准确率。
(3)在图中做出每一轮迭代中,类中心点和不同类别归属。可以用不同颜色、不同标记。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
图中可看出,误差平方和与分类数的拐点为k=2;可确定分类个数k=2为最佳分类个数;一般来说我们不考虑分类个数为1的情况,剔除掉分类个数为1的情况后,发现图中没有明显拐点且呈类线性关系,因此可认为最佳分类个数即为k=2。
在这里插入图片描述

 
% 已知20个样本,每个样本有两个特征
% K-means方法的MATLAB实现
% 数据的准备和初始化
 
clc
clear
x=[0 0;1 0;0 1;1 1;2 1;1 2;2 2;3 2;6 6;7 6;8 6;
    6 7;7 7;8 7;9 7;7 8;8 8;9 8;8 9;9 9];
%设置类标签
for i=1 : 20
    if(i<=8)
        x(i,3)=1;
    else
        x(i,3)=2;
    end
end
 
z=zeros(2,2);
z1=zeros(2,2);
%z=x(:,1);
test=x(1:2,2);
%z=x(1:2,1:2);%初始聚类中心为第一第二个样本
%z=[6 6;7 6];%初始聚类中心为随机样本
z=rand([2,2])*10; %生成一个22列的随机数矩阵
j=1;
ErrNum=0;
times=0;
%初始样本分布图与聚类中心
figure(1);
gscatter(x(:,1),x(:,2),x(:,3));
hold on
plot(z(:,1),z(:,2),'k*',...
    'LineWidth',1,...
    'MarkerSize',5,...
    'MarkerFaceColor',[0.5,0.5,0.5])
set(gca,'Linewidth',1);
title('初始样本分布图与聚类中心');
temp1Sum=0;
temp2Sum=0;
%%寻找聚类中心
while 1
    count=zeros(2,1);
    allsum=zeros(2,2);
    ErrNum=0;
    
    times=times+1;
    fprintf('第%d轮计算\n',times);
    for i=1:20  %对每一个样本i,计算到两个聚类中心的距离
        temp1=sqrt((z(1,1)-x(i,1)).^2+(z(1,2)-x(i,2)).^2);
        temp2=sqrt((z(2,1)-x(i,1)).^2+(z(2,2)-x(i,2)).^2);
        %fprintf('第%d个样本temp1=%f,temp2=%f\n',i,temp1,temp2);
        if(temp1<temp2)
            temp1Sum=temp1Sum+temp1;
            label(i,1)=1;
            if(x(i,3)==2)
                ErrNum=ErrNum+1;
                fprintf('第%d个样本分类错误!\n',i);
            end
            count(1)=count(1)+1;%第一类个数
            allsum(1,1)=allsum(1,1)+x(i,1);%所有第一类的坐标累加
            allsum(1,2)=allsum(1,2)+x(i,2);
        else
            label(i,1)=2;
            temp2Sum=temp2Sum+temp2;
            if(x(i,3)==1)
                ErrNum=ErrNum+1;
                fprintf('第%d个样本分类错误!\n',i);
            end
            count(2)=count(2)+1;%第二类个数
            allsum(2,1)=allsum(2,1)+x(i,1);%所有第二类的坐标累加
            allsum(2,2)=allsum(2,2)+x(i,2);
        end
    end
    fprintf('第%d轮错误个数为:%d错误率为%f\n',times,ErrNum,ErrNum/20);
    %取均值,迭代新的聚类中心
    z1(1,1)=allsum(1,1)/count(1);
    z1(1,2)=allsum(1,2)/count(1);
    z1(2,1)=allsum(2,1)/count(2);
    z1(2,2)=allsum(2,2)/count(2);
    figure(j+1)
    gscatter(x(:,1),x(:,2),label(:,1));
%     plot( x(:,1),x(:,2),'k*',...
%         'LineWidth',2,...
%         'MarkerSize',10,...
%         'MarkerEdgeColor','k',...
%         'MarkerFaceColor',[0.5,0.5,0.5])
    hold on
    plot(z1(:,1),z1(:,2),'k*',...
        'LineWidth',1,...
        'MarkerSize',5,...
        'MarkerFaceColor',[0.5,0.5,0.5])
    set(gca,'Linewidth',1);
    title(sprintf('第%d次迭代图', j))
%     title('K-means分类图','fontsize',12);
    if(z==z1)
        break;
    else
        
        fprintf('第%d轮后聚类中心为:\n',j);
        disp(z1);
        fprintf('\n');
        z=z1;
        j=j+1;
    end
    
end
 
 
%%结果显示
fprintf('最终聚类中心:\n');
disp(z1);       %输出聚类中心
gscatter(x(:,1),x(:,2),label(:,1));
%     plot( x(:,1),x(:,2),'k*',...
%         'LineWidth',2,...
%         'MarkerSize',10,...
%         'MarkerEdgeColor','k',...
%         'MarkerFaceColor',[0.5,0.5,0.5])
hold on
plot(z1(:,1),z1(:,2),'k*',...
    'LineWidth',1,...
    'MarkerSize',5,...
    'MarkerFaceColor',[0.5,0.5,0.5])
set(gca,'Linewidth',1);
title('K-means分类图','fontsize',12);
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: K-means聚类算法是一种基于距离度量的分类算法,用于将数据分为若干类。它通过计算每个点和其他点的相似性,来把这些数据点划分到若干个类中。算法的代码如下:from sklearn.cluster import KMeans import numpy as np# 设置簇的个数 k = 3# 读取数据 data = np.array([[1,2],[3,4],[5,6],[7,8],[9,10]])# 创建KMeans实例 kmeans = KMeans(n_clusters=k)# 使用数据拟合KMeans实例 kmeans.fit(data)# 获取每个点的聚类标签 labels = kmeans.labels_ print(labels) ### 回答2: k-means聚类算法是一种常用的无监督学习算法,用于将数据样本划分为不同的簇。下面是一个简单的k-means聚类算法的Python代码示例: ```python import numpy as np def k_means(data, k, max_iterations): # 随机选取k个中心点 centers = data[np.random.choice(len(data), k, replace=False)] for _ in range(max_iterations): # 初始化簇的列表 clusters = [[] for _ in range(k)] # 将每个样本分配到最近的中心点所属的簇 for point in data: distances = np.linalg.norm(point - centers, axis=1) cluster_index = np.argmin(distances) clusters[cluster_index].append(point) # 更新中心点为簇的均值 for i in range(k): centers[i] = np.mean(clusters[i], axis=0) return clusters # 测试用例 data = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]]) k = 2 max_iterations = 100 result = k_means(data, k, max_iterations) print(result) ``` 上述代码通过调用`k_means`函数实现了k-means聚类算法。它接受三个参数:`data`表示待聚类的数据集,`k`表示要划分的簇的个数,`max_iterations`表示最大迭代次数。算法首先随机选取k个中心点,然后通过迭代的方式,将每个样本点分配到离其最近的中心点所属的簇中,并更新中心点为簇内样本的均值,直到达到最大迭代次数。 以上是一个简单的k-means聚类算法的代码示例。在实际应用中,还可以根据需要对代码进行优化和扩展,以适应更复杂的数据集和问题。 ### 回答3: K-means聚类算法是一种常用的无监督机器学习算法,主要用于对数据进行聚类分析。其基本思想是将数据集划分为K个簇,使得簇内的数据点尽量相似,而簇间的数据点尽量不相似。 以下是一段使用Python编写的K-means聚类算法识别代码: ```python import numpy as np def k_means(data, k, max_iter=100): # 随机初始化质心 centroids = data[np.random.choice(range(len(data)), k, replace=False)] for _ in range(max_iter): # 分配样本到最近的质心 labels = np.argmin(np.linalg.norm(data[:, np.newaxis] - centroids, axis=-1), axis=-1) # 更新质心位置 new_centroids = np.array([data[labels == i].mean(axis=0) for i in range(k)]) # 判断质心是否变化少于阈值,如果是则停止迭代 if np.allclose(centroids, new_centroids): break # 更新质心 centroids = new_centroids return labels, centroids ``` 上述代码中,主要的函数是`k_means`,它接受一个二维数据集`data`、簇的数量`k`和最大迭代次数`max_iter`作为输入,返回每个样本的簇标签`labels`以及聚类后的质心位置`centroids`。算法的具体步骤如下: 1. 将质心随机初始化为数据集中的K个样本。 2. 循环迭代最大次数,直到质心不再变化。 3. 对于每个样本,计算其与所有质心的距离,并将其分配到距离最近的簇。 4. 更新每个簇的质心位置为该簇内所有样本的均值。 5. 如果新的质心位置与旧的相比变化小于一个阈值,则停止迭代。 6. 返回最终的簇标签和质心位置。 注意,在代码中使用了NumPy库来进行向量化计算,提高了代码的运行效率。 此段代码实现了基本的K-means聚类算法,可以通过传入不同的数据集和簇的数量,来进行聚类分析并得到结果。但值得注意的是,K-means算法对初始质心的选择比较敏感,不同的初始质心可能会导致不同的聚类结果,因此在实际应用中可能需要多次运行算法以选择最优的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香草绵绵冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值