为什么 StreamingKMeans 集群中心与常规 Kmeans 不同
Why is the StreamingKMeans cluster centers different vs regular Kmeans
我有两个模型使用与 KMeans 模型相同的数据进行训练,如下所示:
int numIterations = 20;
int numClusters = 5;
int runs = 10;
double epsilon = 1.0e-6;
KMeans kmeans = new KMeans();
kmeans.setEpsilon(epsilon);
kmeans.setRuns(runs);
kmeans.setMaxIterations(numIterations);
kmeans.setK(numClusters);
KMeansModel model = kmeans.run(trainDataVectorRDD.rdd());
StreamingKmeans 如下所示:
int numOfDimensions = 3;
int numClusters = 5;
StreamingKMeans kmeans = new StreamingKMeans()
.setK(numClusters)
.setDecayFactor(1.0)
.setRandomCenters(numOfDimensions, 1.0, 0);
kmeans.trainOn(trainDataVectorRDD);
流媒体的想法是我从 kafka 队列中读取所有内容并训练模型,它会在新数据进入时自动更新。
我为两个模型得到了两个不同的聚类中心。我哪里做错了?
常规的 KMeans 是正确的。我只是在这里发布 5 个集群中心中的 2 个。感谢您的帮助,谢谢 =)。
集群:Kmeans
集群中心:[1.41012161E9,20.9157142857143,68.01750871080174]
集群中心:[2.20259211E8,0.6811821903787257,36.58268423745944]
集群:StreamingKmeans
集群中心:[-0.07896129994296074,-1.0194960760532714,-0.4783789312386866]
clusterCenter: [1.3712228467872134,-0.16614353149605163,0.24283231360124224]
k-means 随机化。如果你 运行 两次,你可能会得到两个不同的结果。特别是,它们可能不对齐(即聚类 1 可能与另一个结果中的聚类 1 不匹配)。
此外,流式 k-means 可能只允许对数据进行单次传递,因此预计结果与 k-means 在 1 次迭代后有些相似。
更新:Sparks StreamingKMeans setRandomCenters
从 N(0;1) 分布中选择初始中心。根据您的数据,这可能不是一个好主意,并且某些聚类中心(例如那些具有负坐标的聚类中心)将永远保持为空。在我看来,这是一个非常愚蠢的初始化方法,对大多数应用程序没有用。
我有两个模型使用与 KMeans 模型相同的数据进行训练,如下所示:
int numIterations = 20;
int numClusters = 5;
int runs = 10;
double epsilon = 1.0e-6;
KMeans kmeans = new KMeans();
kmeans.setEpsilon(epsilon);
kmeans.setRuns(runs);
kmeans.setMaxIterations(numIterations);
kmeans.setK(numClusters);
KMeansModel model = kmeans.run(trainDataVectorRDD.rdd());
StreamingKmeans 如下所示:
int numOfDimensions = 3;
int numClusters = 5;
StreamingKMeans kmeans = new StreamingKMeans()
.setK(numClusters)
.setDecayFactor(1.0)
.setRandomCenters(numOfDimensions, 1.0, 0);
kmeans.trainOn(trainDataVectorRDD);
流媒体的想法是我从 kafka 队列中读取所有内容并训练模型,它会在新数据进入时自动更新。
我为两个模型得到了两个不同的聚类中心。我哪里做错了? 常规的 KMeans 是正确的。我只是在这里发布 5 个集群中心中的 2 个。感谢您的帮助,谢谢 =)。
集群:Kmeans
集群中心:[1.41012161E9,20.9157142857143,68.01750871080174]
集群中心:[2.20259211E8,0.6811821903787257,36.58268423745944]
集群:StreamingKmeans
集群中心:[-0.07896129994296074,-1.0194960760532714,-0.4783789312386866]
clusterCenter: [1.3712228467872134,-0.16614353149605163,0.24283231360124224]
k-means 随机化。如果你 运行 两次,你可能会得到两个不同的结果。特别是,它们可能不对齐(即聚类 1 可能与另一个结果中的聚类 1 不匹配)。
此外,流式 k-means 可能只允许对数据进行单次传递,因此预计结果与 k-means 在 1 次迭代后有些相似。
更新:Sparks StreamingKMeans setRandomCenters
从 N(0;1) 分布中选择初始中心。根据您的数据,这可能不是一个好主意,并且某些聚类中心(例如那些具有负坐标的聚类中心)将永远保持为空。在我看来,这是一个非常愚蠢的初始化方法,对大多数应用程序没有用。