kmeans算法用python实现遗传算法怎么实现

苹果/安卓/wp
苹果/安卓/wp
积分 752, 距离下一级还需 48 积分
权限: 自定义头衔, 签名中使用图片
道具: 彩虹炫, 雷达卡, 热点灯, 雷鸣之声, 涂鸦板, 金钱卡, 显身卡, 匿名卡, 抢沙发下一级可获得
权限: 隐身
购买后可立即获得
权限: 隐身
道具: 金钱卡, 雷鸣之声, 彩虹炫, 雷达卡, 涂鸦板, 热点灯
开心签到天数: 11 天连续签到: 2 天[LV.3]偶尔看看II
前言kmeans是最简单的聚类算法之一,但是运用十分广泛。最近在工作中也经常遇到这个算法。kmeans一般在数据分析前期使用,选取适当的k,将数据分类后,然后分类研究不同聚类下数据的特点。本文记录学习kmeans算法相关的内容,包括算法原理,收敛性,效果评估聚,最后带上R语言的例子,作为备忘。
算法原理kmeans的计算方法如下:1 随机选取k个中心点2 遍历所有数据,将每个数据划分到最近的中心点中3 计算每个聚类的平均值,并作为新的中心点4 重复2-3,直到这k个中线点不再变化(收敛了),或执行了足够多的迭代时间复杂度:O(I*n*k*m)空间复杂度:O(n*m)其中m为每个元素字段个数,n为数据量,I为跌打个数。一般I,k,m均可认为是常量,所以时间和空间复杂度可以简化为O(n),即线性的。
算法收敛也就是当前聚类的均值就是当前方向的最优解(最小值),这与kmeans的每一次迭代过程一样。所以,这样保证SSE每一次迭代时,都会减小,最终使SSE收敛。由于SSE是一个非凸函数(non-convex function),所以SSE不能保证找到全局最优解,只能确保局部最优解。但是可以重复执行几次kmeans,选取SSE最小的一次作为最终的聚类结果。
0-1规格化由于数据之间量纲的不相同,不方便比较。举个例子,比如游戏用户的在线时长和活跃天数,前者单位是秒,数值一般都是几千,而后者单位是天,数值一般在个位或十位,如果用这两个变量来表征用户的活跃情况,显然活跃天数的作用基本上可以忽略。所以,需要将数据统一放到0~1的范围,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。具体计算方法如下:
轮廓系数轮廓系数(Silhouette Coefficient)结合了聚类的凝聚度(Cohesion)和分离度(Separation),用于评估聚类的效果。该值处于-1~1之间,值越大,表示聚类效果越好。具体计算方法如下:对于第i个元素x_i,计算x_i与其同一个簇内的所有其他元素距离的平均值,记作a_i,用于量化簇内的凝聚度。选取x_i外的一个簇b,计算x_i与b中所有点的平均距离,遍历所有其他簇,找到最近的这个平均距离,记作b_i,用于量化簇之间分离度。对于元素x_i,轮廓系数s_i = (b_i – a_i)/max(a_i,b_i)计算所有x的轮廓系数,求出平均值即为当前聚类的整体轮廓系数
从上面的公式,不难发现若s_i小于0,说明x_i与其簇内元素的平均距离小于最近的其他簇,表示聚类效果不好。如果a_i趋于0,或者b_i足够大,那么s_i趋近与1,说明聚类效果比较好。
K值选取在实际应用中,由于Kmean一般作为数据预处理,或者用于辅助分类贴标签。所以k一般不会设置很大。可以通过枚举,令k从2到一个固定值如10,在每个k值上重复运行数次kmeans(避免局部最优解),并计算当前k的平均轮廓系数,最后选取轮廓系数最大的值对应的k作为最终的集群数目。
实际应用下面通过例子(R实现,完整代码见附件)讲解kmeans使用方法,会将上面提到的内容全部串起来1
library(fpc) # install.packages(&fpc&)
data(iris)
head(iris)
加载实验数据iris,这个数据在机器学习领域使用比较频繁,主要是通过画的几个部分的大小,对花的品种分类,实验中需要使用fpc库估计轮廓系数,如果没有可以通过install.packages安装。1
# 0-1 正规化数据
min.max.norm &- function(x){
(x-min(x))/(max(x)-min(x))
raw.data &- iris[,1:4]
norm.data &- data.frame(sl = min.max.norm(raw.data[,1]),
sw = min.max.norm(raw.data[,2]),
pl = min.max.norm(raw.data[,3]),
pw = min.max.norm(raw.data[,4]))
对iris的4个feature做数据正规化,每个feature均是花的某个不为的尺寸。1
# k取2到8,评估K
round &- 30 # 每次迭代30次,避免局部最优
rst &- sapply(K, function(i){
print(paste(&K=&,i))
mean(sapply(1:round,function(r){
print(paste(&Round&,r))
result &- kmeans(norm.data, i)
stats &- cluster.stats(dist(norm.data), result$cluster)
stats$avg.silwidth
plot(K,rst,type='l',main='轮廓系数与K的关系', ylab='轮廓系数')
评估k,由于一般K不会太大,太大了也不易于理解,所以遍历K为2到8。由于kmeans具有一定随机性,并不是每次都收敛到全局最小,所以针对每一个k值,重复执行30次,取并计算轮廓系数,最终取平均作为最终评价标准,可以看到如下的示意图, 当k取2时,有最大的轮廓系数,虽然实际上有3个种类。1
# 降纬度观察
old.par &- par(mfrow = c(1,2))
k = 2 # 根据上面的评估 k=2最优
clu &- kmeans(norm.data,k)
mds = cmdscale(dist(norm.data,method=&euclidean&))
plot(mds, col=clu$cluster, main='kmeans聚类 k=2', pch = 19)
plot(mds, col=iris$Species, main='原始聚类', pch = 19)
par(old.par)
聚类完成后,有源原始数据是4纬,无法可视化,所以通过多维定标(Multidimensional scaling)将纬度将至2为,查看聚类效果,如下
可以发现原始分类中和聚类中左边那一簇的效果还是拟合的很好的,右测原始数据就连在一起,kmeans无法很好的区分,需要寻求其他方法。
kmeans最佳实践1. 随机选取训练数据中的k个点作为起始点2. 当k值选定后,随机计算n次,取得到最小开销函数值的k作为最终聚类结果,避免随机引起的局部最优解3. 手肘法选取k值:绘制出k--开销函数闪点图,看到有明显拐点(如下)的地方,设为k值,可以结合轮廓系数。4. k值有时候需要根据应用场景选取,而不能完全的依据评估参数选取。 参考[1] kmeans 讲义by Andrew NG[2] 坐标下降法(Coordinate Decendent)[3] 数据规格化[4] 维基百科--轮廓系数[5] kmeans算法介绍[6] 降为方法—多维定标[7] Week 8 in Machine Learning, by Andrew NG, Coursera
来源:bourneli(李伯韬)的技术博客地址:/bourneli/p/3645049.html
支持楼主:、
购买后,论坛将把您花费的资金全部奖励给楼主,以表示您对TA发好贴的支持
载入中......
论坛好贴推荐
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
为做大做强论坛,本站接受风险投资商咨询,请联系(010-)
邮箱:service@pinggu.org
合作咨询电话:(010)
广告合作电话:(刘老师)
投诉电话:(010)
不良信息处理电话:(010)
京ICP证090565号
京公网安备号
论坛法律顾问:王进律师&&&&kmeans算法python实现
kmeans算法python实现
python实现的kmeans算法,python 2.7.2可行
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
课程资源下载排行机器学习实战ByMatlab(4):二分K-means算法 - 文章 - 伯乐在线
& 机器学习实战ByMatlab(4):二分K-means算法
前面我们在是实现K-means算法的时候,提到了它本身存在的缺陷:
1.可能收敛到局部最小值
2.在大规模数据集上收敛较慢
对于上一篇博文最后说的,当陷入局部最小值的时候,处理方法就是多运行几次K-means算法,然后选择畸变函数J较小的作为最佳聚类结果。这样的说法显然不能让我们接受,我们追求的应该是一次就能给出接近最优的聚类结果。
其实K-means的缺点的根本原因就是:对K个质心的初始选取比较敏感。质心选取得不好很有可能就会陷入局部最小值。
基于以上情况,有人提出了二分K-means算法来解决这种情况,也就是弱化初始质心的选取对最终聚类效果的影响。
二分K-means算法
在介绍二分K-means算法之前我们先说明一个定义:SSE(Sum of Squared Error),也就是误差平方和,它是用来度量聚类效果的一个指标。其实SSE也就是我们在K-means算法中所说的畸变函数:
SSE计算的就是一个cluster中的每个点到质心的平方差,它可以度量聚类的好坏。显然SSE越小,说明聚类效果越好。
二分K-means算法的主要思想:
首先将所有点作为一个簇,然后将该簇一分为二。之后选择能最大程度降低聚类代价函数(也就是误差平方和)的簇划分为两个簇。以此进行下去,直到簇的数目等于用户给定的数目k为止。
二分k均值算法的伪代码如下:
将所有数据点看成一个簇
当簇数目小于k时
对每一个簇
计算总误差
在给定的簇上面进行k-均值聚类(k=2)
计算将该簇一分为二后的总误差
选择使得误差最小的那个簇进行划分操作
Matlab 实现
function bikMeans
biDataSet = load('testSet.txt');
[row,col] = size(biDataSet);
% 存储质心矩阵
biCentSet = zeros(biK,col);
% 初始化设定cluster数量为1
numCluster = 1;
%第一列存储每个点被分配的质心,第二列存储点到质心的距离
biClusterAssume = zeros(row,2);
%初始化质心
biCentSet(1,:) = mean(biDataSet)
for i = 1:row
biClusterAssume(i,1) = numC
biClusterAssume(i,2) = distEclud(biDataSet(i,:),biCentSet(1,:));
while numCluster & biK
minSSE = 10000;
%寻找对哪个cluster进行划分最好,也就是寻找SSE最小的那个cluster
for j = 1:numCluster
curCluster = biDataSet(find(biClusterAssume(:,1) == j),:);
[spiltCentSet,spiltClusterAssume] = kMeans(curCluster,2);
spiltSSE = sum(spiltClusterAssume(:,2));
noSpiltSSE = sum(biClusterAssume(find(biClusterAssume(:,1)~=j),2));
curSSE = spiltSSE + noSpiltSSE;
fprintf('第%d个cluster被划分后的误差为:%f \n' , [j, curSSE])
if (curSSE & minSSE)
minSSE = curSSE;
bestClusterToSpilt =
bestClusterAssume = spiltClusterA
bestCentSet = spiltCentS
bestClusterToSpilt
bestCentSet
%更新cluster的数目
numCluster = numCluster + 1;
bestClusterAssume(find(bestClusterAssume(:,1) == 1),1) = bestClusterToS
bestClusterAssume(find(bestClusterAssume(:,1) == 2),1) = numC
% 更新和添加质心坐标
biCentSet(bestClusterToSpilt,:) = bestCentSet(1,:);
biCentSet(numCluster,:) = bestCentSet(2,:);
% 更新被划分的cluster的每个点的质心分配以及误差
biClusterAssume(find(biClusterAssume(:,1) == bestClusterToSpilt),:) = bestClusterA
%scatter(dataSet(:,1),dataSet(:,2),5)
for i = 1:biK
pointCluster = find(biClusterAssume(:,1) == i);
scatter(biDataSet(pointCluster,1),biDataSet(pointCluster,2),5)
scatter(biCentSet(:,1),biCentSet(:,2),300,'+')
% 计算欧式距离
function dist = distEclud(vecA,vecB)
dist = sum(power((vecA-vecB),2));
% K-means算法
function [centSet,clusterAssment] = kMeans(dataSet,K)
[row,col] = size(dataSet);
% 存储质心矩阵
centSet = zeros(K,col);
% 随机初始化质心
for i= 1:col
minV = min(dataSet(:,i));
rangV = max(dataSet(:,i)) - minV;
centSet(:,i) = repmat(minV,[K,1]) + rangV*rand(K,1);
% 用于存储每个点被分配的cluster以及到质心的距离
clusterAssment = zeros(row,2);
clusterChange =
while clusterChange
clusterChange =
% 计算每个点应该被分配的cluster
for i = 1:row
% 这部分可能可以优化
minDist = 10000;
minIndex = 0;
for j = 1:K
distCal = distEclud(dataSet(i,:) , centSet(j,:));
if (distCal & minDist)
minDist = distC
minIndex =
if minIndex ~= clusterAssment(i,1)
clusterChange =
clusterAssment(i,1) = minI
clusterAssment(i,2) = minD
% 更新每个cluster 的质心
for j = 1:K
simpleCluster = find(clusterAssment(:,1) == j);
centSet(j,:) = mean(dataSet(simpleCluster',:));
<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc<div class="crayon-num" data-line="crayon-571ebc<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc0<div class="crayon-num" data-line="crayon-571ebc1<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc2<div class="crayon-num" data-line="crayon-571ebc3<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc4<div class="crayon-num" data-line="crayon-571ebc5<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc6<div class="crayon-num" data-line="crayon-571ebc7<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc8<div class="crayon-num" data-line="crayon-571ebc9<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc0<div class="crayon-num" data-line="crayon-571ebc1<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc2<div class="crayon-num" data-line="crayon-571ebc3<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc4<div class="crayon-num" data-line="crayon-571ebc5<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc6<div class="crayon-num" data-line="crayon-571ebc7<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc8<div class="crayon-num" data-line="crayon-571ebc9<div class="crayon-num crayon-striped-num" data-line="crayon-571ebc0<div class="crayon-num" data-line="crayon-571ebc1
function bikMeans%%&clcclearclose all%%&biK = 4;biDataSet = load('testSet.txt');[row,col] = size(biDataSet);% 存储质心矩阵&biCentSet = zeros(biK,col);% 初始化设定cluster数量为1&numCluster = 1;%第一列存储每个点被分配的质心,第二列存储点到质心的距离&biClusterAssume = zeros(row,2);%初始化质心&biCentSet(1,:) = mean(biDataSet)for i = 1:row biClusterAssume(i,1) = numCluster; biClusterAssume(i,2) = distEclud(biDataSet(i,:),biCentSet(1,:));endwhile numCluster & biK minSSE = 10000; %寻找对哪个cluster进行划分最好,也就是寻找SSE最小的那个cluster for j = 1:numCluster curCluster = biDataSet(find(biClusterAssume(:,1) == j),:); [spiltCentSet,spiltClusterAssume] = kMeans(curCluster,2); spiltSSE = sum(spiltClusterAssume(:,2)); noSpiltSSE = sum(biClusterAssume(find(biClusterAssume(:,1)~=j),2)); curSSE = spiltSSE + noSpiltSSE; fprintf('第%d个cluster被划分后的误差为:%f \n' , [j, curSSE]) if (curSSE & minSSE) minSSE = curSSE; bestClusterToSpilt = j; bestClusterAssume = spiltClusterAssume; bestCentSet = spiltCentSet; end end bestClusterToSpilt bestCentSet %更新cluster的数目 numCluster = numCluster + 1; bestClusterAssume(find(bestClusterAssume(:,1) == 1),1) = bestClusterToSpilt; bestClusterAssume(find(bestClusterAssume(:,1) == 2),1) = numCluster; % 更新和添加质心坐标 biCentSet(bestClusterToSpilt,:) = bestCentSet(1,:); biCentSet(numCluster,:) = bestCentSet(2,:); biCentSet % 更新被划分的cluster的每个点的质心分配以及误差 biClusterAssume(find(biClusterAssume(:,1) == bestClusterToSpilt),:) = bestClusterAssume;endfigure%scatter(dataSet(:,1),dataSet(:,2),5)&for i = 1:biK pointCluster = find(biClusterAssume(:,1) == i); scatter(biDataSet(pointCluster,1),biDataSet(pointCluster,2),5) hold onend%hold on&scatter(biCentSet(:,1),biCentSet(:,2),300,'+')hold offend% 计算欧式距离&function dist = distEclud(vecA,vecB) dist = sum(power((vecA-vecB),2));end% K-means算法&function [centSet,clusterAssment] = kMeans(dataSet,K)[row,col] = size(dataSet);% 存储质心矩阵&centSet = zeros(K,col);% 随机初始化质心&for i= 1:col minV = min(dataSet(:,i)); rangV = max(dataSet(:,i)) - minV; centSet(:,i) = repmat(minV,[K,1]) + rangV*rand(K,1);end% 用于存储每个点被分配的cluster以及到质心的距离&clusterAssment = zeros(row,2);clusterChange = true;while clusterChange clusterChange = false; % 计算每个点应该被分配的cluster for i = 1:row % 这部分可能可以优化 minDist = 10000; minIndex = 0; for j = 1:K distCal = distEclud(dataSet(i,:) , centSet(j,:)); if (distCal & minDist) minDist = distCal; minIndex = j; end end if minIndex ~= clusterAssment(i,1)
clusterChange = true; end clusterAssment(i,1) = minIndex; clusterAssment(i,2) = minDist; end% 更新每个cluster 的质心& for j = 1:K simpleCluster = find(clusterAssment(:,1) == j); centSet(j,:) = mean(dataSet(simpleCluster',:)); endendend
算法迭代过程如下
biCentSet =
第1个cluster被划分后的误差为:792.916857
bestClusterToSpilt =
bestCentSet =
biCentSet =
第1个cluster被划分后的误差为:409.871545
第2个cluster被划分后的误差为:532.999616
bestClusterToSpilt =
bestCentSet =
biCentSet =
第1个cluster被划分后的误差为:395.669052
第2个cluster被划分后的误差为:149.954305
第3个cluster被划分后的误差为:393.431098
bestClusterToSpilt =
bestCentSet =
biCentSet =
最终效果图
运用二分K-means算法进行聚类的时候,不同的初始质心聚类结果还是会稍微有点不同,因为实际上这也只是弱化随机质心对聚类结果的影响而已,并不能消除其影响,不过最终还是能收敛到全局最小。
可能感兴趣的话题
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
&#8211; 好的话题、有启发的回复、值得信赖的圈子
&#8211; 分享和发现有价值的内容与观点
&#8211; 为IT单身男女服务的征婚传播平台
&#8211; 优秀的工具资源导航
&#8211; 翻译传播优秀的外文文章
&#8211; 国内外的精选文章
&#8211; UI,网页,交互和用户体验
&#8211; 专注iOS技术分享
&#8211; 专注Android技术分享
&#8211; JavaScript, HTML5, CSS
&#8211; 专注Java技术分享
&#8211; 专注Python技术分享
& 2016 伯乐在线

我要回帖

更多关于 rsa算法python实现 的文章

 

随机推荐