Соответствующий код ниже. Я создаю нулевую матрицу, которая здесь является матрицей 2X2. Затем я просматриваю файл данных, чтобы заполнить матрицу случайными числами в пределах диапазона каждого столбца входного набора данных. Это работает, за исключением того, что выходная матрица транспонирована, и я бы предпочел сделать это правильно. См. Комментарии в коде.
centroids = mat(zeros((k,n))) #create centroid mat
print('centroids: \n', centroids, '\n', type(centroids))
print('starting for loop for j in range(%s)' %(n))
for j in range(n):#create random cluster centers, within bounds of each dimension
print('\n')
# get the min value in the jth column
minJ = min(dataSet[:,j])
# get the max value in the jth column
maxJ = max(dataSet[:,j])
# the range of values is max - min
rangeJ = maxJ - minJ
print('col %s, min = %s, max = %s, range = %s' %(j, minJ, maxJ, rangeJ))
# create a 'column' of random values for each colum
col = mat(minJ + rangeJ * random.rand(1,k))
print('column %s is %s, type is %s' %(j, col, type(col)))
# assign columns to column in centroids
# DOES NOT WORK, assigns to rows.
centroids[j] = col
print(' ==> centroids: \n', centroids)
return centroids
Вот результат. Обратите внимание, что выходной массив / должен / быть [[3.08, .434], [- 1.36, -. 203]].
centroids:
[[0. 0.]
[0. 0.]]
<class 'numpy.matrix'>
starting for loop for j in range(2)
col 0, min = [[-5.379713]], max = [[4.838138]], range = [[10.217851]]
column 0 is [[ 3.08228829 -1.35924539]], type is <class 'numpy.matrix'>
==> centroids:
[[ 3.08228829 -1.35924539]
[ 0. 0. ]]
col 1, min = [[-4.232586]], max = [[5.1904]], range = [[9.422986]]
column 1 is [[ 0.4342251 -0.2026065]], type is <class 'numpy.matrix'>
==> centroids:
[[ 3.08228829 -1.35924539]
[ 0.4342251 -0.2026065 ]]
================
centroids follows:
[[3.08228829]
[0.4342251 ]]
[[-1.35924539]
[-0.2026065 ]]
Вот что я пробовал:
centroids[:,j] = col
centroids[0:1,j] = col
Вот сообщение об ошибке:
Traceback (most recent call last):
File "run.py", line 68, in <module>
centroids = randCent(dataList, 2)
File "run.py", line 51, in randCent
centroids[0:1,j] = col
ValueError: could not broadcast input array from shape (1,2) into shape (1,1)
Как я могу сделать это без транспонирования матрицы? Спасибо.
Мой файл сценария ниже:
#run.py
from numpy import *
import sys
import importlib
#fun defs############################################
def testFun(name):
print("Hello, %s" %(name))
def getData(fileName):
data = []
fr = open(fileName)
for line in fr.readlines():
curLine = line.strip().split('\t')
#print('A ',curLine, type(curLine)) ## gets a list of strings as a list
fltLine = [float(i) for i in curLine] ## converts strings to floats
#print('B ', fltLine, type(fltLine)) ## returns a list of floats
data.append(fltLine)
return data
def distEuclid(vecA, vecB):
return sqrt(sum(power(vecA - vecB, 2))) #la.norm(vecA-vecB)
dataSet = [[3.141592653589793, 1.4142135623730951], [2.718281828459045, 1.618033988749895]]
def randCent(dataSet, k):
print('calling randCent(dataset, %s)' %(k))
dataSet = mat(dataSet)
n = shape(dataSet)[1]
print('columns n is %s and groups k is %s and type(dataSet) is %s' %(n, k, type(dataSet)))
#print(dataSet)
centroids = mat(zeros((k,n))) #create centroid mat
print('centroids: \n', centroids, '\n', type(centroids))
print('starting for loop for j in range(%s)' %(n))
for j in range(n):#create random cluster centers, within bounds of each dimension
print('\n')
# get the min value in the jth column
minJ = min(dataSet[:,j])
# get the max value in the jth column
maxJ = max(dataSet[:,j])
# the range of values is max - min
rangeJ = maxJ - minJ
print('col %s, min = %s, max = %s, range = %s' %(j, minJ, maxJ, rangeJ))
# create a 'column' of random values for each colum
col = mat(minJ + rangeJ * random.rand(1,k))
print('column %s is %s, type is %s' %(j, col, type(col)))
# assign columns to column in centroids
# DOES NOT WORK, assigns to rows.
centroids[0:1,j] = col
print(' ==> centroids: \n', centroids)
# print('==> centroids: ', centroids)
return centroids
#exe code#############################################
print("loading file run.py")
testFun('Bob')
dataList = None
dataList = getData('testSet.txt')
#print(dataList, type(dataList))
print('variable dataList has been initialized: %s' %(dataList is not None))
centroids = randCent(dataList, 2)
print('================\n')
print('centroids follows:')
print(centroids[:,0])
print(centroids[:,1])