Hatutor的博客

不想编程的Master

数据规范化之KMeans详解

这是python数据分析与挖掘实战的 课本代码
但是里面有些可能是版本问题或者作者笔误问题导致代码结果运行不出。所以笔者自行根据做了修改,而且有的知识也做了详述

# -*- coding: utf-8 -*-
"""
Created on Tue Apr 10 16:15:14 2018
@author: Hatutor
"""
#数据规范化
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
datafile = r'F:\数据分析实战\chapter4\demo\data\discretization_data.xls'
data = pd.read_excel(datafile)
#data = data[0:20]#这个只是在调试的时候加上的
data = data[u'肝气郁结证型系数'].copy()
k = 4
d1 = pd.cut(data, k, labels = range(k))#等宽离散化。
#详情可以查看pd.cut??是描述每一个x是属于哪个区间的。
#这个时候是把这些点归在1234四个区间之中
#等频离散化
w = [1.0*i/k for i in range(k+1)]
w = data.describe(percentiles = w)[4:4+k+1]
#详情可查询pd.cut??以及自己尝试describe(percentiles=..)
#percentile=w,w就是四分位点,也就是各占了25%的意思。后面的[4:9]其实就是describe
#就是describe描述统计的后面4的[4:9]项。w其实就是取了一个四分位的数值。0-25%。
#25%-50% 50%-75% 75%-100%
w[0] = w[0] *(1-1e-10)#1-1e-10=0.999999我觉着就是1.没啥区别
d2 =  pd.cut(data, w, labels=range(k))

from sklearn.cluster import KMeans#引入KMeans算法(聚类算法的一种)
#sklearn是机器学习库之一
kmodel = KMeans(n_clusters=k, n_jobs = 4)
#详情咨询KMean??Ipython.详细解读下解读下。
#n_cluster就是聚类的数量。
#建立模型,n_jobs是并行数,一般等于cpu数较好。
#并行数据输出是输出数据的一定数位
kmodel.fit(data.values.reshape(len(data), 1))
#fit函数是训练模型,也就是开始聚合
c = pd.DataFrame(kmodel.cluster_centers_).sort_values(0)
#改版之后,没有sort()这个函数了。所以用的是sort_index.是按行排序
#cluster_centers.表示的输出聚合中心,后面的sort是排序的意思,默认是随机排序的
w = pd.DataFrame.rolling(c, window=2,center=False).mean().iloc[1:]
#rolling_mean()是移动窗口的意思,求出相邻两项的平平均数。
w = [0] + list(w[0]) + [data.max()]#把首末边界点加上。
d3 = pd.cut(data, w, labels = range(k))
#加了首末点之后就是0+四个聚类点,就是五个点,要是不加就是四个点,四个点标签就会报错。
#w在这个时候就会显示出四个聚类点了。
def cluster_plot(d, k):#自定义作图函数来显示聚类结果
    plt.figure(figsize = (8, 3))#图像的大小。
    for j in range(0, k):#0-4
        plt.plot(data[d==j], [j for i in d[d==j]], '.')
#plot的横纵坐标这个是值得注意的,data[d==j],这里是个循环,cut(label.)重新定义了。
#把数据分成了1,2,3,4个区间,纵坐标代表的1234这数字。横坐标是归在1或者2(3 or 4)
#之中的具体的数值。可以在Ipython之中进行这样的演算如d==j是归在j类的,data[d==j]
#代表的就是具体的数值。后面的是d[d==j].这样前面有多少个点后面就有多少个与之相应的点
       
    plt.ylim(-0.5, k-0.5)#这里指的是y轴的范围。
    return plt

cluster_plot(d1, k).show()
cluster_plot(d2, k).show()
cluster_plot(d3, k).show()

转载请标注出处:https://blog.csdn.net/Hatutor/article/details/79979886

阅读更多
版权声明: https://blog.csdn.net/Hatutor/article/details/79979886
个人分类: pytho 数据规
下一篇语义分析之情感分析
想对作者说点什么? 我来说一句

K-均值算法

2014年12月21日 324KB 下载

没有更多推荐了,返回首页

关闭
关闭