【发布时间】:2019-08-07 00:38:49
【问题描述】:
我正在完成我教科书中的一个练习,并正在用 Python 实现代码来练习动态编程。我觉得我正处于解决问题的边缘,但几个小时后,我来这里寻求帮助。
基本上,我的代码会遍历一个值列表x,并给出一个k,根据计算特定集群的最小平方误差和 (SSE) 将该列表分成k 集群。
代码创建了一个表,计算 1 个集群、2 个集群、...、k 个集群的 SSE,如果我们要将集群括号括在 list[0:1]、list[0:2]、@987654327 内的所有值的变体周围@, ..., list[0:n],并为表中的特定步骤选择最小 SSE。
例如:给定x= [7,6,9,15,18,17,30,28,29] 和k=3,我们将返回集群(7,6,9)(15,18,17)(30,28,29),这将转化为每个集群的误差平方和等于(4.666)(4.666)(2)。因此,对于该列表中的集群,我们的最大 SSE 将是 4.666。
现在当我在第二个列表x = [52, 101, 103, 101, 6, 5, 7] 上尝试它时,我应该得到集群(52)(101, 103, 101)(6, 5, 7),它应该给出(0)(2.666)(2) 或最大2.666,但我没有得到那个。我相信错误存在于第二个返回语句的def f(s, j_down, t) 中,以及我如何增加s 和t。希望我没有犯愚蠢的错误!
非常感谢任何帮助,谢谢。
def mean(numbers):
return float(sum(numbers)) / max(len(numbers), 1)
def sum_square(x):
if isinstance(x, (int,)):
return 0
w = 0
for i in x:
w += (i - mean(x))**2
return w
def f(s, j_down, t):
if not r[s][j_down] and r[s][j_down] != 0:
return sum_square(x[:t - s])
return max(r[s][j_down], sum_square(x[:t-s]))
def get_min_f_and_s(j_down, t):
""" range s from 1 to t-1 and set s to minimize f(s)
"""
items = [(s, f(s, j_down, t)) for s in range(t)]
s, min_f = min(items, key=lambda x:x[1])
return s, min_f
def seq_out(n,k):
for j in range(k):
if j == 0:
for t in range(n):
r[t][j] = sum_square(x[:t+1])
c[t][j] = x[:t+1]
else:
for t in range(1, n):
s, min_f = get_min_f_and_s(j - 1, t)
r[t][j] = min_f
c[t][j] = [c[s][j - 1]] + x[s+1:t+1]
print('the max SSE is: {}'.format(r[-1][-1]))
print('the cluster centers are: {}'.format(c[-1][-1]))
#x = [7,6,9,15,18,17,30,28,29]
x = [52, 101, 103, 101, 6, 5, 7]
k = 3
n = len(x)
r = [[[] for _ in range(k)] for _ in range(n)]
c = [[[] for _ in range(k)] for _ in range(n)]
print(seq_out(n,k))
print(r)
print(c)
编辑:问题布局
给定一个序列X = [x_1, x_2, ... x_n] 和整数k > 1,将X 划分为大小为C_1,..., C_k 的簇n_1, ..., n_k,从而使平方误差之和最小化。
【问题讨论】:
-
在another question you wrote 中,您使用正在使用的算法共享了页面图像。你也可以在这里做吗?
标签: python algorithm cluster-analysis dynamic-programming