DM&ML_note.7-神经网络聚类算法:SOM

这个学期要学DM&ML,用的是《数据挖掘算法原理与实现》王振武 本着造福同学的思想,开一个DM&ML的笔记系列,打算给书上的源代码添加一点注释,方便阅读和理解


前置知识要求

C++

SOM网络设计

注意,请仔细看这一部分的设计,这里写的是源码的相关参数,书上P191写的是例子的参数,有所不同。
1.输入层结点数:样本维度=7*5
2.输出层结点数:取96个神经元构成8*12的二维平面阵。
3.权值初始化:随机归一化小数
4.领域半径:

r(t+1)=r(t)*(1-当前迭代数n/总迭代数N),t>1
r(t)=Max_size of outputLayer,t=1

5.学习率:

a(t+1)=a(t)*(1-当前迭代数n/总迭代数N),t>1
a(t)=default efficiency,t=1

具体实现

#include <fstream>
#include <string>
#include <iomanip>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
using namespace std;/*hiro:忘记声明命名空间*/

#define InputLayerNum 35
#define OutputLayerRow 8
#define OutputLayerColumn 12
#define total_iteration_Num 1000000//10000//80//100//1000
#define error_limit 0.0000000000008//0.1//0.0000000000008//0.000000000000008//0.0001
#define efficiency 0.9//0.3//0.9//0.3//0.9
#define is_win  true
/*hiro:添加全局的字符-下标转换数组,真是的,该全局的不全局,,,写函数也好啊。。。*/
const string character = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

/*hiro:写在前面,我真的想不懂为何一堆应该局部的变量写全局,,偷懒也不是这么偷的啊。。。
而且该全局可以偷懒的又不写,,*/
int i,j,k,l,m,n;
int inputMode[26][7][5];

/*hiro:↓↓修改了原本不友好的写法*/
double weight[OutputLayerRow][OutputLayerColumn][InputLayerNum];

/*hiro:记录迭代次数*/
int current_iteration_num=0;
/*hiro:当前学习效率*/
double study_efficiency=efficiency;

/*hiro:↓↓修改了原本不友好的写法*/
/*hiro:这个变量的名字应该和一些库文件里的声明冲突了,遂更改为my_distance*/
long double my_distance[OutputLayerRow][OutputLayerColumn];

/*hiro:保存了当前时刻的结点影响范围*/
int neighbor_width=OutputLayerColumn;
int neighbor_height=OutputLayerRow;

/*hiro:姑且是保存了所有获胜节点的下标,但是并没有用上
后面它又通过遍历的方法来获取获胜结点的下标。。*/
int row[OutputLayerRow], column[OutputLayerColumn];

/*hiro:改为bool 型更符合语意,保存了该下标是否为获胜节点*/
bool flag[OutputLayerRow][OutputLayerColumn];

int temp_row,temp_column;
int winner_row,winner_column;
long double min_distance=1000.0;


/****************************************************************/
//该函数初始化距离变量为0,初始化保存胜出节点的位置的变量
/****************************************************************/
void init_distance()
{
    for(i=0;i<OutputLayerRow;i++)
        for(j=0;j<OutputLayerColumn;j++)
            my_distance[i][j]=0.0;
 }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
k-means聚类算法是一种常用的无监督学习算法,用于将数据集划分为k个不同的簇。其参数包括k和max_iterations。 k代表聚类的数目,即要将数据集划分为多少个簇。在使用k-means算法之前,需要明确需要将数据划分为多少个簇。选择合适的簇数是一项重要任务,它直接影响到算法的性能和结果的准确性。根据实际问题的要求和数据的特征,可以通过调参或者利用先验知识来确定k的值。常用的确定簇数的方法有手肘法、轮廓系数和gap statistic等。 max_iterations是算法的最大迭代次数。k-means算法通过迭代的方式不断优化簇中心的位置,以获得更好的聚类效果。每一次迭代中,算法会计算每个样本点与各个簇中心的距离,将样本点划分到距离最近的簇中心所对应的簇中,并更新簇中心的位置。迭代直到达到最大迭代次数或者满足了早停条件,即簇中心的位置不再改变。 k-means算法的过程可以简述为以下几个步骤: 1. 随机选择k个样本作为初始的簇中心。 2. 计算每个样本点与各个簇中心的距离,将样本点划分到距离最近的簇中心对应的簇中。 3. 更新簇中心的位置,取簇中所有样本点的均值作为新的簇中心。 4. 重复步骤2和3,直到达到最大迭代次数或者满足早停条件。 5. 返回最后的簇划分结果。 总之,k-means聚类算法通过定义k个簇中心并迭代优化簇中心的位置,将数据集划分为k个不同的簇。通过调整k和最大迭代次数,可以控制聚类的精细度和算法的运行时间。它是一种简单而高效的聚类算法,在各个领域都有广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值