machine-learning - 如何在python中执行肘法?
问题描述
我想使用肘法检查最佳 k 数。我没有使用 scikit-learn 库。我的 k-means 是从头开始编码的,现在我很难弄清楚如何在 python 中编写肘部方法。我是一个完全的初学者。
这是我的 k-means 代码:
def cluster_init(array, k):
initial_assgnm = np.append(np.arange(k), np.random.randint(0, k, size=(len(array))))[:len(array)]
np.random.shuffle(initial_assgnm)
zero_arr = np.zeros((len(initial_assgnm), 1))
for indx, cluster_assgnm in enumerate(initial_assgnm):
zero_arr[indx] = cluster_assgnm
upd_array = np.append(array, zero_arr, axis=1)
return upd_array
def kmeans(array, k):
cluster_array = cluster_init(array, k)
while True:
unique_clusters = np.unique(cluster_array[:, -1])
centroid_dictonary = {}
for cluster in unique_clusters:
centroid_dictonary[cluster] = np.mean(cluster_array[np.where(cluster_array[:, -1] == cluster)][:, :-1], axis=0)
start_array = np.copy(cluster_array)
for row in range(len(cluster_array)):
cluster_array[row, -1] = unique_clusters[np.argmin(
[np.linalg.norm(cluster_array[row, :-1] - centroid_dictonary.get(cluster)) for cluster in unique_clusters])]
if np.array_equal(cluster_array, start_array):
break
return centroid_dictonary
这是我尝试过的肘部方法:
cost = []
K= range(1,239)
for k in K :
KM = kmeans(x,k)
print(k)
KM.fit(x)
cost.append(KM.inertia_)
但我收到以下错误
KM.fit(x)
AttributeError:“dict”对象没有属性“fit”
解决方案
如果要从头开始计算肘部值,则需要计算当前聚类分配的惯性。为此,您可以计算粒子惯性的总和。数据点的粒子惯性是从其当前位置到最近中心的距离。如果你有一个为你计算这个的函数(在 scikit-learn 中这个函数对应于 pairwise_distances_argmin_min
)你可以做
labels, mindist = pairwise_distances_argmin_min(
X=X, Y=centers, metric='euclidean', metric_kwargs={'squared': True})
inertia = mindist.sum()
如果你真的想写这个函数,你要做的就是遍历 X 中的每一行 x,找到 dist(x,y) 的 Y 中所有 y 的最小值,这就是你对 x 的惯性。这种计算粒子惯性的简单方法是 O(nk),因此您可以考虑改用库函数。
推荐阅读
- python - 循环所有列以获取任何列中的值
- android - MutableLiveData 通过从 ViewModel 转换 LiveData 来暴露
- excel - VLOOKUP 不同月份的多列
- python - 在将 DataFrame 与可为空的整数连接时保留数据类型
- gcc - 为堆栈变量的扩展对齐生成的程序集
- delphi - Delphi FMX dcpcrypt 在 macOS 64 位上的错误结果
- angular - 从 Angular 的控件中更新控件的有效性
- swiftui - .identified(by:) 已弃用?
- python-3.x - 如何在 pandas 中创建一个新列,它是基于条件的另一列的总和?
- angular - rxjs 主题在 3 个组件之间移动数据