DEAP数据集是一个基于主要基于脑电信号的可用于做情绪分析的数据集。数据集是由data和label两类数据组成的。data的结构是40*40*8064(刺激* 通道*数据),值得说明的是通道中只有前32个通道是脑电信号。label的结构是40*40*4,前两个40分别是刺激源和通道,后一个4是valence,arousal,dominance,liking。

我在data数据中选择了前22个人的全部40种刺激的32个脑电通道数据,label数据中,提取前22个人的全部40种刺激对应的vlaence和arousal的label,并且依据V_A两维高低的两两组合,以4为阀值,将其分成四个类。

下面介绍我使用的K-means算法。
设原始数据为{x1,x2,…,xn},四类的中心位置是{u1,u2,u3,u4},xn和uk都是向量。

迭代公式是:

公式一:求出所有数据和初始化的随机数据的距离,然后找出距离每个初始数据最近的数据。在我的算法中,距离的定义是对应项作差后取绝对值求和。
ci=argminj∥∥xi−uj∥∥{c}^{i}={\arg\min}_{j} \begin{Vmatrix} {x}^{i}-{u}_{j} \end{Vmatrix}

公式二:求出所有和这个初始数据最近原始数据的距离的均值。
uj=∑i=1m(ci=j)xi∑i=1m(ci=j){u}_{j} = \frac{\sum_{m}^{i=1}\left({c}^{i}=j \right){x}^{i}}{\sum_{m}^{i=1}\left({c}^{i}=j \right)}

迭代结束是按次数来的

下面是源码

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%                                     %%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%    使用DEAP基于K-means的情感计算     %%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%                                     %%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%clear all;
close all;
clc;% % % %载入数据
raw(1) = load('s01.mat');
raw(2) = load('s02.mat');
raw(3) = load('s03.mat');
raw(4) = load('s04.mat');
raw(5) = load('s05.mat');
raw(6) = load('s06.mat');
raw(7) = load('s07.mat');
raw(8) = load('s08.mat');
raw(9) = load('s09.mat');
raw(10) = load('s10.mat');
raw(11) = load('s11.mat');
raw(12) = load('s12.mat');
raw(13) = load('s13.mat');
raw(14) = load('s14.mat');
raw(15) = load('s15.mat');
raw(16) = load('s16.mat');
raw(17) = load('s17.mat');
raw(18) = load('s18.mat');
raw(19) = load('s19.mat');
raw(20) = load('s20.mat');
raw(21) = load('s21.mat');
raw(22) = load('s22.mat');% % %对标签进行处理
lab = [];
for i = 1:22for j = 1:40if raw(i).labels(j,1) >= 4 && raw(i).labels(j,2) >= 4lab = [lab;1];elseif raw(i).labels(j,1) >= 4 && raw(i).labels(j,2) < 4lab = [lab;2];elseif raw(i).labels(j,1) < 4 && raw(i).labels(j,2) < 4lab = [lab;3];elselab = [lab;4];endend
enddlmwrite('label.txt',lab,'delimiter','\n');% % %对数据整形进行处理
data = [];
for i = 1:22for j = 1:40for k = 1:32pre(k,:) = raw(i).data(j,k,:);end[sx sy] = size(pre);xy = sx * sy;data = [data;reshape(pre,1,xy)];end
end[m n]=size(data);% % %k-means聚类
[u re]=KMeans(data,4);
[m n]=size(re);dlmwrite('KM.txt',re,'delimiter','\t');% % %判断对错
sxy = xy + 1;
right = zeros(1,24);
wrong = zeros(1,24);ji = 1;for z = 1:4for x = 1:4for c = 1:4for v = 1:4if z == x || z == c || z == v || x == c || x == v || c == vcontinue;elsefor i = 1:mif (re(i,sxy) == 1 && lab(i) == z) || (re(i,sxy) == 2 && lab(i) == x) || (re(i,sxy) == 3 && lab(i) == c) || (re(i,sxy) == 4 && lab(i) == v)right(ji) = right(ji) + 1;elsewrong(ji) = wrong(ji) + 1;endendji = ji + 1;endendendend
enddlmwrite('right.txt',right,'delimiter','\n');
dlmwrite('wrong.txt',wrong,'delimiter','\n');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%                                     %%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%               K-means               %%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%                                     %%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%N是数据一共分多少类
%data是输入的不带分类标号的数据
%u是每一类的中心
%re是返回的带分类标号的数据function [u re]=KMeans(data,N)%%%数据相关信息获取[m n]=size(data);   %m是数据个数,n是数据维数ma=zeros(n,1);        %每一维最大的数mi=zeros(n,1);        %每一维最小的数u=zeros(N,n);       %随机初始化,最终迭代到每一类的中心位置for i = 1:nma(i)=max(data(:,i));   mi(i)=min(data(:,i));    end%%%为保证初始随机点不是太糟糕count = 0;quan = zeros(m,N);while sum(quan(:,1)) == 0 || sum(quan(:,2)) == 0 || sum(quan(:,3)) == 0 || sum(quan(:,4)) == 0for i=1:nfor j=1:Nu(j,i)=ma(i)+(mi(i)-ma(i))*rand();  %随机初始化end      endfor i=1:Ntmp{i}=[];      for j=1:mtmp{i}=[tmp{i};data(j,:)-u(i,:)];endendfor i=1:m        c=[];for j=1:Nc=[c sum(abs(tmp{j}(i,:)))];end[junk index]=min(c);quan(i,index)=sum(abs(tmp{index}(i,:)));endcountcount = count + 1;for i = 1:4sum(quan(:,i))endendloop = 1;while 1pre_u=u;            for i=1:Ntmp{i}=[];     for j=1:mtmp{i}=[tmp{i};data(j,:)-u(i,:)];endend%%%公式一的实现quan = zeros(m,N);for i=1:m        c=[];for j=1:Nc=[c sum(abs(tmp{j}(i,:)))]; %两种距离定义方式
%                 c=[c norm(tmp{j}(i,:))];end[junk index]=min(c);quan(i,index)=sum(abs(tmp{index}(i,:)));
%             quan(i,index)=norm(tmp{index}(i,:)); end              %%%公式二的实现for i=1:N            for j=1:nu(i,j)=sum(quan(:,i).*data(:,j))/(sum(quan(:,i) + eps));end           endlooploop = loop + 1;for i = 1:4u(i)endif loop > 0 break;endendre=[];for i=1:mtmp=[];for j=1:Ntmp=[tmp norm(data(i,:)-u(j,:))];end[junk index]=min(tmp);re=[re;data(i,:) index];endend

