在matlab中怎么实现移相实现

35058人阅读
MATLAB(15)
Data Mining(25)
Machine Learning(47)
KMeans和KMedoid算法是聚类算法中比较普遍的方法,本文讲了其原理和matlab中实现的代码。1.目标:& & & &找出一个分割,使得距离平方和最小2.K-Means算法:& & & &1. 将数据分为k个非空子集& & & &2. 计算每个类中心点(k-means中用所有点的平均值,K-medoid用离该平均值最近的一个点)center& & & &3. 将每个object聚类到最近的center& & & &4. 返回2,当聚类结果不再变化的时候stop& &复杂度:& & & &O(kndt)& & & &-计算两点间距离:d& & & &-指定类:O(kn) & ,k是类数& & & &-迭代次数上限:t3.K-Medoids算法:& & & &1. 随机选择k个点作为初始medoid& & & &2.将每个object聚类到最近的medoid& & & &3. 更新每个类的medoid,计算objective function&& & & &4. 选择最佳参数& & & &4. 返回2,当各类medoid不再变化的时候stop& & 复杂度:& & & &O((n^2)d)& & & &-计算各点间两两距离O((n^2)d)& & & &-指定类:O(kn) & ,k是类数4.特点:& & & &-聚类结果与初始点有关(因为是做steepest descent from a random initial starting oint)& & & &-是局部最优解& & & &-在实际做的时候,随机选择多组初始点,最后选择拥有最低TSD(Total Squared Distance)的那组Kmeans KMedoid Implementation with matlab:===================下面是我用matlab上的实现:说明:fea为训练样本数据,gnd为样本标号。算法中的思想和上面写的一模一样,在最后的判断accuracy方面,由于聚类和分类不同,只是得到一些 cluster ,而并不知道这些 cluster 应该被打上什么标签,或者说。由于我们的目的是衡量聚类算法的 performance ,因此直接假定这一步能实现最优的对应关系,将每个 cluster 对应到一类上去。一种办法是枚举所有可能的情况并选出最优解,另外,对于这样的问题,我们还可以用
来求解。具体的Hungarian代码我放在了里,调用方法已经写在下面函数中了。下面给出Kmeans&Kmedoid主函数。Kmeans.m 函数:function [ accuracy,MIhat ] = KMeans( K,mode )
% Artificial Intelligence & Data Mining - KMeans & K-Medoids Clustering
% Author: Rachel Zhang @ ZJU
% CreateTime:
% Function: Clustering
-K: number of clusters
1: use kmeans cluster algorithm in matlab
2: k_medroid algorithm: use data points as k centers
3: k_means algorithm: use average as k centers
switch (mode)
case 1 %call system function KMeans
label = kmeans(fea,K);
[label,accuracy] = cal_accuracy(gnd,label);
case 2%use kmedroid method
for testcase = 1:10% do 10 times to get rid of the influence from Initial_center
K_center = Initial_center(fea,K); %select initial points randomly
changed_label = N_
label = zeros(1,N_samples);
iteration_times = 0;
while changed_label~=0
cls_label = cell(1,K);
for i = 1: N_samples
for j = 1 : K
D(j) = dis(fea(i,:),K_center(j,:));
[~,label(i)] = min(D);
cls_label{label(i)} = [cls_label{label(i)} i];
changed_label = 0;
cls_center = zeros(K,N_features);
for i = 1 : K
cls_center(i,:) = mean(fea(cls_label{i},:));
for j = 1:size(cls_label{i},2)%number of samples clsutered in i-th class
D1(j) = dis(cls_center(i,:),fea(cls_label{i}(j),:));
[~,min_ind] = min(D1);
if ~isequal(K_center(i,:),fea(cls_label{i}(min_ind),:))
K_center(i,:) = fea(cls_label{i}(min_ind),:);
changed_label = changed_label+1;
iteration_times = iteration_times+1;
[label,acc(testcase)] = cal_accuracy(gnd,label);
accuracy = max(acc);
case 3%use k-means method
for testcase = 1:10% do 10 times to get rid of the influence from Initial_center
K_center = Initial_center(fea,K); %select initial points randomly
changed_label = N_
label = zeros(1,N_samples);
label_new = zeros(1,N_samples);
while changed_label~=0
cls_label = cell(1,K);
changed_label = 0;
for i = 1: N_samples
for j = 1 : K
D(j) = dis(fea(i,:),K_center(j,:));
[~,label_new(i)] = min(D);
if(label_new(i)~=label(i))
changed_label = changed_label+1;
cls_label{label_new(i)} = [cls_label{label_new(i)} i];
label = label_
for i = 1 : K
%recalculate k centroid
K_center(i,:) = mean(fea(cls_label{i},:));
[label,acc(testcase)] = cal_accuracy(gnd,label);
accuracy = max(acc);
MIhat = MutualInfo(gnd,label);
function center = Initial_center(X,K)
rnd_Idx = randperm(N_samples,K);
center = X(rnd_Idx,:);
function res = dis(X1,X2)
res = norm(X1-X2);
function [res,acc] = cal_accuracy(gnd,estimate_label)
res = bestMap(gnd,estimate_label);
acc = length(find(gnd == res))/length(gnd);
实验结果分析:对上面得到的accuracy进行画图,横坐标为10个数据集,纵坐标为在其上进行聚类的准确率。其中,auto为matlab内部kmeans函数。画图:function [
] = Plot( A,B,C )
%PLOT Summary of this function goes here
Detailed explanation goes here
plot(k,A,'-r',k,B,'-b',k,C,'-g');
legend('auto','medoid','means');
结果:5类聚类:7类聚类:关于Machine Learning更多的学习资料与相关讨论将继续更新,敬请关注本博客和新浪微博。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5344060次
积分:44487
积分:44487
排名:第49名
原创:482篇
转载:36篇
评论:4294条
百度深度学习实验室RD,关注计算机视觉,机器学习,算法研究,人工智能, 移动互联网等学科和产业,希望结识更多同道中人。
新浪微博:
(1)(1)(1)(4)(3)(1)(7)(7)(2)(1)(1)(9)(1)(1)(5)(2)(1)(3)(4)(6)(6)(5)(4)(1)(1)(1)(6)(1)(2)(7)(6)(7)(11)(20)(12)(23)(29)(37)(37)(6)(24)(6)(1)(1)(2)(2)(1)(7)(23)(20)(32)(17)(5)(22)(58)(8)(8)Matlab实现文件读写的几种方法
Matlab实现文件读写的几种方法
Matlab有着强大的数据处理功能,经常需要从外部文件读取数据或将数据写到外部文件。Matlab和外部文件进行数据交换相关的命令,个人目前了解到的有以下几种。
load 从Matlab的数据文件.mat中读取变量数据,也可以从.txt .dat等文件中读取数据。使用load命令读取数据以后在Matlab中数据变量和文件同名。例如使用“load data.txt”后数据变量名即为data。
需要注意的是文件格式的不同,文件格式分为二进制格式和ASCII格式两种。如果是二进制格式的文件,可以使用load命令直接读取。但如果是ASCII格式的文件,需要保证数据是整齐的(每一行数据个数要一致),否则会出错。
data.txt文件(ASCII格式)
使用“load data.txt”将会出错。
data1.txt文件
使用“load data1.txt”能顺利读入3*3矩阵。
和load相对应的写数据命令为save,一般存为.mat文件,save保存的文件格式为二进制格式。
二进制和ASCII的区别
从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种。 ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,数5678的存储形式为: ASC码:) & ) & ) ) 共占用4个字节。ASCII码文件可在屏幕上按字符显示, 例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。由于是按字符显示,因此能读懂文件内容。 二进制文件是按二进制的编码方式来存放文件的。例如,数5678的存储形式为:01110 (十进制5678转换成二进制)只占二个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。因此也把这种文件称作“流式文件”。
(2)importdata
importdata根据文件名将数据导入到Matlab工作区。可以导入文件类型有很多,.txt .wav 等等。导入的数据(包括字符串和数值)以结构形式存放在工作区,可以使用whos命令来查看工作区的数据。
importdata可以导入load不能读取的长短不一的ASCII文件。当文件中既包含字符串又包含数值,而且数值长度个数不一时,可以使用importdata命令。注意读取的数值矩阵列数以文件中数值第一行的列数为标准。
例 test.txt
This is a test.Start0 1 21 21 2 3 4
运行A=importdata('test.txt')
&&&&&&& data: [4x3 double]&&& textdata: {2x1 cell}
&&&& 0&&&& 1&&&& 2&&&& 1&&&& 2&& NaN&&&& 1&&&& 2&&&& 3&&&& 4&& NaN&& NaN
A.textdata =
&&& 'This is a test.'&&& 'Start'
另外,读取的字符串只能位于数值之前,位于数值之后的将被忽略。
例:test.txt
0 1 21 21 2 3 4End.
运行A=importdata('test.txt')
&&&& 0&&&& 1&&&& 2&&&& 1&&&& 2&& NaN&&&& 1&&&& 2&&&& 3&&&& 4&& NaN&& NaN
除了importdata命令以外,还可以从菜单选项file--&import data...导入数据文件,效果和importdata命令一样。
(3)fopen
fopen打开一个文件并创建文件标识以供接下来的读写等操作。fopen命令本身不进行读操作。然后可以使用fscanf读取数据,根据需要对数据进行筛选编辑。
例:读取字符串的方法
0 1 21 2 31 2 3End.
fid=fopen('data.txt');&&&&%打开文件,创建文件标识
A=fscanf(A,'%c');&&&&&&&&&%读取数据
fclose(fid);&&&&&&&&&&&&&&%关闭文件标识
i=findstr(A,'End');&&&&&&&%查找标识
B=A(1:i-3);&&&&&&&&&&&&&& %提取数据,换行为2个字符
C=str2num(B);&&&&&&&&&&&& %将数据转换成数值矩阵
注意其中str2num同样需要保证数值矩阵中列数一致,如果不一致,则结果为空。
0 1 21 21 2 3End.
例:读取行的方法
fid1=fopen('data.txt');fid2=fopen('numbers.txt','w');while ~feof(fid1)&&& aline=fgetl(fid1);&&& if double(aline(1))&=48&&double(aline(1))&=57&&&&&&& fprintf(fid2,'%s\n',aline);&&&&&&& continue&&& endend
fclose(fid1);fclose(fid2);
numbers.txt即为按行保存的数值文件
发表评论:
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&【原创】排列组合问题在MATLAB中的实现方法_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
【原创】排列组合问题在MATLAB中的实现方法
上传于||文档简介
&&排​列​组​合​问​题​在​M​A​T​L​A​B​中​的​实​现​方​法
大小:3.36KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢下次自动登录
现在的位置:
& 综合 & 正文
自相关与互相关在matlab中实现
1. 首先说说自相关和互相关的概念。
这个是信号分析里的概念,他们分别表示的是两个时间序列之间和同一个时间序列在任意两个不同时刻的取值之间的相关程度,即互相关函数是描述随机信号x(t),y(t)在任意两个不同时刻t1,t2的取值之间的相关程度,自相关函数是描述随机信号x(t)在任意两个不同时刻t1,t2的取值之间的相关程度。
自相关函数是描述随机信号X(t)在任意两个不同时刻t1,t2的取值之间的相关程度;互相关函数给出了在频域内两个信号是否相关的一个判断指标,把两测点之间信号的互谱与各自的自谱联系了起来。它能用来确定输出信号有多大程度来自输入信号,对修正测量中接入噪声源而产生的误差非常有效.
事实上,在图象处理中,自相关和互相关函数的定义如下:设原函数是f(t),则自相关函数定义为R(u)=f(t)*f(-t),其中*表示卷积;设两个函数分别是f(t)和g(t),则互相关函数定义为R(u)=f(t)*g(-t),它反映的是两个函数在不同的相对位置上互相匹配的程度。
那么,如何在matlab中实现这两个相关并用图像显示出来呢?
dt=.1;t=[0:dt:100];x=cos(t);[a,b]=xcorr(x,'unbiased');plot(b*dt,a)上面是求自相关函数并作图,对于互相关函数,稍微修改一下就可以了,即把[a,b]=xcorr(x,'unbiased');改为[a,b]=xcorr(x,y,'unbiased');便可。2. 实现过程:
在Matalb中,求解xcorr的过程事实上是利用Fourier变换中的卷积定理进行的,即R(u)=ifft(fft(f)×fft(g)),其中×表示乘法,注:此公式仅表示形式计算,并非实际计算所用的公式。当然也可以直接采用卷积进行计算,但是结果会与xcorr的不同。事实上,两者既然有定理保证,那么结果一定是相同的,只是没有用对公式而已。下面是检验两者结果相同的代码:dt=.1;t=[0:dt:100];x=3*sin(t);y=cos(3*t);subplot(3,1,1);plot(t,x);subplot(3,1,2);plot(t,y);[a,b]=xcorr(x,y);subplot(3,1,3);plot(b*dt,a);yy=cos(3*fliplr(t)); % or use: yy=fliplr(y);z=conv(x,yy);subplot(3,1,3);plot(b*dt,z,'r');即在xcorr中不使用scaling。
3. 其他相关问题:(1)相关程度与相关函数的取值有什么联系?
相关系数只是一个比率,不是等单位量度,无什么单位名称,也不是相关的百分数,一般取小数点后两位来表示。相关系数的正负号只表示相关的方向,绝对值表示相关的程度。因为不是等单位的度量,因而不能说相关系数0.7是0.35两倍,只能说相关系数为0.7的二列变量相关程度比相关系数为0.35的二列变量相关程度更为密切和更高。也不能说相关系数从0.70到0.80与相关系数从0.30到0.40增加的程度一样大。对于相关系数的大小所表示的意义目前在统计学界尚不一致,但通常是这样认为的:相关系数
相关程度0.00-±0.30
微相关±0.30-±0.50
实相关±0.50-±0.80
显著相关±0.80-±1.00
(2)matlab计算自相关函数autocorr和xcorr有什么不一样的?
分别用这两个函数对同一个序列计算,为什么结果不太一样?因为xcorr是没有将均值减掉做的相关,autocorr则是减掉了均值的。而且,用离散信号做自相关时,信号截取长度(采样点N)不一样,自相关函数就不一样。(3)xcorr是计算互相关函数,带有一个option的参数:a=xcorr(x,y,'option')option=baised时,是计算互相关函数的有偏估计;option=unbaised时,是计算互相关函数的无偏估计;option=coeff时,是计算归一化的互相关函数,即为互相关系数,在-1至1之间;option=none,是缺省的情况。所以想要计算互相关系数,可用'coeff'参数。 *************************************************************************用这个xcorr函数作离散互相关运算时要注意,当x, y是不等长向量时,短的向量会自动填0与长的对齐,运算结果是行向量还是列向量就与x一样。互相关运算计算的是x,y两组随机数据的相关程度,使用参数coeff时,结果就是互相关系数,在-1至1之间,否则结果不一定在这范围,有可能很大也有可能很小,这视乎x, y数据的大小,所以一般要计算两组数据的相关程度,一般选择coeff参数,对结果进行归一化。所谓归一化简单理解就是将数据系列缩放到-1到1范围,正式的就是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。变换式为X=(X实测--Xmin)/(Xmax-Xmin)。一般来说选择归一化进行互相关运算后,得到结果绝对值越大,两组数据相关程度就越高。
&&&&推荐文章:
【上篇】【下篇】&&&&Matlab中谱方法的实现
&Matlab中谱方法的实现
谱方法国外经典教程,在Matlab中实现,加速计算运行
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
Q.为什么我点的下载下不了,但积分却被扣了
A. 由于下载人数众多,下载服务器做了并发的限制。若发现下载不了,请稍后再试,多次下载是不会重复扣分的。
Q.我的积分不多了,如何获取积分?
A. 获得积分,详细见。
完成任务获取积分。
论坛可用分兑换下载积分。
第一次绑定手机,将获得5个C币,C币可。
关注并绑定CSDNID,送10个下载分
下载资源意味着您已经同意遵守以下协议
资源的所有权益归上传用户所有
未经权益所有人同意,不得将资源中的内容挪作商业或盈利用途
CSDN下载频道仅提供交流平台,并不能对任何下载资源负责
下载资源中如有侵权或不适当内容,
本站不保证本站提供的资源的准确性,安全性和完整性,同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
课程资源下载排行
您当前C币:0&&&可兑换 0 下载积分
兑换下载分:&
消耗C币:0&
立即兑换&&
兑换成功你当前的下载分为 。前去下载资源
你下载资源过于频繁,请输入验证码
如何快速获得积分?
你已经下载过该资源,再次下载不需要扣除积分
Matlab中谱方法的实现
所需积分:5
剩余积分:0
扫描微信二维码精彩活动、课程更新抢先知
VIP会员,免积分下载
会员到期时间:日
剩余下载次数:1000
Matlab中谱方法的实现
剩余次数:&&&&有效期截止到:
你还不是VIP会员VIP会员享免积分 . 专属通道极速下载
VIP下载次数已满VIP会员享免积分 . 专属通道极速下载,请继续开通VIP会员
你的VIP会员已过期VIP会员享免积分 . 专属通道极速下载,请继续开通VIP会员}

我要回帖

更多关于 matlab实现傅里叶变换 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信