Kmeans聚类(lena图)
lena512.raw 下载地址:https://files.cnblogs.com/files/jzcbest1016/lena512_20171219131444306.rar
.raw文件可以用photoshop打开
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
#define ROW 512
#define COL 512
#define K 8
#define N 512*512
typedef unsigned char BYTE;
int center[N];
BYTE origin[N];
BYTE output[N];
int mean[K];
double cal_psnr(BYTE input[N],BYTE output[N])
{
int i, j;
double PSNR = 0, MSE = 0, MAXI = 255;
for (i=0;i<N;i++)
MSE += (input[i] - output[i]) * (input[i] - output[i]);
MSE = MSE/(ROW*COL);
printf("MSE: %f\n", MSE);
PSNR = 20*log10(MAXI) - 10*log10(MSE);
return PSNR;
}
//计算距离函数,欧式距离
double getdistance(int i,int j)
{
int d;
d = abs(i-j);
return d;
}
//聚类函数
void cluster()
{
for (int i = 0; i < N; i++)
{
double min = 9999.0;
for (int j = 0; j < K; j++)
{
//printf("%d\n",origin[i]);
if(getdistance(origin[i], mean[j])<min)
{
min = getdistance(origin[i], mean[j]);
center[i] = j;
}
}
} }
//聚类后误差计算函数
double gete()
{
double cnt=0, sum=0;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < K; j++)
{
if (center[i] == j)
{
cnt = getdistance(origin[i], mean[j]);
}
}
sum += cnt;
}
return sum;
} //重新计算聚类中心
void getmean(int center[N])
{
double sum;
int count;
for (int i = 0; i < K; i++)
{
sum=0;
count = 0;
for (int j = 0; j < N; j++)
{
if (center[j] == i)
{
sum+= origin[j];
count++;
}
}
mean[i] = sum / count;
}
} int main()
{
FILE *f = NULL;
f = fopen("D:\lena512.raw","rb");
fread(origin,sizeof(BYTE),ROW*COL,f);
printf("has already read\n");
mean[0] = 4;
mean[1] = 50;
mean[2] = 98;
mean[3] = 250;
mean[4] = 23;
mean[5] = 128;
mean[6] = 78;
mean[7] = 80;
int number = 0;
double temp1, temp2;
//第一次聚类
cluster();
number++;//number统计进行了几次聚类
//对第一次聚类的结果进行误差平方和的计算
temp1 = gete();
printf("the error1 is:%f\n", temp1);
//针对第一次聚类的结果,重新计算聚类中心
getmean(center);
//第二次聚类
cluster();
number++;
temp2 = gete();
printf("the error2 is:%f\n", temp2); //迭代循环,直到两次迭代误差的差值在一定阈值范围内,则迭代停止
while (fabs(temp1 - temp2) > 0.5)
{
temp1 = temp2;
getmean(center);
cluster();
temp2 = gete();
number++;
//printf("the error%d is:%f\n", number,temp2);
}
for (int i = 0;i<N;i++)
output[i] = mean[center[i]];
printf("PSNR: %lf\n",cal_psnr(origin,output));
printf("the total number of cluster is:%d\n", number); return 0;
}
PNSR,峰值信噪比,是用来衡量图片质量的。
Kmeans聚类(lena图)的更多相关文章
- kmeans聚类中的坑 基于R shiny 可交互的展示
龙君蛋君 2015年5月24日 1.背景介绍 最近公司在用R 建模,老板要求用shiny 展示结果,建模的过程中用到诸如kmean聚类,时间序列分析等方法.由于之前看过一篇讨论kmenas聚类针对某一 ...
- 用scikit-learn学习K-Means聚类
在K-Means聚类算法原理中,我们对K-Means的原理做了总结,本文我们就来讨论用scikit-learn来学习K-Means聚类.重点讲述如何选择合适的k值. 1. K-Means类概述 在sc ...
- K-Means聚类算法原理
K-Means算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛.K-Means算法有大量的变体,本文就从最传统的K-Means算法讲起,在其基础上讲述K-Means的优化变体 ...
- Kmeans聚类算法原理与实现
Kmeans聚类算法 1 Kmeans聚类算法的基本原理 K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一.K-means算法的基本思想是:以空间中k个点为中心进行聚类,对 ...
- 转载: scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法
版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] ================== ...
- K-means聚类的Python实现
生物信息学原理作业第五弹:K-means聚类的实现. 转载请保留出处! K-means聚类的Python实现 原理参考:K-means聚类(上) 数据是老师给的,二维,2 * 3800的数据.plot ...
- 一步步教你轻松学K-means聚类算法
一步步教你轻松学K-means聚类算法(白宁超 2018年9月13日09:10:33) 导读:k-均值算法(英文:k-means clustering),属于比较常用的算法之一,文本首先介绍聚类的理 ...
- k-means+python︱scikit-learn中的KMeans聚类实现( + MiniBatchKMeans)
来源:, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='auto', verbose=0, ...
- 4.无监督学习--K-means聚类
K-means方法及其应用 1.K-means聚类算法简介: k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低.主要处理过程包括: 1.随机选择k个点作为 ...
- matlab练习程序(k-means聚类)
聚类算法,不是分类算法. 分类算法是给一个数据,然后判断这个数据属于已分好的类中的具体哪一类. 聚类算法是给一大堆原始数据,然后通过算法将其中具有相似特征的数据聚为一类. 这里的k-means聚类,是 ...
随机推荐
- Luogu3824 [NOI2017]泳池 【多项式取模】【递推】【矩阵快速幂】
题目分析: 用数论分块的思想,就会发现其实就是连续一段的长度$i$的高度不能超过$\lfloor \frac{k}{i} \rfloor$,然后我们会发现最长的非$0$一段不会超过$k$,所以我们可以 ...
- 安利一下stringstream
关于实用的 stringstream 处理毒瘤输入数据 比如这个题 在输入的时候有很多问题,如果用scanf输入char型字符串,那么不好用map判断,并且读入整行判断换行会很麻烦 如果选择用stri ...
- bootstrap的tree使用
效果图: 先引用,顺序很重要 <script src="~/Content/bootstrap-table/bootstrap-table.min.js"></s ...
- linux环境weblogic的安装及新建域
环境:inux 64位,jdk 64位, jdk 安装用户应使用weblogic.若使用其他用户安装,须将jdk安装目录整体授权给wblogic用户 安装包:wls1036_dev.zi ...
- 基于【 建造者模式】一 || 网关zuul过滤器封装
一.springcloud的zuul网关拦截 1.黑名单拦截 2.参数验签 3.Api接口权限验证 二.网关拦截实现方式 1.继承ZuulFilter方法,实现业务逻辑 @Component @Slf ...
- IOS开发之——绘图(CGContext)
0 CGContextRef context = UIGraphicsGetCurrentContext(); 设置上下文 1 CGContextMoveToPoint 开始画线 2 CGContex ...
- SAP Cloud for Customer的Container应用设计原理
来自Jerry的同事,Yang Joey. 相信大部分C4C的UI developer包括我刚开始的时候都会比较好奇我们平时写的javascript代码是如何运行在移动设备上的,同样的,我也对这个问题 ...
- 【vue&ts开发】Vue 3.0前的 TypeScript 最佳入门实践
1.使用官方脚手架构建 新的 VueCLI工具允许开发者 使用 TypeScript 集成环境 创建新项目. 只需运行 vue createmy-app. 然后,命令行会要求选择预设.使用箭头键选择 ...
- 【异常】jps6432 -- process information unavailable
1 现象
- IPTables 和 Netfilter 框架
前言 防火墙是保护服务器的重要工具. Linux中最常用的基本防火墙软件是iptables.iptables通过与Linux内核网络堆栈(networking stack)中的包过滤钩子(packet ...