跑完下来总结:
在代码编写技巧方面:
1、在Matlab中,有分母存在时,在分母项加上eps。
2、在代码中要让中间结果,和迭代进度输出,以备及时发现问题,避免浪费时间。

在算法评估方面:
1、如果以准确率作为评价标准,那么这次的准确率在54%,值得高兴。但是如果仔细分析这个结果会发现并不乐观,因为其错分率在46%,原因如下。
原来880个数据样本在4类数据的分布是:464,161,78,171;
而K-means跑下来给出的4类数据的分布是:875,2,1,2;
因为K-means只是按照距离分四类,而不是按照V_A两维高低来分四类,因此如果按照最佳的准确率的配对,则是上述结果。其实也最有可能是是上述结果。原因在于数据源本身不平衡,而现在所有的统计学习方法中对解决数据不平衡问题尚无很好的方法,可能解决这个问题的比较火热的方法是强化学习和对抗生成网络。
2、在本次实验中,所用的距离的定义可以继续考究。在本次实验中我所使用的是最为简单的,可以说是欧式距离的方法,甚至由于一开始发现如果对距离取平方再开放,那么在258048维的数据的背景下,数据量太大了。所以后来改用作差取绝对值求和。在这一点上可以考虑一下降维后再做处理。而在降维的方法中,我觉得可以考虑流型的降维方法。
3、因为这个代码前后跑了五次,前后跑了两个星期,除了由于我自己之前没有让输出中间过程与迭代进度导致我没有及时发现算法有问题而浪费了时间之外,算法本身也存在几个问题值得总结教训,
a.首先是初始点的选取,初始点的选取真的是极其重要,首先是点不能全数域取,而是要在各维的最值范围内取值,其次是要检验初始的四个点是不是都有属于各自的最近点。因为,我发现随机取四点,设为a,b,c,d,很可能发生在880个点中没有1个点距离d点最近,那么在后面的迭代中就会导致分母为零的情况发生(这也是我前面总结分母项要加上eps的原因),如果不及时制止就会导致这次的运算结果无效的后果。
而会导致这个这个原因我推测有两个方面,一个是由于数据集本身不平衡导致的,另一个可能是由于我按V_A高低组合分成四类不是很合理导致,当然这两个方面的原因也有相互交合的地方。
b.我所选取的这个数据体量在我的i5-3470(3.2GHZ),16G内存的配置下跑得并不快,24个小时大体上能迭代30次左右。而后来我发现,其实迭代10次之后,就没有变化不大了。

