网站性能容量的收集与分析怎么做,图片生成器在线,餐饮网站建设设计,查天眼企业目录
matlab代码kmeans
matlab代码kmeans MNIST DATABASE下载网址: http://yann.lecun.com/exdb/mnist/ 聚类
将物理或抽象对象的集合分成由类似特征组成的多个类的过程称为聚类(clustering)。
对于给定N个n维向量x1#xff0c;…#xff0c;xN∈Rn#xff0c;聚类的目标…目录
matlab代码kmeans
matlab代码kmeans MNIST DATABASE下载网址: http://yann.lecun.com/exdb/mnist/ 聚类
将物理或抽象对象的集合分成由类似特征组成的多个类的过程称为聚类(clustering)。
对于给定N个n维向量x1…xN∈Rn聚类的目标就是将这N个n维向量分成k个集合尽量使得同一个集合中的向量彼此接近如图2所示。 图2 聚类示意效果图 K-means聚类算法迭代过程
首先初始化聚类中心如图3所示。 图3 k-means初始聚类中心
然后计算每个点到k个聚类中心的聚类并将其分配到最近的聚类中心所在的聚类中重新计算每个聚类现在的质心并以其作为新的聚类中心如图4所示。 图4 k-means迭代1次
重复迭代直到达到给定的迭代次数或k个聚类中心的变化值小于某个阈值形成最终的聚类结果如图5所示。 图5 k-means最终聚类效果 K均值聚类算法的复杂度分析
初始化选择K个初始聚类中心。这个步骤的时间复杂度为O(K)。
分配对每个样本点计算其与每个聚类中心的距离并将其分配到距离最近的聚类中心所代表的簇。这个步骤的时间复杂度为O(N * K * d)其中N是样本数d是特征数。
更新对每个簇计算其所有样本点的平均值作为新的聚类中心。这个步骤的时间复杂度为O(N * K * d)。
重复执行第2和第3步直到满足停止条件例如达到最大迭代次数或聚类中心变化小于一定阈值。
因此K均值聚类算法的总体时间复杂度主要由分配和更新两个步骤决定为O(T * N * K * d)其中T是迭代次数。
K-means手写数字聚类
用kmeas聚类算法对train_images.mat的前100张和前1000张手写数字图像进行聚类重复测试10次每次测试的正确率如图6所示其中100张的平均正确率为59%最高正确率为66%平均运行时间为0.1秒1000张的平均正确率为55%最高正确率为62%平均运行时间为3.6秒。 图6 K-means聚类结果
再对train_images.mat的前100张、500张、1000张、2000张和4000张手写数字图像进行聚类每种图像张数重复测试10次计算平均正确率和平均运行时间结果如表1所示。
表1 K-means聚类测试 由表1可知K-means手写数字聚类在图像数目达到4000张的时候运行时间达到了41秒而且平均正确率为60%左右。
K-means性能分析
由结果可以很明显地看出K-means聚类应用在手写数字上的效果并不是很好平均正确率只有60%左右其中有几个原因。一是K-means假设各个簇的大小、形状和密度相似如果数据集中的簇具有类似的分布特征K-means能够产生较好的聚类结果而手写数字数据集的数字并不是均匀分布的不同的数字可能出现频率不同而且手写数字的形状有的区别不大二是K-means在处理高维数据时可能会遇到困难因为高维空间下的距离计算和聚类结果评估会变得复杂而实验中手写数字的维度达到了784。
K-means
K-means聚类算法的一大缺点是初始类别中心的选择对聚类迭代的次数影响很大而K-means是想通过选择更好初始类别中心来减少K-means聚类的迭代次数。
那么什么样的初始类别中心是更好的呢
好的初始类别中心应该能够均匀地覆盖整个数据空间能够代表数据集中的不同特征。
K-means算法流程
从数据点中随机选择一个点作为第一个聚类中心。对于每个数据点计算它与当前已选择的聚类中心的距离选择与已选择的聚类中心距离最大的数据点作为下一个聚类中心。重复步骤②直到选择出k个初始聚类中心。
K-means手写数字聚类
用kmeas聚类算法对train_images.mat的前100张和前1000张手写数字图像进行聚类重复测试10次每次测试的正确率如图7所示其中100张的平均正确率为58%最高正确率达到了63%平均运行时间为0.03秒1000张的平均正确率为57%最高正确率为61%平均运行时间为0.76秒。 图7 K-means聚类结果
我们再对train_images.mat的前100张、1000张、2000张、4000张和8000张手写数字图像进行聚类每种图像张数重复测试10次计算平均正确率和平均运行时间结果如表2所示。
表2 K-means聚类测试 由表2可知K-means手写数字聚类在图像数目达到8000张的时候运行时间达到了15秒而且平均正确率均高于50%。
K-means性能分析
由结果可以很明显地看出相比K-means的聚类结果K-means的正确率差别不大基本上也是在60%左右但是程序运行时间极大的减少了这说明K-means的优化即选择更好的初始类别中心可以大大的减少算法迭代的过程迅速聚类。
但是由于K-means只是为K-means聚类选择更好的初始化中心这只是减少了聚类的迭代次数并不能解决K-means聚类手写数字效果不好的问题。
matlab代码kmeans
clc,clear;
load ./train_images.mat;
load ./train_labels.mat;
k10;
dimension2;
Dimension28*28;
picturesNumber1000;
sampletrain_images(:,:,1:picturesNumber);
samplereshape(sample,28*28,picturesNumber);
samplesample;
classzeros(1,picturesNumber);
times[];
ratios[];
for time1:10tic;classCentersample(randperm(picturesNumber,k),:); % 随机取点iterator0;while(true)iteratoriterator1;nextCenterzeros(k,Dimension);classNumberzeros(1,k);for i1:picturesNumberdistanceszeros(1,k);for j1:kdistances(j)pdist2(sample(i,:),classCenter(j,:));end[~,index]sort(distances);class(i)index(1);classNumber(class(i))classNumber(class(i))1;nextCenter(class(i),:)nextCenter(class(i),:)sample(i,:);endtempclassCenter;for i1:kif classNumber(i)~0classCenter(i,:)nextCenter(i,:)/classNumber(i);endendif tempclassCenterbreakendendmapcontainers.Map(KeyType,int32,ValueType,int32);for i1:knumber[];for j1:picturesNumberif class(j)inumber[number,train_labels(j)];endendmap(i)mode(number);endcount0;for i1:picturesNumberif map(class(i))train_labels(i)countcount1;endendratiocount/picturesNumber;ratios[ratios,ratio];times[times,toc];
end
matlab代码kmeans
clc;
clear;
load ./train_images.mat;
load ./train_labels.mat;
k 10;
dimension 2;
Dimension 28 * 28;
picturesNumber 100;
sample train_images(:, :, 1:picturesNumber);
sample reshape(sample, 28 * 28, picturesNumber);
sample sample;
class zeros(1, picturesNumber);
times [];
ratios [];
for time 1:10tic;% K-Means initial center selectionclassCenter zeros(k, Dimension);classCenter(1, :) sample(randi(picturesNumber), :);for j 2:kdistances pdist2(sample, classCenter(1:j-1, :));minDistances min(distances, [], 2); % 为什么挑最近的呢因为是挑离所有已选中心最远的[~, index] max(minDistances);classCenter(j, :) sample(index, :);enditerator 0;while (true)iterator iterator 1;nextCenter zeros(k, Dimension);classNumber zeros(1, k);for i 1:picturesNumberdistances pdist2(sample(i, :), classCenter);[~, index] min(distances);class(i) index;classNumber(class(i)) classNumber(class(i)) 1;nextCenter(class(i), :) nextCenter(class(i), :) sample(i, :);endtemp classCenter;for i 1:kif classNumber(i) ~ 0classCenter(i, :) nextCenter(i, :) / classNumber(i);endendif isequal(temp, classCenter)break;endendmap containers.Map(KeyType, int32, ValueType, int32);for i 1:knumber [];for j 1:picturesNumberif class(j) inumber [number, train_labels(j)];endendmap(i) mode(number);endcount 0;for i 1:picturesNumberif map(class(i)) train_labels(i)count count 1;endendratio count / picturesNumber;ratios [ratios, ratio];times [times, toc];
end