def kmeans_clustering (vectorLayer, attributesList, normalize, clusterNumber, outputFieldName):
from scipy.cluster.vq import kmeans,vq
from numpy import array
fullObjectsList = []
features = vectorLayer.getFeatures()
for feature in features:
fullObjectsList.append([])
for attribute in attributesList:
if feature[attribute[0]]:
fullObjectsList[len(fullObjectsList)-1].append(feature[attribute[0]])
else:
fullObjectsList[len(fullObjectsList)-1].append(0)
#NORMALIZING
if normalize:
i = 0
maxValues = []
while i < len(attributesList):
maxValues.append(max(abs(item[i]) for item in fullObjectsList))
i += 1
j = 0
while j < len(fullObjectsList):
i = 0
while i < len(fullObjectsList[j]):
fullObjectsList[j][i] = (fullObjectsList[j][i] * 1.0) / (maxValues[i] * 1.0)
i += 1
j += 1
data = array(fullObjectsList)
centroids,_ = kmeans(data, clusterNumber, 25)
idx,_ = vq(data,centroids)
idx = idx.tolist()
vectorLayerDataProvider = vectorLayer.dataProvider()
# Create field of not exist
if vectorLayer.fieldNameIndex(outputFieldName) == -1:
vectorLayerDataProvider.addAttributes([QgsField(outputFieldName, QVariant.Int)])
vectorLayer.updateFields()
vectorLayer.startEditing()
attrIdx = vectorLayer.fieldNameIndex(outputFieldName)
features = vectorLayer.getFeatures()
i = 0
for feature in features:
vectorLayer.changeAttributeValue(feature.id(), attrIdx, int(idx[i]))
i += 1
vectorLayer.updateFields()
vectorLayer.commitChanges()
评论列表
文章目录