使用DEAP基于K-means的情感计算相关推荐

  1. 上海交大情感脑电数据集(SJTU Emotion EEG Dataset,SEED)+权学良(生理信号情感计算综述)

    一.SEED数据集   二.论文阅读 题目:基于生理信号的情感计算研究综述-权学良 情绪分类:离散型情绪和连续性情绪:离散性情绪就是具体的几类: 1.生气.讨厌.害怕.高兴.悲伤和惊讶等 6 种基本情 ...

  2. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  3. 情感计算-基于肢体动作和生理信号的情感识别

    基于肢体动作的情感识别 面部表情+ 肢体动作(更多的与表情.声音特征相结合进行识别),识别细微的情感 背景与研究现状 没有面部表情贡献那么大,辅助面部表情进行分析. 肢体动作的情感表现 肢体动作包含: ...

  4. 基于K-Means的文本聚类

    何为聚类 "聚类是把相似的对象通过静态分类的方法分成不同的组别或者更多的子集(subset),这样让在同一个子集中的成员对象都有相似的一些属性."                 ...

  5. 综述 | 基于脑电图信号的情感识别研究

    文章来源于微信公众号(茗创科技),欢迎有兴趣的朋友搜索关注. 情感在我们的日常生活中扮演着重要的角色,不仅体现在人际交往中,在决策过程中,也在我们对周围世界的感知中.由于最近学术界非常关注人机交互尤其 ...

  6. 脑电信号在情感计算中应用

    情绪是对一系列主观认知经验的通称,包括人对外界刺激或自身刺激的心理反应并伴随着生理反应.情绪对人际关系的建立和维持.认知.决策.工作效率等互动活动具有直接影响.许多疾病如抑郁症.自闭症.游戏成瘾.阿尔 ...

  7. 综述:基于深度学习的情感分析

    近年来,深度学习有了突破性发展,NLP 领域里的情感分析任务逐渐引入了这种方法,并形成了很多业内最佳结果.本文中,来自领英与伊利诺伊大学芝加哥分校的研究人员对基于深度学习的情感分析研究进行了详细论述. ...

  8. 基于AdaBoost算法的情感分析研究

    源码下载 http://www.byamd.xyz/hui-zong-1/ 基于AdaBoost算法的情感分析研究 摘 要 随着互联网的快速发展,各类社交媒体平台如微信.QQ等也与日俱增,而微博更是集 ...

  9. 基于Transformer的文本情感分析编程实践(Encoder编码器-Decoder解码器框架 + Attention注意力机制 + Positional Encoding位置编码)

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) Encoder编码器-Decoder解码器框架 + Atten ...

最新文章

  1. Maven一:maven的下载和环境安装以及创建简单的Maven项目
  2. 如何利用《C++ Primer》学习C++?
  3. 一个文件下载的工具类
  4. .NET Core快速入门教程 5、使用VS Code进行C#代码调试的技巧
  5. 扒一扒TCP协议与UDP协议
  6. m031开发 新唐_M031
  7. 从零开始编写深度学习库(一)SoftmaxWithLoss CPU编写
  8. Java计算两日期相差天数源码
  9. vue组件化开发实践
  10. 系统搜索资源就停止服务器,SQL Server (MSSQLSERVER) 服务启动不了,系统日志显示由于下列服务特定错误而终止: 找不到映像文件中指定的资源名。...
  11. html css js介绍ppt,HTML+CSS+JS-入门基础.ppt
  12. 计算机查找dll文件,怎么查看进程正在调用哪些DLL文件
  13. 病毒分析之中华吸血鬼
  14. Postgresql数据库介绍15——客户端认证
  15. 计算机网络技术广告,屏蔽QQ广告和迷你首页广告
  16. no default constructor found either
  17. Cuckoo Sandbox
  18. JAVA工程师个人职业规划
  19. SQL难学吗,有什么好的学习建议?(转载)
  20. CS144课程实验详解-lab0-第一部分

热门文章

  1. java qq聊天界面代码,Java简易qq聊天,代码
  2. 北航计算机在职研究生定向,北航软件学院首招人工智能方向研究生
  3. 《数据挖掘导论》- 读书笔记(2)- 绪论
  4. 【转】openWRT摄像头选购
  5. Python爬取微博的评论人的微博网址
  6. Word2003入门动画教程49:巧用Word中的选择性粘贴功能
  7. 数控降压电源模块DCDC| 5A,LCD显示
  8. matlab 仿真风速,基于Matlab的组合风速建模与仿真
  9. 自考生计算机考研经验,自考生考研失利之后的4条出路
  10. 新车电商百花争鸣时代:毛豆新车VS花生好车谁长谁短?