fp算法例题_Kmeans算法找相似商品、FP树找频繁项集

第一题:用Kmeans处理数据集数据集下载地址运行环境python3.7、PyCharm 2018.2.4 (Community Edition)思路根据所给数据集及其说明可以看出数据集共有812行,其中第一行是每一列的说明,每行数据共有107个数据,第1列数据是商品的代码,第2-53列数据是此商品在一年52周中每周卖出的数量,紧接着2列数据是分别是此种商品在这52周中的销量的最小值和最大值,后面...
摘要由CSDN通过智能技术生成

第一题:用Kmeans处理数据集

数据集下载地址

运行环境

python3.7、PyCharm 2018.2.4 (Community Edition)

思路

根据所给数据集及其说明可以看出数据集共有812行,其中第一行是每一列的说明,每行数据共有107个数据,第1列数据是商品的代码,第2-53列数据是此商品在一年52周中每周卖出的数量,紧接着2列数据是分别是此种商品在这52周中的销量的最小值和最大值,后面的52列数据是根据最小值和最大值对52周的销量进行正则化处理后得到的52个0-1之间的浮点数。

目标是用K聚类的方法将这些商品分类,找出那些具有相似特征的商品,在一年中的某个时间段内销量尽量相似。所给论文中用SPSS将这811种商品的52个周销量数据合并为26个每两周销量数据,然后将这811种商品分成200簇。

仿照论文的做法,这里用python及numpy等工具包将这811种商品用Kmeans算法分为200簇,采用的是二分Kmeans聚类算法,即从1个簇逐步地选择一个离散度最高的、熵值越大的簇进行二分,直至分成200个簇,最后将簇分类的结果保存到文件中,然后利用matlibplot和scipy包对这些簇中有效的、离散度最低的、熵值最低的簇进行可视化,分析结果。

源代码

Kmeans.py

#-*- coding: utf-8 -*-

#Author:Yinli

import pickle

import numpy as np

#从文件中读取数据

#返回原始周销量数据和正则化后的周销量数据

def loadData(filename):

#逐行读取文件

fr = open(filename, 'r', encoding='utf-8')

arrayOfLines = fr.readlines()

#读取商品数目并初始化数据集

m = len(arrayOfLines)-1

dataSet = np.zeros((m,52))

normalizedDataSet = np.zeros((m,52))

#逐行处理数据

for i in range(1,len(arrayOfLines)):

#去掉句尾的换行符并将数据转为列表

arrayOfLines[i] = arrayOfLines[i].rstrip('\n')

currentLine = arrayOfLines[i].split(',')

#分出原始周销量数据和正则化周销量数据并写入数据集

currentLine0 = currentLine[1:53]

currentLine1 = currentLine[55:]

dataSet[i-1, :] = list(map(int, currentLine0))

normalizedDataSet[i-1,:] = list(map(float,currentLine1))

#返回数据集

return dataSet, normalizedDataSet

#计算向量A和向量B的欧式距离并返回

def distEclud(vecA, vecB):

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

#在数据集中随机选择k个质心

def randCent(dataSet, k):

#得到特征数目,初始化质心矩阵

n = np.shape(dataSet)[1]

centroids = np.mat(np.zeros((k, n)))

#遍历每个特征

for j in range(n):

#计算每个特征的最小值和最大值及范围

minJ = min(dataSet[:, j])

rangeJ = float(max(dataSet[:, j]) - minJ)

#质心取范围中的一个随机值

centroids[:, j] = np.mat(minJ + rangeJ * np.random.rand(k, 1))

#返回质心矩阵

return centroids

#传入数据集和选定簇数k,将数据集分为k个簇

#距离计算函数默认取欧式距离,初始质心生成函数默认取随机生成

def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):

m = np.shape(dataSet)[0]

#构造m*2矩阵用来记录每个数据所属的质心以及离质心的距离

clusterAssment = np.mat(np.zeros((m, 2)))

#随机生成初始质心

centroids = createCent(dataSet, k)

#用标志记录簇是否改变,若没有改变则分类完成

clusterChanged = True

while clusterChanged:

#重置标志

clusterChanged = False

#遍历每组数据

for i in range(m):

#初始化簇序号和离质心的距离

minDist = np.inf

minIndex = -1

#遍历每个质心

for j in range(k):

#计算此数据离此质心的距离,若小于当前最小距离则更新

distJI = distMeas(centroids[j, :], dataSet[i, :])

if distJI < minDist:

minDist = distJI

minIndex = j

#若更新后的最近质心与更新前的不一样则标志记为True

if clusterAssment[i, 0] != minIndex: clusterChanged = True

#更新记录矩阵

clusterAssment[i, :] = minIndex, minDist ** 2

#每遍历完所有数据之后更新每个质心的坐标

for cent in range(k):

#得到所有属于此质心的数据

ptsInClust = dataSet[np.nonzero(clusterAssment[:, 0].A == cent)[0]]

#重新计算质心

centroids[cent, :] = np.mean(ptsInClust, axis=0)

#返回最终质心矩阵和记录矩阵

return centroids, clusterAssment

#二分Kmeans聚类算法,输入数据集和指定簇数,返回质心矩阵和记录矩阵

def biKmeans(dataSet, k, distMeans=distEclud):

#初始化记录矩阵

m = np.shape(dataSet)[0]

clusterAssment = np.mat(np.zeros((m, 2)))

#初始化第一个质心为所有数据的质心并放入质心矩阵

centroid0 = np.mean(dataSet, axis=0)[0].tolist()

centList =

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值