热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

吴恩达机器学习ex7:Kmeans分类

1、K-means分类1.1、执行K-means算法K-means算法能够自动将相似的数据样本分为多个簇。其算法的步骤如下:%Initializecentroids

1、K-means分类
1.1、执行K-means算法
K-means算法能够自动将相似的数据样本分为多个簇。
其算法的步骤如下:

% Initialize centroids
centroids = kMeansInitCentroids(X, K);
for iter = 1:iterations
% Cluster assignment step: Assign each data point to the
% closest centroid. idx(i) corresponds to cˆ(i), the index
% of the centroid assigned to example i
idx = findClosestCentroids(X, centroids);
% Move centroid step: Compute means based on centroid
% assignments
centroids = computeMeans(X, idx, K);
end

1.1.1、找到样本最近的中心点
对于每个样本i来说:
在这里插入图片描述
此处ci表示的是样本点xi距离最近簇中心的索引,uj指的是第j个簇中心的位置。
补充完整idx = findClosestCentroids(X, centroids)函数有:

function idx = findClosestCentroids(X, centroids)K = size(centroids, 1);idx = zeros(size(X,1), 1);%distance = zeros(1,K);
%for i = 1:size(X,1)
% for j = 1:K
% distance(j) = (X(i,:)-centroids(j,:))*(X(i,:)-centroids(j,:))';
% [temp,idx(i,1)] = min(distance);
% end
%enddistance = zeros(size(X,1),K);
for i=1:Kdistance(:,i)=sum((X - ones(size(X,1),1)*centroids(i,:)).*...(X - ones(size(X,1),1)*centroids(i,:)),2);
end
[temp,index] = min(distance');
idx = index';
end

运行程序有:

Closest centroids for the first 3 examples: 1 3 2
(the closest centroids should be 1, 3, 2 respectively)

1.1.2、计算簇中心平均值
对于每个新的簇中心,重新计算其坐标为:
在这里插入图片描述
完成函数centroids = computeCentroids(X, idx, K)有:

function centroids = computeCentroids(X, idx, K)% Useful variables
[m n] = size(X);% You need to return the following variables correctly.
centroids = zeros(K, n);for i = 1:Kindex = find(idx==i);for j = 1:size(index,1)newXi(j,:) = X(index(j),:);endcentroids(i, :) = mean(newXi,1);newXi = zeros(1,n);
end
end

运行程序有:

Centroids computed after initial finding of closest centroids: 2.428301 3.157924 5.813503 2.633656 7.119387 3.616684 the centroids should be[ 2.428301 3.157924 ][ 5.813503 2.633656 ][ 7.119387 3.616684 ]

1.2、样本数据集上的k-means算法
运行下列代码:

load('ex7data2.mat');
K = 3;
max_iters = 10;
initial_centroids = [3 3; 6 2; 8 5];
[centroids, idx] = runkMeans(X, initial_centroids, max_iters, true);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1.3、簇中心的随机初始化
在实际中,应该随机选择样本作为簇中心坐标,对簇中心进行初始化。
补充完整函数centroids = kMeansInitCentroids(X, K),有:

function centroids = kMeansInitCentroids(X, K)
centroids = zeros(K, size(X, 2));randidx = randperm(size(X,1));
centroids = X(randidx(1:K),:);end

改用随机初始化簇中心的方式执行k-means算法,执行下列代码:

clear
load('ex7data2.mat');K = 3;
max_iters = 10;
initial_centroids = kMeansInitCentroids(X, K);
[centroids, idx] = runkMeans(X, initial_centroids, max_iters, true);

得到的分类为:
在这里插入图片描述
1.4、使用K-means算法进行图像压缩
在本小节,将使用K-means算法进行图像压缩。在一个24位的彩色图像中,每个像素由3个8位不带符号整型构成,灰度变化范围为0-255,其分别代表RGB。该图像含有上千种颜色,本次需要将颜色压缩至16种。
为了进行压缩,需要存储该16种颜色的RGB值,并且图像中的每个像素需要存储其分类到16种颜色的索引。
1.4.1、像素的K-means算法
执行下列代码:

>> A = double(imread('bird_small.png'));
>> A = A / 255;
>> img_size = size(A);
>> X = reshape(A, img_size(1) * img_size(2), 3);
>> K = 16;
>> max_iters = 10;
>> initial_centroids = kMeansInitCentroids(X, K);
>> [centroids, idx] = runkMeans(X, initial_centroids, max_iters);

得到16个簇中心为:
在这里插入图片描述
下面对原图像进行压缩,其关键的一步即为根据将簇中心(即对应的16种颜色)映射到对应的点。

>> idx = findClosestCentroids(X, centroids);
>> X_recovered = centroids(idx,:);
>> X_recovered = reshape(X_recovered, img_size(1), img_size(2), 3);
>> subplot(1, 2, 1);
>> imagesc(A);
>> title('Original');
>> subplot(1, 2, 2);
>> imagesc(X_recovered);
>> title(sprintf('Compressed, with %d colors.', K));

在这里插入图片描述


推荐阅读
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
author-avatar
滒娶伱
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有