在python中实现k-means

在python中实现k-means,python,matplotlib,machine-learning,k-means,Python,Matplotlib,Machine Learning,K Means,我在执行k方法时遇到困难。具体来说,我很难用不同的颜色绘制点,一个簇为绿色,另一个簇为红色。我的代码在逻辑上是有意义的,我只需要有人指出matplotlib没有绘制点的原因 from matplotlib import pyplot as plt import random, math def plotRandomCentroid(maxx, minx, maxy, miny): # Function to create a random centroid return [rando

我在执行k方法时遇到困难。具体来说,我很难用不同的颜色绘制点,一个簇为绿色,另一个簇为红色。我的代码在逻辑上是有意义的,我只需要有人指出matplotlib没有绘制点的原因

from matplotlib import pyplot as plt
import random, math


def plotRandomCentroid(maxx, minx, maxy, miny): # Function to create a random centroid
    return [random.uniform(minx, maxx), random.uniform(miny, maxy)]


x = [4.4, 3.2, 4.6, 4, 4.1, 2.9, 2.9] # Weight data
y = [31, 19, 32, 25, 29, 17, 11] # Height data

plt.title("Big Dogs and Small Dogs")
plt.ylabel("Height (cm)")
plt.xlabel("Weight (kg)")


k = 2 # Centroid data
centroid1 = [plotRandomCentroid(max(x), min(x), max(y), min(y))]
centroid2 = [plotRandomCentroid(max(x), min(x), max(y), min(y))]


plt.scatter(centroid1[0][0], centroid1[0][1], color = "maroon") # Scatters centroids
plt.scatter(centroid2[0][0], centroid1[0][1], color = "green")


for j in xrange(1): # Updating centroid positions
    cent1hyp = math.sqrt(centroid1[0][0]**2 + centroid1[0][1]**2)
    cent2hyp = math.sqrt(centroid2[0][0]**2 + centroid2[0][1]**2)
    for i in xrange(len(x)):
        pointx = x[i-1]
        pointy = y[i-1]
        pointhyp = math.sqrt(pointx**2 + pointy**2)
        cent1dis = cent1hyp - pointhyp
        cent2dis = cent2hyp - pointhyp
        if abs(cent1dis) < abs(cent2dis):
            plt.plot(pointx, pointy, color = "lime")
        else:
            plt.plot(pointx, pointy, color = "red")


plt.show()
从matplotlib导入pyplot作为plt
导入随机、数学
def PLOTRANDOMENTROID(maxx,minx,maxy,miny):#用于创建随机质心的函数
return[random.uniform(minx,maxx),random.uniform(miny,maxy)]
x=[4.4,3.2,4.6,4,4.1,2.9,2.9]#重量数据
y=[31,19,32,25,29,17,11]#高度数据
plt.title(“大狗和小狗”)
plt.ylabel(“高度(厘米)”)
plt.xlabel(“重量(kg)”)
k=2#质心数据
质心1=[质心(最大(x)、最小(x)、最大(y)、最小(y))]
质心2=[质心(最大(x)、最小(x)、最大(y)、最小(y))]
plt.散射(质心1[0][0],质心1[0][1],color=“maroon”)#散射质心
plt.散射(质心2[0][0],质心1[0][1],color=“绿色”)
对于X范围(1)中的j:#更新质心位置
cent1hyp=math.sqrt(质心1[0][0]**2+centroid1[0][1]**2)
cent2hyp=math.sqrt(质心2[0][0]**2+centroid2[0][1]**2)
对于x范围内的i(len(x)):
点x=x[i-1]
尖头y=y[i-1]
pointhyp=math.sqrt(pointx**2+pointy**2)
cent1dis=cent1hyp-pointhyp
cent2dis=cent2hyp-pointhyp
如果防抱死制动系统(cent1dis)<防抱死制动系统(cent2dis):
plt.plot(pointx,pointy,color=“lime”)
其他:
plt.绘图(pointx,pointy,color=“红色”)
plt.show()

我现在将带您浏览我的代码。首先,我导入我的库,创建一个函数,在我的数据范围内创建一个质心。接下来,我将数据包括在x和y列表中,并为图形创建一些标签。然后我决定需要多少簇(我还没有找到变量“k”的用途,所以我可能会删除它),并在“质心1”和“质心2”中生成质心。在这之后,我绘制了它们。质心有较深的绿色和红色,现在我尝试用较浅的颜色绘制数据点。主“for j in xrange”循环将重复,直到收敛cent1hyp'和cent2hyp'计算出质心的斜边,或者换句话说,计算出与点(0,0)的距离。接下来我循环遍历数据,每个数据点都会出现以下代码。我创建了变量'pointx'和'pointy'来临时保存每个点的x和y坐标。然后我用毕达哥拉斯定理算出了点的斜边,或者从坐标(0,0)到的距离。如果你和我在一起,你应该知道我的数据点是斜边,质心1和2。为了计算出该点应该属于哪个簇,我重新整理了毕达哥拉斯定理,以斜边为基础计算出数据点和质心之间的距离。现在。。。这里是出问题的地方。。。我写了一个if-else语句,根据哪一个质心更近来绘制浅绿色或浅红色的点。当我运行代码时,只绘制质心。救命啊!希望我已经给了你足够的细节来帮助我。如果你不喜欢我的问题,请问我,而不是否决我的问题,因为这只是懒惰和可怜。我的名声不好,所以一个坏问题会严重影响我的帐户。谢谢

您能发布错误日志吗?没有错误日志,matplotlib只绘制质心,而不是质心和数据点@AkashIf。据我所知,您在循环中一次只绘制一个点。plt.plot将绘制点之间的直线,如果只有一个点,则这些直线显然不存在。尝试将“o”作为参数添加到plt.plot,告诉它您想要一个圆标记。您可以发布错误日志吗?没有错误日志,matplotlib只打印质心,而不是质心和数据点@AkashIf。据我所知,您在循环中一次只打印一个点。plt.plot将绘制点之间的直线,如果只有一个点,则这些直线显然不存在。尝试将“o”作为参数添加到plt.plot,告诉它您想要一个圆标记。