一种基于Mercer核函数的聚类算法

来源:互联网 发布:自学日语软件 编辑:程序博客网 时间:2024/06/05 02:52

 

传统的特点和本算法的特色

传统的C-均值聚类算法,没有对样本特征进行优化,直接利用样本惊醒聚类,这样上述的这些方法的有效性很大程度的取决于样本的分布。

 

 

距离的选择

我们假定样本x被非线性函数der(x)映射到高维特征空间,那么,我的的欧几里得距离有:

distence(x,y) = sqrt( len( der(x) - der(y) ) ) = sqrt(der(x)*der(x) + der(y)*der(y) - 2*der(x)*der(y))

显然,如果我门令K(x_i,x_j) =der(x_i) .* der(x_y)的话,那么有:

distence(x,y) = sqrt( K(x,x) - 2*K(x,y) +K(y,y) );

 

这样我们就把非线性函数映射der为K(二元标量函数)了。

 

K函数的选择

这个部分理论比较深,我就简单给出几个好用的例子:

(1)多项式核函数:K(x,y) = (x.*y + 1)^d ;d为整数。

(1)高斯核函数:K(x,y) = exp(-a * len(x - y)); a>0。

(1)两层神经网络核函数:K(x,y) = tanh(-b(x.*y) - c) 。

 

聚类算法

(1)确定类别数 num_class;

(2)确定初始化聚类中心center[k][i],第i类的第k次迭代中心,i = 1...num_sample;

(3)确定从属矩阵,matrix_class[j][i] 第j个样本是否在第i类中。

(4)修改核函数矩阵。

avg_dis_between_center_sample(i:center) = sum_j_from_to(1,num_sample,matrix_class[j][i]*K(x_i,x_j))/sum_j_from_to(1,num_sample,matrix_class[j][i]);

 

avg_is_between_sample_sample(i:center) = sum_i_from_to(1,num_sample,sum_j_from_to(1,num_sample,matrix_class[j][i]*K(x_i,x_j)))/(sum(1,num_sample,matrix[j][i]))^2;

 

(5)计算误差:

一个类在数轴上:————————A——B————C——————>

对于一个类:A为现在的样本样本距离,B为现在的样本类内距离,C为上一次的样本样本距离。

 

所以误差为:e_i = avg_is_between_sample_sample(i,k+1) - avg_dis_between_center_sample(i,k) + avg_dis_between_center_sample(i.k) - avg_is_between_sample_sample(i,k)

 

k为时代数。

 

之总的误差为: e = sum(e_i);

(6)如果总的误差 e < Emax 则结束,否在转到3.

 

       聚类的结果,很显然的在matrix_class中。

 

 

代码

以后补充,这个写的很详细了,你可以自己实现以下。

原创粉丝点击