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聚类,是 ...
随机推荐
- 【SoloPi】SoloPi使用4-功能使用,一机多控
Soloπ是什么Soloπ是一个无线化.非侵入式的Android自动化工具,公测版拥有录制回放.性能测试.一机多控三项主要功能,能为测试开发人员节省宝贵时间. 一机多控功能Soloπ支持通过操作一台主 ...
- C#使用消息队列(MSMQ)
最近项目用到消息队列,找资料学习了下.把学习的结果 分享出来 首先说一下,消息队列 (MSMQ Microsoft Message Queuing)是MS提供的服务,也就是Windows操作系统的功能 ...
- Linux入职基础-1.2_U盘安装RedHat5具体步骤
从U盘安装RedHat5具体步骤 从U盘安装RedHat Linux的具体步骤: 准备工作: RHEL_5.6_i386_DVD.ISO文件 具体步骤: 1.解压并用ultraiso软件打开rhel- ...
- SQL Server2008 删除重复记录只剩一条(无Uid)
INSERT INTO 表1 SELECT * FROM 视图1 CREATE TABLE ##TMP01 ---创建 ...
- Springboot笔记01——Springboot简介
一.什么是微服务 在了解Springboot之前,首先我们需要了解一下什么是微服务. 微服务是一种架构风格(服务微化),是martin fowler在2014年提出来的.微服务简单地说就是:一个应用应 ...
- iOS - starckView 类似Android线性布局
同iOS以往每个迭代一样,iOS 9带来了很多新特性.UIKit框架每个版本都在改变,而在iOS 9比较特别的是UIStackView,它将从根本上改变开发者在iOS上创建用户界面的方式.本文将带你学 ...
- Fortify漏洞之Open Redirect(开放式重定向)
继续对Fortify的漏洞进行总结,本篇主要针对 Open Redirect(开放式重定向) 的漏洞进行总结,如下: 1.1.产生原因: 通过重定向,Web 应用程序能够引导用户访问同一应用程序内 ...
- stm32 ADXL345传感器
加速度灵敏度轴 沿敏感轴加速时相应输出电压增加 寄存器映射 寄存器定义 0x31-DATA_FORMAT SELF_TEST位:设置为1,自测力应用至传感器,造成输出数据转换.值为0时,禁用自测力 S ...
- docker 推送镜像到阿里云
1. 登录阿里云Docker Registry $ sudo docker login --username=www.18860363800@hotmail.com registry.cn-beiji ...
- c# 定制Equals()