如何将基于轮廓系数的Python脚本转换为MATLAB代码?
修正后的MATLAB代码及问题解析
首先明确原Python代码的核心逻辑:循环尝试不同聚类数p,计算所有质心到所有样本的距离总和,结合每个样本到所属质心的距离和,计算自定义指标s并收集到costs数组中。
以下是修正后的完整MATLAB代码:
costs = []; tic; for p = 1:10 % 对应Python的range(10)(0-9),因聚类数不能为0,这里调整为1-10;若需完全匹配Python逻辑,可改为p=0:9,但需单独处理p=0的无效聚类情况 % 调用MATLAB内置kmeans,获取聚类标签、质心、每个样本到各质心的距离矩阵 [ClusterIndexes, Centroids, ~, D] = kmeans(dataset1, p); X = dataset1; dist_ji = 0; % 累加所有质心到所有样本的欧氏距离 for i = 1:size(X, 1) for j = 1:p dist_ji = dist_ji + pdist2(Centroids(j,:), X(i,:)); end end % 计算每个样本到所属质心的距离之和(对应Python的sum(cluster_assignments[:,1])) cluster_dist_sum = sum(D(sub2ind(size(D), 1:size(X,1), ClusterIndexes'))); N = size(X, 1); % 完成自定义指标计算 dist_ji = dist_ji - cluster_dist_sum / N; a = cluster_dist_sum / (N - 1); s = (dist_ji - a) / max(dist_ji, a); % 将结果追加到costs数组 costs = [costs; s]; end toc; % 对应Python的x = np.arange(10) x = 1:10;
原MATLAB代码的问题修正说明:
- 循环范围错误:内层循环
j=1:10改为j=1:p,当前聚类数为p,质心数量为p,无需遍历10个质心。 - 距离累加逻辑错误:原代码直接赋值
dist_ji=pdist2(...),改为累加dist_ji = dist_ji + pdist2(...),匹配Python中dist_ji += euclidean_dist(...)的累加逻辑。 - 缺失聚类距离和的计算:利用MATLAB kmeans的第四个输出
D(样本到所有质心的距离矩阵),结合聚类标签ClusterIndexes,通过sub2ind提取每个样本到所属质心的距离并求和,对应Python中sum(cluster_assignments[:,1])。 - 未完成指标计算与结果收集:补充
dist_ji的修正、a和s的计算,并通过costs = [costs; s]实现Python中costs.append(s)的数组追加逻辑。 - 语法细节:MATLAB语句结尾需加分号抑制冗余输出,循环和函数调用需严格匹配MATLAB语法规范。
内容的提问来源于stack exchange,提问作者Hammad Younas
相关产品推荐
相关产品推荐

