Python Scikit学习:如何在一维数组上运行KMeans?
我有一个介于0和1之间的13.876(13876)值数组。我想只对这个向量应用Python Scikit学习:如何在一维数组上运行KMeans?,python,scikit-learn,data-mining,k-means,Python,Scikit Learn,Data Mining,K Means,我有一个介于0和1之间的13.876(13876)值数组。我想只对这个向量应用sklearn.cluster.KMeans,以找到将值分组的不同集群。然而,KMeans似乎可以处理多维数组,而不能处理一维数组。我想这是有办法的,但我不知道怎么做。我看到它接受“X:array-like或sparse-matrix,shape=(n_-samples,n_-features)”,但它希望n_-samples大于1 我尝试将数组放在np.zeros()矩阵上并运行KMeans,但随后将所有非空值放在类
sklearn.cluster.KMeans
,以找到将值分组的不同集群。然而,KMeans似乎可以处理多维数组,而不能处理一维数组。我想这是有办法的,但我不知道怎么做。我看到它接受“X:array-like或sparse-matrix,shape=(n_-samples,n_-features)”,但它希望n_-samples
大于1
我尝试将数组放在np.zeros()矩阵上并运行KMeans,但随后将所有非空值放在类1上,其余值放在类0上
有人能帮助在一维数组上运行此算法吗?您有一个功能的多个示例,因此可以使用numpy将数组重塑为(13876,1): 了解。Python中的函数找到了文章中的链接:
def get_jenks_breaks(data_list, number_class):
data_list.sort()
mat1 = []
for i in range(len(data_list) + 1):
temp = []
for j in range(number_class + 1):
temp.append(0)
mat1.append(temp)
mat2 = []
for i in range(len(data_list) + 1):
temp = []
for j in range(number_class + 1):
temp.append(0)
mat2.append(temp)
for i in range(1, number_class + 1):
mat1[1][i] = 1
mat2[1][i] = 0
for j in range(2, len(data_list) + 1):
mat2[j][i] = float('inf')
v = 0.0
for l in range(2, len(data_list) + 1):
s1 = 0.0
s2 = 0.0
w = 0.0
for m in range(1, l + 1):
i3 = l - m + 1
val = float(data_list[i3 - 1])
s2 += val * val
s1 += val
w += 1
v = s2 - (s1 * s1) / w
i4 = i3 - 1
if i4 != 0:
for j in range(2, number_class + 1):
if mat2[l][j] >= (v + mat2[i4][j - 1]):
mat1[l][j] = i3
mat2[l][j] = v + mat2[i4][j - 1]
mat1[l][1] = 1
mat2[l][1] = v
k = len(data_list)
kclass = []
for i in range(number_class + 1):
kclass.append(min(data_list))
kclass[number_class] = float(data_list[len(data_list) - 1])
count_num = number_class
while count_num >= 2: # print "rank = " + str(mat1[k][count_num])
idx = int((mat1[k][count_num]) - 2)
# print "val = " + str(data_list[idx])
kclass[count_num - 1] = data_list[idx]
k = int((mat1[k][count_num] - 1))
count_num -= 1
return kclass
使用和可视化:
import numpy as np
import matplotlib.pyplot as plt
def get_jenks_breaks(...):...
x = np.random.random(30)
breaks = get_jenks_breaks(x, 5)
for line in breaks:
plt.plot([line for _ in range(len(x))], 'k--')
plt.plot(x)
plt.grid(True)
plt.show()
结果:
如果对此类成形数据使用MiniBatchKmeans,则会得到非常不同的结果。这是预期行为吗?这与随机状态有关。如果有人修复了它,就会得到相同的结果。有人能帮我画出由上述代码组成的集群吗。
import numpy as np
import matplotlib.pyplot as plt
def get_jenks_breaks(...):...
x = np.random.random(30)
breaks = get_jenks_breaks(x, 5)
for line in breaks:
plt.plot([line for _ in range(len(x))], 'k--')
plt.plot(x)
plt.grid(True)
plt.show()