机器学习实战之KMeans算法pandas实现

这次写的恶心死我了,第一次随机选中心点的代码有问题还是怎么的,导致第一轮过完,可能会出现某个中心点根本就完全不合适,没有任何一个点会标记为这个中心点,然后报错。导致我的这个代码时灵时不灵,开始完全想不到bug的原因。
而且虽然用pandas来自己实现确实能帮忙巩固pandas的知识,但我还是觉得以前是走入了误区。机器学习重要的部分应该是对理论的理解和轮子的使用,至于书中的代码,理解下理论实现的具体过程就行了,自己在这费心费力造轮子实在是意义不大,虽然在造的过程中也能加深理解,但事倍功半
所以还是决定以后学习就结合西瓜书的理论,实战中的实现思路和sklearn的代码实现了

import numpy as np
import pandas as pd
from pandas import DataFrame,Series

path = r'C:\Users\36955\Downloads\mlp\Ch10\testSet2.txt'
data = pd.read_csv(path,sep='\t',header=None)

def randCent(dataSet, k):
    n = dataSet.shape[1]
    centroids = DataFrame(np.zeros((k,n)))
    data_min = dataSet.min(0)
    data_range = dataSet.max(0)-data_min
    for j in range(n):
        minJ = data_min[j]
        rangeJ = float(data_range[j])
        centroids.iloc[:,j] = minJ + rangeJ * np.random.rand(k,1)
    return centroids

def distEclud(vecA, vecB):
    return np.sqrt(np.sum(np.power(vecA - vecB, 2)))

def kMeans(data,k):
    m = data.shape[0]
    clusterAssment = DataFrame(np.zeros((m,2)),columns=['clusterName','dist'])
    centroids = randCent(data,k)
    clusterChanged = True
    while clusterChanged:
        clusterChanged = False
        for i in range(m):
            minDist = np.inf;minIndex = -1
            for j in range(k):
                #print (i,j,m,len(centroids))
                dist = distEclud(data.iloc[i,:],centroids.iloc[j,:])
                if dist < minDist:
                    minDist = dist;minIndex = j
            if clusterAssment.iloc[i,0] != minIndex:
                clusterChanged = True
            clusterAssment.iloc[i,:] = minIndex,minDist**2
        #print centroids
        centroids = data.groupby(clusterAssment.clusterName).mean()
    return centroids,clusterAssment

#print kMeans(data,3)

def biKmeans(data,k):
    m = data.shape[0]
    clusterAssment = DataFrame(np.zeros((m,2)),columns=['clusterName','dist'])
    centroid0 = list(data.mean(0))
    centList = [centroid0]
    while len(centList)<k:
        lowestSSE = np.inf
        for i in range(len(centList)):
            splitCluster = data.iloc[clusterAssment[clusterAssment.clusterName==i].index,:]
            splitCentroids,splitClusterAssement = kMeans(splitCluster,2)
            splitSSE = splitClusterAssement.dist.sum()
            nosplitSSE = clusterAssment[clusterAssment.clusterName!=i].dist.sum()
            if (splitSSE+nosplitSSE)<lowestSSE:
                besttosplit = i
                newCentroids = splitCentroids.copy()
                newAssement = splitClusterAssement.copy()
                lowestSSE = splitSSE+nosplitSSE
        centList[besttosplit] = list(newCentroids.iloc[0,:])
        centList.append(list(newCentroids.iloc[1,:]))
        newAssement.clusterName[newAssement.clusterName==0] = besttosplit
        newAssement.clusterName[newAssement.clusterName==1] = len(centList)-1
        clusterAssment=clusterAssment[clusterAssment.clusterName!=besttosplit]
        clusterAssment = pd.concat([clusterAssment,newAssement],axis=0)
    return centList,clusterAssment

print biKmeans(data,4)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您提供机器学习kmeans算法在西瓜数据集上的实例。首先,让我们了解一下西瓜数据集。 西瓜数据集是一个著名的二元分类数据集,其中包含17个属性和2个类别。属性包括色泽,根蒂,敲声,纹理等等。类别分别为好瓜和坏瓜。下面是西瓜数据集的前几行数据: | 编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 密度 | 含糖率 | 好瓜 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | 1 | 青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 0.697 | 0.46 | 是 | | 2 | 乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 0.774 | 0.376 | 是 | | 3 | 乌黑 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 0.634 | 0.264 | 是 | | 4 | 青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 0.608 | 0.318 | 是 | | 5 | 浅白 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 0.556 | 0.215 | 是 | 现在,我们可以使用kmeans算法对这个数据集进行聚类。下面是Python代码的示例: ```python import pandas as pd from sklearn.cluster import KMeans # 读取数据集 data = pd.read_csv('watermelon.csv', encoding='gbk') # 取出数据集中的属性值 X = data.iloc[:, 1:-1] # 设置聚类数量为2 kmeans = KMeans(n_clusters=2) # 对数据进行聚类 kmeans.fit(X) # 输出聚类结果 print(kmeans.labels_) ``` 在这个示例中,我们使用`pandas`库读取了西瓜数据集,并使用`sklearn.cluster`库中的`KMeans`类对数据进行聚类。我们设置聚类数量为2,并使用`fit`方法对数据进行聚类。最后,我们输出了聚类结果。 希望这个示例对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值