机器学习(周志华) 参考答案 第九章 聚类 9.10

本文提出了一种改进的K均值聚类算法,通过引入惩罚项解决了最优聚类数确定的问题,并在西瓜数据集上进行了实验验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

机器学习(周志华) 参考答案 第九章 聚类 9.10

机器学习(周志华西瓜书) 参考答案 总目录

机器学习(周志华) 参考答案 第九章 聚类


10.实现一种能自动确定聚类数的改进k均值算法,编程实现并在西瓜数据集上运行。
如果单纯的从最小化类间均方误差来求解,当K的值为样本数,即每个样本分为一类时,得到均方误差为0,显然这是没有意义的。所以需要对k进行适当的惩罚。这里对分类后的混乱程度(熵)进行惩罚,取适当的系数t,使得
E=ki=1(xCi||xui||22t|Di||D|log|Di||D|)
其中 |Di| 是第i类包含的样本数, |D| 为样本总数,t为适当的参数,这里设为0.5。
由于熵为负数,所以在最小化作为惩罚时用减号。
然后从K=2起迭代,当求出的 Ek 增大时,认为k-1是最优的k值。

由于每次计算是随机均值,所以导致求出的E不同,可以尝试每个K值也多次计算取最小值或者均值。
对于西瓜4.0的分类数一般在3,4之间。

k=3
k=4

参考代码

x = xlsread('C:\Users\icefire\Desktop\ml\西瓜4.xlsx', 'sheet1', 'A1:B30');
[m,n]=size(x);
%当前最低的平方误差,初始值设为一个很大的数
old_ts=100;
%对K值遍历,至少2类
for k=2:10
    %随机均值
    u=x(randperm(m,k),:);
    while 1
        %将各类集合清空
        c=zeros(k,30);
        nums=zeros(k,1);
        %对所有样本遍历,选择最近的集合
        for i=1:m
           mind=100000;
           minl=0;
           for j=1:k
              d=norm(x(i,:)-u(j,:));
              if(d<mind)
                 mind=d;
                 minl=j;
              end
           end
           nums(minl)=nums(minl)+1;
           c(minl,nums(minl))=i;
        end   
        %计算两次均值差异,并更新均值
        ut=zeros(k,2);
        for i=1:k
           for j=1:nums(i)
               ut(i,:)=ut(i,:)+x(c(i,j),:);
           end
           ut(i,:)=ut(i,:)/nums(i);
        end

        du=norm(ut-u);
        if(du<0.001)
            break;
        else
            u=ut;
        end

    end
    %计算当前的均方误差
    ts=0;
    for i=1:k
         for j=1:nums(i)
            ts=ts+norm(x(c(i,j),:)-u(i,:))^2; 
         end
         %惩罚项
         ts=ts-(nums(i)/m)*log(nums(i)/m)*0.5;
    end
    %如果ts比前一轮大则停止,否则更新
    if(ts<old_ts)
        old_ts=ts;
        old_c=c;
        old_nums=nums;
    else
        break;
    end
end
ch='o*+>.';
%取前一轮的k为最佳的k值
nums=old_nums;
c=old_c;
k=k-1;
%绘制凸包与点
for i=1:k
   plot(x(c(i,1:nums(i)),1),x(c(i,1:nums(i)),2),ch(i));
   hold on;
   tc=x(c(i,1:nums(i)),:);
   chl=convhull(tc);
   line(tc(chl,1),tc(chl,2))
   hold on;
end

xlabel('密度');
ylabel('含糖率');
title('K-means'); 
### 关于《机器学习周志华第二章答案 当考虑模型评估与选择时,不同评价指标提供了多角度的理解方法。对于给定的学习器而言,在特定条件下其性能可以通过多种方式衡量。例如,通过McNemar检验来判断两个分类算法在相同数据集上的表现差异是否具有统计学意义[^1]。 若要对比两学习器的总体性能,除了依赖传统的准确率之外,还可以借助受试者工作特征曲线(ROC),特别是当面对不平衡的数据分布情况时更为有效。如果一个学习器的ROC曲线完全覆盖住了另一条,则表明前者的整体性能更佳;而对于存在交叠的情况,则推荐采用曲线下面积(AUC)作为评判标准[^2]。 另外,“平衡点”(Break-Event Point,简称BEP),定义为查准率等于查全率时对应的值,也被用来辅助评估。比如,当某个学习器拥有更高的F1分数时,意味着它同样具备较大的BEP数值,这暗示着该模型可能更适合处理那些对误报和漏报敏感的应用场景[^4]。 针对具体题目解答部分,《机器学习》一书中关于真正例率(True Positive Rate, TPR)、假正例率(False Positive Rate, FPR)以及查准率(Precision, P)、查全率(Recall, R)之间关系进行了深入探讨: - **TPR** 和 **R** 实际上是同一个概念的不同表述形式; - **FPR** 则反映了负样本被错误标记的比例; - 查准率P关注的是预测为正类别的实例中有多少是真的正类别成员; - 而查全率R侧重考察实际属于正类别的对象有多少被成功识别出来。 这些度量共同构成了全面理解分类效果的基础框架[^5]。 ```python def calculate_metrics(tp, tn, fp, fn): """ 计算返回精度(precision), 召回率(recall), 真阳性率(true positive rate) 和 假阳性率(false positive rate). 参数: tp -- 正确预测为正的数量 tn -- 正确预测为负的数量 fp -- 错误预测为正的数量 fn -- 错误预测为负的数量 返回: precision -- 召回率/真阳性率 fpr -- 假阳性率 """ try: precision = tp / (tp + fp) recall_tpr = tp / (tp + fn) fpr = fp / (fp + tn) return round(precision, 3), round(recall_tpr, 3), round(fpr, 3) except ZeroDivisionError as e: print("除数不能为零:", str(e)) ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值