红酒数据集降维后执行聚簇

红酒数据集降维后执行聚簇

​ Wine 数据集包含来自 3 种不同起源的葡萄酒的共 178 条记录(共 178 种葡萄酒),13 个属 性是葡萄酒的 13 种化学成分,通过化学分析可以推断葡萄酒的起源。
​ 要求使用主成分分析方法,将 13 个维度的数据分别降维到 2 个、 3 个、 5 个和 7 个维度, 并使用 2 个维度、3 个维度、5 个维度和 7 个维度的新数据集运行第二次作业中实现的聚簇 程序,对比聚簇后的结果。

程序代码

'''
-*- coding:utf-8 -*-
时间:2019-6-14 星期五
作者:zzx
功能:红酒数据集降维后执行聚簇
'''
import random
import numpy as np
from sklearn import preprocessing
def selectInitMeanVec(Data,k):#选择初始均值向量
    indexInitMeanVec = random.sample(range(m), k)
    initMeanVec = Data[indexInitMeanVec, :]
    return initMeanVec

def calcDistance(Data, k, MeanVec):#计算距离并归入簇中
    Dist = np.zeros((k, 1))
    Label = np.zeros((m, 1))
    for i in range(m):
        for j in range(k):
            a = Data[i, :]-MeanVec[j, :]
            Dist[j] = np.sqrt(sum(a**2))
        Label[i] = np.argmin(Dist)
    return Label

def updateMeanVec(Data, Label, k, oldMeanVec):#更新均值向量
    newMeanVec = np.zeros((k, n))
    numSamples = np.zeros((k, 1), dtype=int)
    for i in range(k):
        num = 0
        D = np.zeros((k, 0))
        for j in range(m):
            if Label[j] == i:
                D = np.append(D, Data[j, :])
                num += 1
                numSamples[i] = num
                D = np.reshape(D, (-1, n))
                newMeanVec[i, :] = np.mean(D, axis=0)
                #如果本次更新后某一簇中无样本,取上一次均值向量为本次均值向量
                if num == 0:
                    newMeanVec[i, :] = oldMeanVec[i, :]
    return newMeanVec, numSamples

if __name__ == '__main__':
    data = np.loadtxt("wine.csv", delimiter=',')[:, 0:7]
    '''
    [:, 0:7]代表1`7列 7维
    改变[:, m:n]中m,n值
    n-m=2#2维
    n-m=3#3维
    n-m=5#5维
    n-m=13#13维
    '''
    print(data)
    Data = preprocessing.scale(data)
    k = 3
    global m, n
    m, n = Data.shape
    initMeanVec = selectInitMeanVec(Data, k)
    oldMeanVec = initMeanVec.copy()
    Label = calcDistance(Data, k, initMeanVec)
    for i in range(200):
        newMeanVec, numSamples = updateMeanVec(Data, Label, k, oldMeanVec)
        oldMeanVec = newMeanVec.copy()
        Label = calcDistance(Data, k, newMeanVec)
        # print(Label, Data)
        print('---第%d轮迭代完成'%(i+1))
    print(numSamples)

    for L in Label:
        if 0 in L:
            print("第一个簇包含:第%d个" %l)
        elif 1 in L:
            print("第二个簇包含:第%d个" %l)
        elif 2 in L:
            print("第三个簇包含:第%d个" %l)
        else:
            pass
        l += 1
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值