到无监督机器学习算法了 - 训练集没有标识,算法根据具体的需要自己找到其中的一些规律。首先是聚类算法,这个应用的感觉比较广泛,比如新闻主题的聚合,市场的划分,微博上圈子的挖掘等。聚类用的K-means算法比较简单,主要是两个步骤:找到距离当前元素最近的类,把当前元素划分到该类;用类中所有元素的均值中心作为新的类中心。重复这两个步骤,直到类中心不再变化为止(小于某个阈值)。
聚类算法的优化目标就是使各个元素与所属类中心的距离方差最小:
最开始的聚类中心怎么选择呢?可以随机从训练集里面选择K个作为中心,当然前提是K小于训练集元素数目。这里有个局部最优问题,也就是依据初始的K个聚类中心,最终得到的聚类不是整体最优的。为了解决这个问题,可以多次运行聚类算法,从中选择代价方式最小的作为最终的结果。
怎么选择划分为多少个聚类呢?感觉最靠谱的是由需求来决定,也是聚类之后最终的目的。
找最近点,貌似没有好办法,双重循环:
for i = 1:size(X,1)
min_dis = intmax;
for j = 1:K
gap = (X(i,:) - centroids(j,:));
distance = gap * gap';
if (double(min_dis) > distance)
min_dis = distance;
idx(i) = j;
end
end
end
计算Centriod,这个有巧妙的算法,Matlab很强大呀。
for i = 1:K
centroids(i,:) = (X' * (idx == i))' / sum(idx == i);
end