python中学习K-Means和图片压缩
时间:2019-04-10
本文章向大家介绍python中学习K-Means和图片压缩,主要包括python中学习K-Means和图片压缩使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
大家在学习python中,经常会使用到K-Means和图片压缩的,我们在此给大家分享一下K-Means和图片压缩的方法和原理,喜欢的朋友收藏一下吧。
通俗的介绍这种压缩方式,就是将原来很多的颜色用少量的颜色去表示,这样就可以减小图片大小了。下面首先我先介绍下K-Means,当你了解了K-Means那么你也很容易的可以去理解图片压缩了,最后附上图片压缩的核心代码。
K-Means的核心思想
k-means的核心算法也就上面寥寥几句,下面将分三个部分来讲解:初始化簇中心、簇分配、簇中心移动。
初始化簇中心
随机取簇中心若是不幸,会出现局部最优的情况;想要打破这种情况,需要多次取值计算来解决这种情况。
代价函数
代码实现
J = zeros(100,1); M = size(X,1); min = inf; for i = 1:100 %随机取k个样本点作为簇中心 randidx = randperm(M); initial_centroids = X(randidx(1:K),:); %将所得的中心点进行训练 [centroids0, idx] = runkMeans(X, initial_centroids,10); for k = 1:M J(i) = J(i) + sum((X(k,:) - centroids0(idx(M),:)).^2); end %取最小代价为样本中心点 if(min > J(i)) centroids =centroids0; end end
簇分配
将样本点分配到离它最近的簇中心下
tmp = zeros(K,1); for i = 1:size(X,1) for j = 1:K tmp(j) = sum((X(i,:) - centroids(j,:)).^2); end [mins,index]=min(tmp); idx(i) = index; end
簇中心移动
取当前簇中心下所有样本点的均值为下一个簇中心
for i = 1:m centroids(idx(i),:) = centroids(idx(i),:) + X(i,:); end for j = 1:K centroids(j,:) = centroids(j,:)/sum(idx == j); end
图片压缩
% 加载图片 A = double(imread('dragonfly.jpg')); % 特征缩减 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); %开始压缩图片 idx = findClosestCentroids(X, centroids); X_recovered = centroids(idx,:); X_recovered = reshape(X_recovered, img_size(1), img_size(2), 3); %输出所压缩的图片 subplot(1, 2, 2); imagesc(X_recovered)
- JSP Cheat Sheet - JavaWeb基础学习速查表
- 把网站改成APP吧-Xamarin WebView
- 数据库E-R模型关系图
- 修改Visual Studio类模板添加版权注释信息
- Oracle 11g 安装教程
- ASP.NET MVC学习笔记07数据表和模型添加新字段
- 以太坊·电影院场景区块链应用探索
- 最全爬虫攻略:微博、APP、公众号一个不能少!
- 注册中心 Eureka 源码解析 —— Eureka-Client 初始化(一)之 EurekaInstanceConfig
- 无论人工智能发展到什么地步,都离不开这6段代码
- Dubbo源码解析 —— 逻辑层设计之服务降级
- 【死磕Java并发】-----J.U.C之Condition
- 数据库中间件 MyCAT 源码分析 —— 【单库单表】查询
- 数据库中间件 MyCAT源码分析:【单库单表】插入
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 最基础的动态数据结构:链表
- Python 微信机器人-如何查看别人撤回的消息,实战演示!
- Python 技术篇-全局变量引用,local variable referenced before assignment.解决办法
- 线性结构之栈和队列
- pyHook 转码问题-MouseSwitch() missing 8 required positional arguments...,原因及解决办法
- 将Java中的数组进行二次封装成属于我们自己的数组
- Windows 卡进程问题-请等待当前程序完成卸载或更改,轻松解决
- Netty入门之WebSocket初体验
- 如何修复无法启动的docker容器
- Kafka安装(极简版)
- parallelStream的坑,不踩不知道,一踩吓一跳
- leetcode链表之删除链表的节点
- Windows 技术篇-通过注册表查找vc运行库所在位置实战演示,通过ProductCode查看vc++运行库安装位置
- Python 库安装问题-whl is not a supported wheel on this platform.原因及解决办法
- 安装Go运行环境