分类方法概述
KMeans
基本概念
- 将N个数据点按照质心分为K个簇,即分类个数为K,为无监督分类
- 首先初始化K个聚类的质心点,然后重新计算每个数据点的分类(按照距离),重复迭代过程,直到达到收敛条件
- 参考链接:http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006910.html
其他
- matlab中有对应的函数,可以直接实现:http://blog.csdn.net/u012526003/article/details/50492404
层次聚类
基本概念
- 参考链接
- 层次聚类是
自下而上
的聚类方法,首先将每个样本归为一个单独的类。每次将样本中最近的两个样本合并为一个簇,将原来的两个样本从需要继续聚类的样本中删除,将这个簇作为一个新的样本,投入到样本中继续进行合并,相当于每次聚类之后都会减少一类。具体的步骤为
- 将每个样本归为一类,计算每两个类之间的距离,即样本与样本之间的相似度;
- 寻找距离最近的两个类,把它们归为一类(类的总数少了一个)
- 重新计算新生成的这个类与各个旧类之间的距离,即相似度;
- 重复2和3,直到所有样本都归为一类,结束。
- 整个过程相当于建立了一棵树, 可以通过设置
距离阈值
或者聚类的个数
来提前结束迭代。 - 最重要的是第3步中的距离计算
- 对于两个类,如果他们都只有一个样本,则他们之间的距离就是类之间的距离,如果超过一个样本,则可以通过
SingleLinkage
、CompleteLinkage
、Average-linkage
方法来计算类之间的距离
- SingleLinkage:两个类中样本距离的最小值
- CompleteLinkage:两个类中样本距离的最大值
- Average-linkage:把两个类之间所有样本的两两距离计算出来,取平均值,最常用
- 对于两个类,如果他们都只有一个样本,则他们之间的距离就是类之间的距离,如果超过一个样本,则可以通过
其他
matlab实现层次聚类分析
%% 层次聚类 clc,clear,close all data1 = rand( 50, 2 ); data2 = rand( 50, 2 ) + ones(50,2); data = cat(1, data1, data2); dists = pdist(data); dists = squareform( dists ); % 可视化聚类数 trees = linkage( dists, 'average' ); dendrogram( trees ); % 可视化聚类结果,这里分成了2类 res = cluster(trees,'maxclust',2); scatter(data(:,1), data(:,2), 50, res)
谱聚类
基本概念
- 将每个样本视为网络中的一个节点。在复杂网络簇结构中存在着同簇节点之间连接密集,不同簇节点之间连接稀疏的特征,希望根据这样的特征,实现对节点的分割。
- 定义了
截
函数的概念,当一个网络被划分为2个子网络时,截
指的是子网间的连接密度。谱聚类的目的就是要找到一个合理的分割,使得分割后形成若干子图,连接不同的子图的边的权重尽可能低,即截
最小,同子图内的边的权值尽可能高。
截的具体表现形式
截
表示子网络之间的密度,即边比较少,以二分为例,将一个图聚类为 S 和T 这2类,则目标函数为
mincut(S,T)=∑i∈S,j∈Teij=W(S,T)
其中 W(S,T) 表示的是类别 S 和T 之间的权重。对于 k 个不同的类别,优化目标为
mincut(A1,A2,...,Ak)=12∑i=1kW(Ai,Ai¯¯¯¯)
这种情况比较容易出现二分割的问题,其将图分为1个点和其余 n−1 个点。
其他的截函数的形式
- 为了能让每个类都有合理的大小,目标函数中应该让各个分类结果中的样本都够大,提出了 RatioCut(A1,A2,...,Ak) 或者 NCut(A1,A2,...,Ak)
Ratiocut(A1,A2,...,Ak)=12∑i=1kW(Ai,Ai¯¯¯¯)|Ai|
Ncut(A1,A2,...,Ak)=12∑i=1kW(Ai,Ai¯¯¯¯)vol(Ai)
其中 |A| 表示 A 中顶点的个数
Laplacian矩阵
- 定义
- Laplacian矩阵也成为基尔霍夫矩阵,对于一个有n个顶点的图
G={V,E} ,其laplacian矩阵定义为
L=D−A
其中D是图的度矩阵,A是图的邻接矩阵- 度矩阵的定义
- 对于上述的图,邻接矩阵为
A=⎛⎝⎜⎜w11⋮wn1⋯⋱⋯w1n⋮wnn⎞⎠⎟⎟
度矩阵为对角矩阵
D=diag{d1,d2,...,dn}
其中
di=∑j=1ndij
- 对于上述的图,邻接矩阵为
- 性质
- Laplacian矩阵L是半正定矩阵
- L的最小特征值是0,相应的特征向量是I(全部为1)
- L有n个非负特征值,对于任何一个实向量,都有
f′Lf=12∑i,j=1nwij(fi−fj)2
- 规范化的Laplacian矩阵形式为
L=D−12(D−A)D−12 目标函数的化简
对于2个类别的聚类问题,优化的目标函数为
minRatioCut(A1,A¯)
定义向量 f=(f1,f2,...fn)′ ,且有
fi=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪A¯A−−√,ifvi∈A−AA¯−−√,ifvi∈A\
则可以推导出
f′Lf=|V|⋅RatioCut(A,A¯)
其中 |V| 是顶点的数目,对于特定的图来说是常数,因此可以利用Laplacian矩阵求解这个优化问题,即新的目标函数为
minf∈Rnf′Lf,st.f⊥I,∥f∥=n√
假设 λ 是L的特征值,f是其对应的特征向量,则有
Lf=λf
f′Lf=λf′f
f′Lf=λn
因此只需要求最小特征值 λ ,又其最小特征值为0,由Rayleigh-Ritz理论,可以取次小特征值。
* 对于求解出来的特征向量,可以通过分量的值判断对应的点所属的类别
{vi∈A,iffi≥0vi∈A¯,iffi<0多聚类的问题
- 对于多聚类的问题,可以对求出来的前k个特征值的特征向量,利用Kmeans聚类方法对齐进行聚类
利用相似度构造Laplacian矩阵
- 相似度矩阵由权值矩阵得到
S=⎛⎝⎜⎜s11⋮sn1⋯⋱⋯s1n⋮snn⎞⎠⎟⎟
其中
sij=e−w2ij2σ2
再利用相似度矩阵构造Laplacian矩阵
L=D−12SD−12
其中D为相似度S构造的度矩阵。 - 注意:第一种方法中,取得是前k个最小特征值对应的特征向量,在相似度矩阵的方法中,求解的是前k个最大特征值对应的特征向量
谱聚类的基本过程
- 基于给定的图 G=(V,E) ,求图的度矩阵和邻接矩阵A;
- 计算图的Laplacian矩阵( L=D−A 或者利用相似度矩阵计算)
- 对Laplacian矩阵进行特征值分解,取前k个特征值对应的特征向量,构成 n×k 的特征向量矩阵
- 利用Kmeans聚类算法对上述特征向量矩阵进行聚类,每一行代表一个样本点,最后可以得到每个样本的分类
其他
- 参考链接:
- 这种方法可以实现对高维数据的降维,再对数据在低维空间中利用聚类方法进行聚类,可以用于数据分类、图像分割等领域。
代码
main
clc,clear,close all data1 = rand( 50, 2 ); data2 = rand( 50, 2 ) + ones(50,2); data = cat(1, data1, data2); % 对图像进行分割 % a = imread('1.png'); % a = imresize( a, 0.3 ); % a = double(a)/ 255; % data = reshape( a, [size(a,1)*size(a,2), size(a,3)] ); dists = pdist(data); dists = squareform( dists ); [cluster_labels, evd_time, kmeans_time, total_time] = SpectrumCluster(dists, 2, 2); scatter(data(:,1), data(:,2), 50, cluster_labels)
SpectrumCluster
function [cluster_labels, evd_time, kmeans_time, total_time] = SpectrumCluster(A, sigma, num_clusters) %SC Spectral clustering using a sparse similarity matrix (t-nearest-neighbor). % % Input : A : N-by-N sparse distance matrix, where % N is the number of data % sigma : sigma value used in computing similarity, % if 0, apply self-tunning technique % num_clusters : number of clusters % % Output : cluster_labels : N-by-1 vector containing cluster labels % evd_time : running time for eigendecomposition % kmeans_time : running time for k-means % total_time : total running time % % Convert the sparse distance matrix to a sparse similarity matrix, % where S = exp^(-(A^2 / 2*sigma^2)). % Note: This step can be ignored if A is sparse similarity matrix. % disp('Converting distance matrix to similarity matrix...'); tic; n = size(A, 1); if (sigma == 0) % Selftuning spectral clustering % Find the count of nonzero for each column disp('Selftuning spectral clustering...'); col_count = sum(A~=0, 1)'; col_sum = sum(A, 1)'; col_mean = col_sum ./ col_count; [x y val] = find(A); A = sparse(x, y, -val.*val./col_mean(x)./col_mean(y)./2); clear col_count col_sum col_mean x y val; else % Fixed-sigma spectral clustering disp('Fixed-sigma spectral clustering...'); A = A.*A; A = -A/(2*sigma*sigma); end % Do exp function sequentially because of memory limitation num = 2000; num_iter = ceil(n/num); S = sparse([]); for i = 1:num_iter start_index = 1 + (i-1)*num; end_index = min(i*num, n); S1 = spfun(@exp, A(:,start_index:end_index)); % sparse exponential func S = [S S1]; clear S1; end clear A; toc; % % Do laplacian, L = D^(-1/2) * S * D^(-1/2) % disp('Doing Laplacian...'); D = sum(S, 2) + (1e-10); D = sqrt(1./D); % D^(-1/2) D = spdiags(D, 0, n, n); L = D * S * D; clear D S; time1 = toc; % % Do eigendecomposition, if L = % D^(-1/2) * S * D(-1/2) : set 'LM' (Largest Magnitude), or % I - D^(-1/2) * S * D(-1/2): set 'SM' (Smallest Magnitude). % disp('Performing eigendecomposition...'); OPTS.disp = 0; [V, val] = eigs(L, num_clusters, 'LM', OPTS); time2 = toc; % % Do k-means % disp('Performing kmeans...'); % Normalize each row to be of unit length sq_sum = sqrt(sum(V.*V, 2)) + 1e-20; U = V ./ repmat(sq_sum, 1, num_clusters); clear sq_sum V; cluster_labels = kmeans(U, num_clusters); total_time = toc; % % Calculate and show time statistics % evd_time = time2 - time1 kmeans_time = total_time - time2 total_time disp('Finished!');
KNN分类
基本概念
- KNN(k-nearest neighbour)是一个常用的
监督学习方法
,它不对训练数据做任何操作,只是将数据和对应的label保存起来,在对特定测试样本进行分类时,找出距离该测试样本最近的k个训练样本,它们中最多的种类就是该测试样本的类别(比如说2分类问题的,k=3,2个最近邻类别是2,1个是1,则这个测试样本的类别是2。)
matlab代码
%% KNN聚类 clc,clear,close all data1 = rand( 50, 2 ); data2 = rand( 50, 2 ) + ones(50,2); data = cat(1, data1, data2); train_lb = [ones(50,1); 2*ones(50,1)]; test_data = [1.1 0.5;0.3 0.2; 0.3 2.3]; idx = knnsearch( data, test_data, 'k', 7 ); test_lb = mode(train_lb(idx), 2); rgb = zeros(length(test_lb), 3); rgb(test_lb == 1, 1) = 1; rgb(test_lb == 2, 2) = 1; figure, hold on scatter(data(:,1), data(:,2), 50, train_lb) scatter(test_data(:,1), test_data(:,2), 50, rgb, 'd', 'filled');
朴素贝叶斯分类器(Naive Bayesian classification)
基本概念
- 贝叶斯分类算法是统计分类算法的一种,他是一类利用概率统计知识进行的一种分类算法。而朴素贝叶斯算法就是里面贝叶斯算法中最简单的一个算法。
核心公式
P(B|A)=P(A|B)P(B)P(A)- 对于给出的待分类项,求解出在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪一类。
正式流程定义
- 设 x={a1,a2,...,am} 为一个待分类项,其中每一个 ai 都是 x 的一个特征属性。
- 总共有类别集合
x={y1,y2,...,yn} 。 - 计算 P(y1|x),P(y2|x),...,P(yn|x) ,即当出现测试样本这种特征时,属于各个类别的概率。
- 若 P(yk|x)=max{P(y1|x),P(y2|x),...,P(yn|x)} ,则 x∈yk
现在的主要目标就是计算样本属于各类的条件概率。由之前的条件概率公式可以,每种类别的条件概率为
P(yi|x)=P(x|yi)P(yi)P(x)
对于某个特定的样本, P(x) 是定值,因此我们只需要使得分子最大化即可。再 假设各个特征属性是条件独立的,因此有
P(x|yi)P(yi)=P(yi)∏j=1mP(aj|yi)
上述情况是特征属性为离散的情况,可以很方便地计算出 P(ak,yi) 的值,对于特征属性 ak 为连续的情况,我们假设其值符合高斯分布,即
g(x,η,σ)=12π−−√σe−(x−η)22σ2
而 P(ak|yi)=g(ak,ηyi,σyi) ,因此我们只需要计算出训练样本中各个类别中此特征项的均值和标准差,代入公式即可。在计算的过程中,可能会出现 P(a|y)=0 的情况,即某个分类下的所有样本没有某种特征,这会大大降低分类器的质量。我们对每个类别下所有的划分的计数加1,从而可以避免上述问题。
其他
- 贝叶斯分类被广泛应用,主要有
- 对新闻的类别进行分类,比如科技、政治、运动
- 判断文本表达的感情是积极的还是消极的
- 人脸识别
- 参考文献
SVM
- 度矩阵的定义
- Laplacian矩阵也成为基尔霍夫矩阵,对于一个有n个顶点的图