' numpy.float64' object不可迭代 - meanshift clustering

时间:2016-08-19 22:11:46

标签: python pandas numpy cluster-analysis mean-shift

这里有蟒蛇新手。我试图运行此代码,但我收到对象不可迭代的错误消息。会对我做错了什么一些建议表示赞赏。感谢。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

temp = pd.read_csv("file.csv", encoding='latin-1')
xy = temp.ix[:,2:6]
X = xy.values
X
array([[             nan,              nan],
   [             nan,              nan],
   [  3.92144000e+00,              nan],
   [  4.42382000e+00,              nan],
   [  4.18931000e+00,   5.61562775e+02],
   [             nan,              nan],
   [  4.33025000e+00,   6.73123391e+02],
   [  6.43775000e+00,              nan],
   [  3.12299000e+00,   2.21886627e+03],
   [             nan,              nan],
   [             nan,              nan]])
from itertools import cycle
colors = cycle('bgrcmykbgrcmykbgrcmykbgrcmyk')

class Mean_Shift:
    def __init__(self, radius=4):
        self.radius = radius

    def fit(self, data):
        centroids = {}

        for i in range(len(data)):
            centroids[i] = data[i]

        while True:
            new_centroids = []
            for i in centroids:
                in_bandwidth = []
                centroid = centroids[i]
                for featureset in data:
                    if np.linalg.norm(featureset-centroid) < self.radius:
                        in_bandwidth.append(featureset)

                new_centroid = np.average(in_bandwidth, axis=0)
                new_centroids.append(tuple(new_centroid))

            uniques = sorted(list(set(new_centroids)))

            prev_centroids = dict(centroids)

            centroids = {}
            for i in range(len(uniques)):
                centroids[i] = np.array(uniques[i])

            optimized = True

            for i in centroids:
                if not np.array_equal(centroids[i], prev_centroids[i]):
                    optimized = False

                if not optimized:
                    break

            if optimized:
                break

        self.centroids = centroids

    def predict(self,data):
        pass 


clf = Mean_Shift()
clf.fit(X)

centroids = clf.centroids

plt.scatter(X[:,0],X[:,1],s=50)

for c in centroids:
plt.scatter(centroids[c][0], centroids[c][1], color = 'k', marker='*', s=150)

plt.show()

以下是我得到的错误代码:

/Users/carla/anaconda/lib/python3.5/site-packages/numpy/core/_methods.py:59: RuntimeWarning: Mean of empty slice.
  warnings.warn("Mean of empty slice.", RuntimeWarning)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-11-e13932b6e72d> in <module>()
 50 
 51 clf = Mean_Shift()
---> 52 clf.fit(X)
 53 
 54 centroids = clf.centroids

<ipython-input-11-e13932b6e72d> in fit(self, data)
 22 
 23                 new_centroid = np.average(in_bandwidth, axis=0)
---> 24                 new_centroids.append(tuple(new_centroid))
 25 
 26             uniques = sorted(list(set(new_centroids)))

TypeError: 'numpy.float64' object is not iterable

1 个答案:

答案 0 :(得分:1)

new_centroid = np.average(in_bandwidth, axis=0)

正在为new_centroid分配一个标量,然后你试图tuple(scalar)抛出错误。

tuple(2.)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-51-4406f9e676cf> in <module>()
----> 1 tuple(2.)

TypeError: 'float' object is not iterable