标签: 工作
谱聚类
探索一:
输入数据:货架信息(包括货架信息及货位上的SKU信息)
数据处理:
- 剔除空货架。
- 剔除SKU数小于5的货架。
- 剔除分布货架小于2的SKU。
- 构建BIN(货架)-SKU二分网络的邻接矩阵。
数据处理代码如下:
clc;
clear all;
load bin.mat
%处理空货架,及含SKU个数小于5的货架
binsku=bin.skuID;%确保源数据不变
emptyBin=find(sum(abs(bin.binState),2)<=5);
emptyBin=flipud(emptyBin);%倒序排列(防止因顺序出错)
for i=1:size(emptyBin,1)
binsku(emptyBin(i,1),:)=[];
end
skuList=cell(1,15000);%所有不重复的SKU的列表
index=1;
for i=1:size(binsku,1)
for j=1:size(binsku,2)
if ~isempty(binsku{i,j})
if isempty(find(strcmp(skuList,binsku{i,j})==1))
skuList{1,index}=binsku{i,j};
index=index+1;
end
end
end
end
a=0;%a为SKU的个数统计
for i=1:size(skuList,2)
if ~isempty(skuList{1,i})
a=a+1;
end
end
skuList= skuList(1,1:a);
%构建BIN-SKU的邻接矩阵
adja=zeros(size(binsku,1),a);
for i=1:size(adja,1)
for j=1:size(binsku,2)
if ~isempty(binsku{i,j})
ind=find(strcmp(skuList,binsku{i,j})==1);%定位该SKU对应的索引
adja(i,ind)=1;
end
end
end
%处理货架分布低于2的SKU,并删除
skubin=adja';
delsku=find(sum(skubin,2)<=2);
delsku=flipud(delsku);
for i=1:size(delsku,1)
skubin(delsku(i,1),:)=[];
adja(:,delsku(i,1))=[];
end
bb=zeros(size(adja,1),size(adja,1));
ss=zeros(size(adja,2),size(adja,2));
x=cat(2,bb,adja);
y=cat(2,adja',ss);
w=cat(1,x,y);
save('w.mat','w');```
谱聚类代码如下:
function [C,V] = SpectralClustering(W, k)
W=W-diag(diag(W));%将对角线设为0
D = diag(sum(W'));%度矩阵
E=D-W;%拉普拉斯矩阵
E = D(-1/2)*E*D(-1/2);%对拉普拉斯矩阵归一化
[Q,V]=eig(E);%eig函数:求E矩阵的特征值及特征向量,Q为特征向量矩阵,V为特征值矩阵
%[Q, V] = eigs(E, k); %选的是前K个最大特征值对应的特征向量
C = kmeans(Q, k);%使用K-MEANS聚类
end
调试得到特征值分布图如下:
```matlab
cc=C(1:size(adja,1),:);%取货架对应的行
disp('tabulate(cc)');
tabulate(cc);%统计cc矩阵的值的分布
tz=diag(V);%取特征值矩阵对角上的元素
bar(tz);%画出特征值直方图
特征值直方图如下:
聚类统计如下:
K>> tabulate(C)
Value Count Percent
1 603 20.74%
2 447 15.38%
3 893 30.72%
4 63 2.17%
5 901 30.99%