是否可以使用scikit-learn K-Means Clustering指定您自己的距离函数?
python cluster-analysis machine-learning k-means scikit-learn
在维基百科页面上,描述了用于确定k均值中的聚类数量的肘方法.scipy的内置方法提供了一个实现,但我不确定我是否理解它们所称的失真是如何计算的.
更确切地说,如果您绘制由集群解释的方差百分比与集群数量的关系图,则第一个集群将添加大量信息(解释大量方差),但在某些时候边际增益将下降,从而给出一个角度.图形.
假设我的相关质心有以下几点,那么计算这个量度的好方法是什么?
points = numpy.array([[ 0, 0],
[ 0, 1],
[ 0, -1],
[ 1, 0],
[-1, 0],
[ 9, 9],
[ 9, 10],
[ 9, 8],
[10, 9],
[10, 8]])
kmeans(pp,2)
(array([[9, 8],
[0, 0]]), 0.9414213562373096)
Run Code Online (Sandbox Code Playgroud)
我特别考虑计算0.94 ..测量给出的点和质心.我不确定是否可以使用任何内置的scipy方法,或者我必须编写自己的方法.关于如何有效地为大量积分做这些的任何建议?
简而言之,我的问题(所有相关的)如下:
编辑2:失真
from scipy.spatial.distance import cdist
D = cdist(points, centroids, 'euclidean')
sum(numpy.min(D, axis=1))
Run Code Online (Sandbox Code Playgroud)
第一组点的输出是准确的.但是,当我尝试不同的设置时:
>>> pp = numpy.array([[1,2], [2,1], [2,2], [1,3], [6,7], [6,5], [7,8], [8,8]])
>>> kmeans(pp, 2)
(array([[6, 7],
[1, 2]]), 1.1330618877807475)
>>> …Run Code Online (Sandbox Code Playgroud) 我试图在一组高维数据点(大约50维)上应用k-means,并且想知道是否有任何实现找到最佳簇数.
我记得在某处读取算法通常这样做的方式是使群集间距离最大化并且群集内距离最小化但我不记得我在哪里看到它.如果有人可以指出我讨论这个的任何资源,那将是很棒的.我目前正在使用SciPy进行k-means,但任何相关的库都可以.
如果有其他方法可以实现相同或更好的算法,请告诉我.
我试图使用以下代码绘制k的肘部:
load CSDmat %mydata
for k = 2:20
opts = statset('MaxIter', 500, 'Display', 'off');
[IDX1,C1,sumd1,D1] = kmeans(CSDmat,k,'Replicates',5,'options',opts,'distance','correlation');% kmeans matlab
[yy,ii] = min(D1'); %% assign points to nearest center
distort = 0;
distort_across = 0;
clear clusts;
for nn=1:k
I = find(ii==nn); %% indices of points in cluster nn
J = find(ii~=nn); %% indices of points not in cluster nn
clusts{nn} = I; %% save into clusts cell array
if (length(I)>0)
mu(nn,:) = mean(CSDmat(I,:)); %% update mean
%% Compute within class …Run Code Online (Sandbox Code Playgroud) silhouette score当我找到要创建的最佳群集数时,我正在尝试进行计算,但是出现错误消息:
ValueError: Number of labels is 1. Valid values are 2 to n_samples - 1 (inclusive)
Run Code Online (Sandbox Code Playgroud)
我无法理解其原因。这是我用来聚类和计算的代码silhouette score。
我阅读了包含要聚类的文本的csv,并K-Means在n聚类值上运行。我收到此错误的原因可能是什么?
#Create cluster using K-Means
#Only creates graph
import matplotlib
#matplotlib.use('Agg')
import re
import os
import nltk, math, codecs
import csv
from nltk.corpus import stopwords
from gensim.models import Doc2Vec
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.metrics import silhouette_score
model_name = checkpoint_save_path
loaded_model = Doc2Vec.load(model_name)
#Load the test …Run Code Online (Sandbox Code Playgroud) 可能的重复:
如何在 K 均值算法中优化 K
使用 k 均值聚类时如何确定 k?
根据统计指标,我们可以决定 K。如标准差、均值、方差等,或者
有没有简单的方法来选择K-means算法中的K?
预先感谢纳文
k-means ×7
python ×4
data-mining ×3
scikit-learn ×2
matlab ×1
numpy ×1
pandas ×1
statistics ×1
variance ×1