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聚类,是 ... 
随机推荐
- ALV报表——基础(一)
			目录 一.ALV的简介 二.程序实现 2.1.实现步骤 2.2.代码示例 三.Layout.Fieldcat相关属性,ALV输出函数 3.1.Layout相关属性 3.2.Fieldcat相关属性 3 ... 
- 解决git下载很慢的问题
			通过官网在下载git的时候发现网速只有几十K,淘宝有一个镜像的网站 可以提供下载https://npm.taobao.org/mirrors/git-for-windows/ 
- UOJ220 [NOI2016] 网格 【割顶】【并查集】
			题目分析: 答案显然只有{-1,0,1,2}四种. 对于答案等于-1的情况,只有两种情况,一种是只剩一只跳蚤,另一种是只剩两只跳蚤且他们四连通,这个很好判. 对于答案等于0的情况,那说明联通块大于1, ... 
- element-ui上传一张图片后隐藏上传按钮
			来自:https://github.com/ElemeFE/element/issues/3367#issuecomment-376402380 侵删 el-upload里面绑定一个占位class: ... 
- 两通道实信号使用一个FFT同时计算算法
			前言 在工程的实际应用场景中,往往是需要最省资源量.而DSP资源和BRAM资源对FPGA来说弥足珍贵. 对于同时存在多个通道的实信号需要做FFT而言,常规做法是每个通道用一个FFT IP,FFT IP ... 
- 修改Linux命令的别名:alias
			修改Linux命令的别名. (一)临时生效:仅限当前窗口 查看所有别名 alias 添加别名 alias ll='ls -lh' 重置别名 alias ll='ls -alh' 删除别名: unali ... 
- Keras Conv1d 参数及输入输出详解
			Conv1d(in_channels,out_channels,kernel_size,stride=1,padding=0,dilation=1,groups=1,bias=True) filter ... 
- orm多表的创建和基于对象的查询
			创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系( ... 
- 【loj-1055-Going Together-三个棋子推箱子走到目的地--讲预判的bfs】
			light oj 1055-Going Together 题目大致意思: 简单的三个棋子,每次可以下达一个命令,robots全部按照指令进行前进:若下一步不为空地则停留在原地. 特殊考虑: 1.例如A ... 
- Python离线断网情况下安装numpy、pandas和matplotlib等常用第三方包
			联网情况下在命令终端CMD中输入“pip install numpy”即可自动安装,pandas和matplotlib同理一样方法进行自动安装. 工作的电脑不能上外网,所以不能通过直接输入pip命令来 ... 
