㈠ c算法 求平均值问题(递归)
*n就是乘以n的意思啊
设这组数字是 4 5 2 4 7 88(共6 个)
一开始f->link 肯定不是NULL了,所以一直往下递归,直到最后一个元素时,f->link 等于了NULL,n也就变为了1,return回去的就是最后一个元素88了,而返还回去的值给了 倒数第二个递归,即sum=88*1,n++(n变为了2),然后返还(88*1+7)/2(即最后两项的平均值),然后再sum=【(88*1+7)/2】*2(最后两项的和),n++(n等于了3),返还(88*1+2+4)/3(即最后3项的平均值).......依次类推到链首部,就这样了
希望你能理解
㈡ 模糊C均值聚类算法(FCM)
【嵌牛导读】FCM算法是一种基于划分的聚类算法,它的思想就是使得被划分到同一簇的对象之间相似度最大,而不同簇之间的相似度最小。模糊C均值算法是普通C均值算法的改进,普通C均值算法对于数据的划分是硬性的,而FCM则是一种柔性的模糊划分。
【嵌牛提问】FCM有什么用?
【嵌牛鼻子】模糊C均值聚类算法
【嵌牛正文】
聚类分析是多元统计分析的一种,也是无监督模式识别的一个重要分支,在模式分类、图像处理和模糊规则处理等众多领域中获得最广泛的应用。它把一个没有类别标记的样本按照某种准则划分为若干子集,使相似的样本尽可能归于一类,而把不相似的样本划分到不同的类中。硬聚类把每个待识别的对象严格的划分某类中,具有非此即彼的性质,而模糊聚类建立了样本对类别的不确定描述,更能客观的反应客观世界,从而成为聚类分析的主流。
模糊聚类算法是一种基于函数最优方法的聚类算法,使用微积分计算技术求最优代价函数,在基于概率算法的聚类方法中将使用概率密度函数,为此要假定合适的模型,模糊聚类算法的向量可以同时属于多个聚类,从而摆脱上述问题。 模糊聚类分析算法大致可分为三类:
1)分类数不定,根据不同要求对事物进行动态聚类,此类方法是基于模糊等价矩阵聚类的,称为模糊等价矩阵动态聚类分析法。
2)分类数给定,寻找出对事物的最佳分析方案,此类方法是基于目标函数聚类的,称为模糊C 均值聚类。
3)在摄动有意义的情况下,根据模糊相似矩阵聚类,此类方法称为基于摄动的模糊聚类分析法。
我所学习的是模糊C 均值聚类算法,要学习模糊C 均值聚类算法要先了解虑属度的含义,隶属度函数是表示一个对象x 隶属于集合A 的程度的函数,通常记做μA (x),其自变量范围是所有可能属于集合A 的对象(即集合A 所在空间中的所有点),取值范围是[0,1],即0<=μA (x)<=1。μA (x)=1表示x 完全隶属于集合A ,相当于传统集合概念上的x ∈A 。一个定义在空间X={x}上的隶属度函数就定义了一个模糊集合A ,或者叫定义在论域X={x}上的模糊子集A 。对于有限个对象x 1,x 2,……,x n 模糊集合A 可以表示为:A ={(μA (x i ), x i ) |x i ∈X } (6.1)
有了模糊集合的概念,一个元素隶属于模糊集合就不是硬性的了,在聚类的问题中,可以把聚类生成的簇看成模糊集合,因此,每个样本点隶属于簇的隶属度就是[0,1]区间里面的值。
FCM 算法需要两个参数一个是聚类数目C ,另一个是参数m 。一般来讲C 要远远小于聚类样本的总个数,同时要保证C>1。对于m ,它是一个控制算法的柔性的参数,如果m 过大,则聚类效果会很次,而如果m 过小则算法会接近HCM 聚类算法。算法的输出是C 个聚类中心点向量和C*N的一个模糊划分矩阵,这个矩阵表示的是每个样本点属于每个类的隶属度。根据这个划分矩阵按照模糊集合中的最大隶属原则就能够确定每个样本点归为哪个类。聚类中心表示的是每个类的平均特征,可以认为是这个类的代表点。从算法的推导过程中我们不难看出,算法对于满足正态分布的数据聚类效果会很好。
通过实验和算法的研究学习,不难发现FCM算法的优缺点:
首先,模糊c 均值泛函Jm 仍是传统的硬c 均值泛函J1 的自然推广。J1 是一个应用很广泛的聚类准则,对其在理论上的研究已经相当的完善,这就为Jm 的研究提供了良好的条件。
其次,从数学上看,Jm与Rs的希尔伯特空间结构(正交投影和均方逼近理论) 有密切的关联,因此Jm 比其他泛函有更深厚的数学基础。
最后,FCM 聚类算法不仅在许多邻域获得了非常成功的应用,而且以该算法为基础,又提出基于其他原型的模糊聚类算法,形成了一大批FCM类型的算法,比如模糊c线( FCL) ,模糊c面(FCP) ,模糊c壳(FCS) 等聚类算法,分别实现了对呈线状、超平面状和“薄壳”状结构模式子集(或聚类) 的检测。
模糊c均值算法因设计简单,解决问题范围广,易于应用计算机实现等特点受到了越来越多人的关注,并应用于各个领域。但是,自身仍存在的诸多问题,例如强烈依赖初始化数据的好坏和容易陷入局部鞍点等,仍然需要进一步的研究。
㈢ 用C语言计算一个数组内的所有数的平均值
printf("%f",d/10)这行代码的输出控制有误,因为d定义的是int型,d/10还是int型,应该使用%d,而不是%f,%f是单精度浮点型数据。
格式说明由“%”和格式字符组成,如%d%f等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%”字符开始的。不同类型的数据用不同的格式字符。
格式字符有d,o,x,u,c,s,f,e,g等。
1.%d整型输出,%ld长整型输出,
2.%o以八进制数形式输出整数,
3.%x以十六进制数形式输出整数,
4.%u以十进制数输出unsigned型数据(无符号数)。
5.%c用来输出一个字符,
改过之后运行结果:
(3)c均值算法扩展阅读:
需要说明的是:
1、一个C语言源程序可以由一个或多个源文件组成。
2、每个源文件可由一个或多个函数组成。
3、一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。是整个程序的入口。
4、源程序中可以有预处理命令(包括include 命令,ifdef、ifndef命令、define命令),预处理命令通常应放在源文件或源程序的最前面。
5、每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“}”之后不能加分号。结构体、联合体、枚举型的声明的“}”后要加“ ;”。
6、标识符,关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。
网络-c语言
㈣ 模式识别中,C均值算法的初始聚类中心点的选取会影响聚类情况的变化
会对结果有影响,包括聚类的种类都对聚类的结果有影响
㈤ 模糊c均值算法matlab程序
function [center, U, obj_fcn] = FCMClust(data, cluster_n, options)
% FCMClust.m 采用模糊C均值对数据集data聚为cluster_n类
%
% 用法:
% 1. [center,U,obj_fcn] = FCMClust(Data,N_cluster,options);
% 2. [center,U,obj_fcn] = FCMClust(Data,N_cluster);
%
% 输入:
% data ---- nxm矩阵,表示n个样本,每个样本具有m的维特征值
% N_cluster ---- 标量,表示聚合中心数目,即类别数
% options ---- 4x1矩阵,其中
% options(1): 隶属度矩阵U的指数,>1 (缺省值: 2.0)
% options(2): 最大迭代次数 (缺省值: 100)
% options(3): 隶属度最小变化量,迭代终止条件 (缺省值: 1e-5)
% options(4): 每次迭代是否输出信息标志 (缺省值: 1)
% 输出:
% center ---- 聚类中心
% U ---- 隶属度矩阵
% obj_fcn ---- 目标函数值
% Example:
% data = rand(100,2);
% [center,U,obj_fcn] = FCMClust(data,2);
% plot(data(:,1), data(:,2),'o');
% hold on;
% maxU = max(U);
% index1 = find(U(1,:) == maxU);
% index2 = find(U(2,:) == maxU);
% line(data(index1,1),data(index1,2),'marker','*','color','g');
% line(data(index2,1),data(index2,2),'marker','*','color','r');
% plot([center([1 2],1)],[center([1 2],2)],'*','color','k')
% hold off;
if nargin ~= 2 & nargin ~= 3, %判断输入参数个数只能是2个或3个
error('Too many or too few input arguments!');
end
data_n = size(data, 1); % 求出data的第一维(rows)数,即样本个数
in_n = size(data, 2); % 求出data的第二维(columns)数,即特征值长度
% 默认操作参数
default_options = [2; % 隶属度矩阵U的指数
100; % 最大迭代次数
1e-5; % 隶属度最小变化量,迭代终止条件
1]; % 每次迭代是否输出信息标志
if nargin == 2,
options = default_options;
else %分析有options做参数时候的情况
% 如果输入参数个数是二那么就调用默认的option;
if length(options) < 4, %如果用户给的opition数少于4个那么其他用默认值;
tmp = default_options;
tmp(1:length(options)) = options;
options = tmp;
end
% 返回options中是数的值为0(如NaN),不是数时为1
nan_index = find(isnan(options)==1);
%将denfault_options中对应位置的参数赋值给options中不是数的位置.
options(nan_index) = default_options(nan_index);
if options(1) <= 1, %如果模糊矩阵的指数小于等于1
error('The exponent should be greater than 1!');
end
end
%将options 中的分量分别赋值给四个变量;
expo = options(1); % 隶属度矩阵U的指数
max_iter = options(2); % 最大迭代次数
min_impro = options(3); % 隶属度最小变化量,迭代终止条件
display = options(4); % 每次迭代是否输出信息标志
obj_fcn = zeros(max_iter, 1); % 初始化输出参数obj_fcn
U = initfcm(cluster_n, data_n); % 初始化模糊分配矩阵,使U满足列上相加为1,
% Main loop 主要循环
for i = 1:max_iter,
%在第k步循环中改变聚类中心ceneter,和分配函数U的隶属度值;
[U, center, obj_fcn(i)] = stepfcm(data, U, cluster_n, expo);
if display,
fprintf('FCM:Iteration count = %d, obj. fcn = %f\n', i, obj_fcn(i));
end
% 终止条件判别
if i > 1,
if abs(obj_fcn(i) - obj_fcn(i-1)) < min_impro,
break;
end,
end
end
iter_n = i; % 实际迭代次数
obj_fcn(iter_n+1:max_iter) = [];
% 子函数
function U = initfcm(cluster_n, data_n)
% 初始化fcm的隶属度函数矩阵
% 输入:
% cluster_n ---- 聚类中心个数
% data_n ---- 样本点数
% 输出:
% U ---- 初始化的隶属度矩阵
U = rand(cluster_n, data_n);
col_sum = sum(U);
U = U./col_sum(ones(cluster_n, 1), :);
% 子函数
function [U_new, center, obj_fcn] = stepfcm(data, U, cluster_n, expo)
% 模糊C均值聚类时迭代的一步
% 输入:
% data ---- nxm矩阵,表示n个样本,每个样本具有m的维特征值
% U ---- 隶属度矩阵
% cluster_n ---- 标量,表示聚合中心数目,即类别数
% expo ---- 隶属度矩阵U的指数
% 输出:
% U_new ---- 迭代计算出的新的隶属度矩阵
% center ---- 迭代计算出的新的聚类中心
% obj_fcn ---- 目标函数值
mf = U.^expo; % 隶属度矩阵进行指数运算结果
center = mf*data./((ones(size(data, 2), 1)*sum(mf'))'); % 新聚类中心(5.4)式
dist = distfcm(center, data); % 计算距离矩阵
obj_fcn = sum(sum((dist.^2).*mf)); % 计算目标函数值 (5.1)式
tmp = dist.^(-2/(expo-1));
U_new = tmp./(ones(cluster_n, 1)*sum(tmp)); % 计算新的隶属度矩阵 (5.3)式
% 子函数
function out = distfcm(center, data)
% 计算样本点距离聚类中心的距离
% 输入:
% center ---- 聚类中心
% data ---- 样本点
% 输出:
% out ---- 距离
out = zeros(size(center, 1), size(data, 1));
for k = 1:size(center, 1), % 对每一个聚类中心
% 每一次循环求得所有样本点到一个聚类中心的距离
out(k, :) = sqrt(sum(((data-ones(size(data,1),1)*center(k,:)).^2)',1));
end
㈥ k均值聚类算法、c均值聚类算法、模糊的c均值聚类算法的区别
k均值聚类:---------一种硬聚类算法,隶属度只有两个取值0或1,提出的基本根据是“类内误差平方和最小化”准则;
模糊的c均值聚类算法:--------
一种模糊聚类算法,是k均值聚类算法的推广形式,隶属度取值为[0
1]区间内的任何一个数,提出的基本根据是“类内加权误差平方和最小化”准则;
这两个方法都是迭代求取最终的聚类划分,即聚类中心与隶属度值。两者都不能保证找到问题的最优解,都有可能收敛到局部极值,模糊c均值甚至可能是鞍点。
至于c均值似乎没有这么叫的,至少从我看到文献来看是没有。不必纠结于名称。如果你看的是某本模式识别的书,可能它想表达的意思就是k均值。
实际上k-means这个单词最先是好像在1965年的一篇文献提出来的,后来很多人把这种聚类叫做k均值。但是实际上十多年前就有了类似的算法,但是名字不一样,k均值的历史相当的复杂,在若干不同的领域都被单独提出。追寻算法的名称与历史没什么意义,明白具体的实现方法就好了。
㈦ C语言编从键盘输入十个数,计算其平均值,并将大于平均值的数输出
源代码如下:
#include <stdio.h>
int main()
{
int n, i;
float num[100], sum = 0.0, average;
printf("输入元素个数: ");
scanf("%d", &n);
while (n > 100 || n <= 0)
{
printf("Error! 数字需要在1 到 100 之间。 ");
printf("再次输入: ");
scanf("%d", &n);
}
for(i = 0; i < n; ++i)
{
printf("%d. 输入数字: ", i+1);
scanf("%f", &num[i]);
sum += num[i];
}
average = sum / n;
printf("平均值 = %.2f", average);
return 0;
}
(7)c均值算法扩展阅读
C语言自定义名字的要求
1、可以使用大小写字母、下划线、数字,但第一个字母必须是字母或者下划线。
2、字母区分大小写,BASIC语言不区分大小写。
㈧ k均值聚类算法、c均值聚类算法、模糊的c均值聚类算法的区别
k均值聚类:---------一种硬聚类算法,隶属度只有两个取值0或1,提出的基本根据是“类内误差平方和最小化”准则;
模糊的c均值聚类算法:-------- 一种模糊聚类算法,是k均值聚类算法的推广形式,隶属度取值为[0 1]区间内的任何一个数,提出的基本根据是“类内加权误差平方和最小化”准则;
这两个方法都是迭代求取最终的聚类划分,即聚类中心与隶属度值。两者都不能保证找到问题的最优解,都有可能收敛到局部极值,模糊c均值甚至可能是鞍点。
至于c均值似乎没有这么叫的,至少从我看到文献来看是没有。不必纠结于名称。如果你看的是某本模式识别的书,可能它想表达的意思就是k均值。
实际上k-means这个单词最先是好像在1965年的一篇文献提出来的,后来很多人把这种聚类叫做k均值。但是实际上十多年前就有了类似的算法,但是名字不一样,k均值的历史相当的复杂,在若干不同的领域都被单独提出。追寻算法的名称与历史没什么意义,明白具体的实现方法就好了。
㈨ k-均值聚类和c-均值聚类一样吗
不一样,K均值是严格分类,但是C均值就是模糊C他加入了自己的评判因素,比如一个人多高才算是高,还有好坏的评判,没有一定的标准。模糊C就算是模糊综合评判的样子