设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 15481|回复: 6
打印 上一主题 下一主题

Python实现kmeans问题

[复制链接]

2

主题

0

好友

18

积分

新手上路

Rank: 1

跳转到指定楼层
楼主
发表于 2020-2-27 15:39:31 |只看该作者 |倒序浏览
我有一些数据想要实现kmeans算法,照着网上的原理自己写了下但是不知道为什么中心点位置无法更新,import json
import numpy as np
def euclDistance(vector1, vector2):  
return np.sqrt(np.sum(np.power(vector2 - vector1, 2)))
#C:\\Users\\babyblue\\Desktop\\xsilent_test
#C:\\deeplearning\\CSL\\test
def load_data():
    with open('C:\\deeplearning\\CSL\\test\\P02_01_06_0_color.json', 'r') as load_f:
        load_dict = json.load(load_f)
        data = load_dict['data']   
        zball = []
        for i in data:
            skeleton = i['skeleton']
            pose = skeleton['pose']
            x = pose[::2]
            y = pose[1::2]
            
            x_unnorm = []
            y_unnorm = []
            for p, q in zip(x, y):
                x_un = p *1280
                y_un = q *720
                x_unnorm.append(x_un)  #未归一化的坐标
                y_unnorm.append(y_un)
            
            zb = []
            for j in range(52):
                zuobiao = [x_unnorm[j], y_unnorm[j]]
                zb.append(zuobiao)
            zball.append(zb) #一帧52个关节点的xy坐标
    return zball
        
def weight():
    zball_3 = load_data()
    zball_array = np.array(zball_3)
    zball_trans = zball_array.transpose(1, 0, 2)#视频中所有帧的x,y
    zball_list = zball_trans.tolist()
    skeleton_var = []
    for c in zball_list:
        #sum_x ,sum_y = 0,0
        x_f, y_f = [], []
        for d in c:
            x_f.append(d[0])
            y_f.append(d[1])
        x_var = np.var(x_f)
        y_var = np.var(y_f)
        var = x_var + y_var
        skeleton_var.append(var)
    var_sum = 0
    for d in skeleton_var:
        var_sum += d         #所有帧的方差之和
    weight_percent = []
   
    for e in skeleton_var:
        weight = np.sqrt(e/(var_sum))
        weight_percent.append(weight) #每个节点的贡献度权值
    return weight_percent
def center_init():
    zball_ = load_data()
    weight_percent1 = weight()
    disall = []
    for n in range(len(zball_)-1):
        distance = []
        for m in range(52):
            vecA, vecB = np.array(zball_[n][m]), np.array(zball_[n+1][m])
            dis = euclDistance(vecA, vecB)
            distance.append(dis)
        disall.append(distance) #所有相邻帧的关节点坐标表欧氏距离
    dist_fr = []
    for dist in disall:
        dist_sum = 0
        for keypoint, wei in zip(dist, weight_percent1):
            dist_sum += (keypoint * wei)
        dist_fr.append(dist_sum) #所有相邻帧的权重距离之和
   
    dist_reverse = sorted(dist_fr, reverse =True)#降序排列D
    fr_order = sorted(range(len(dist_fr)), key=lambda k: dist_fr[k], reverse =True)#降序排列的距离的索引值
    k_value = sorted(fr_order[:4])# k-1
    center = [np.random.randint(0, k_value[0])+1]
    for i in range(len(k_value)-1):
        center += [np.random.randint(k_value[i]+1, k_value[i+1]+1)]
    center_ = center + [np.random.randint(k_value[-1]+1,  len(zball_))]#从k类中抽取一帧作为中心
    center_list = []
    for cen in center_:
        center_list.append(zball_[cen]) #初始中心点
    return center_list

#######前面主要是获取原始数据和初始化中心点,都没有什么问题,我获得的数据就是一个视频的所有帧,每个帧有52个点,shape是(136,52,2)的
#######我利用自己定义的求距离方法,定义了几个函数,下面就出现问题了,循环五次,但是除了和原始中心点center_list不一样,后面全一样,不知道问题到底出在哪里??
def distance():
    zball_1 = load_data()  
    weight_percent2 = weight()
    diss = np.zeros((len(zball_1), len(centers)))
    for o in range(len(zball_1)):
        for p in range(len(centers)):
            for q in range(52):
                veA, veB = np.array(zball_1[o][q]), np.array(centers[p][q])
                diss[o,p] =np.sum(weight_percent2[q] * euclDistance(veA, veB))
    return diss
def near_center():
    dist = distance()
    near_cen = np.argmin(dist, 1)
    return near_cen
def kmeans():
    zball_2 = load_data()            #原始数据
    zball_array = np.array(zball_2)
    cent_list = []
    count = 0
    centers = center_init()        #初始化的中心点
    for _ in range(5):
        near_cen = near_center() # 每一帧的归属类别
        count += 1        
        for ci in range(5):
            centers[ci] = zball_array[np.where(near_cen==ci)].mean(0) #更新中心点shape是(5,52,2)
        
            cent_list.append(centers)
        print(count)
    return centers, near_cen
centers, near_cen = kmeans()

回复

使用道具 举报

1

主题

0

好友

13

积分

新手上路

Rank: 1

沙发
发表于 2020-2-28 15:08:14 |只看该作者
同学,你这样发上来应该没人能看得出来吧……

我记得python默认有kmeans 计算的
回复

使用道具 举报

2

主题

0

好友

18

积分

新手上路

Rank: 1

板凳
发表于 2020-2-29 10:50:24 |只看该作者
linxuer 发表于 2020-2-28 15:08
同学,你这样发上来应该没人能看得出来吧……

我记得python默认有kmeans 计算的 ...

你看不懂,不代表别人看不懂,我的数据只能自己定义函数
回复

使用道具 举报

1

主题

0

好友

13

积分

新手上路

Rank: 1

地板
发表于 2020-2-29 11:53:38 |只看该作者
小炒肉加饭 发表于 2020-2-29 10:50
你看不懂,不代表别人看不懂,我的数据只能自己定义函数

不是看不看得懂的问题。我是好心提醒你,你这样扔一整段代码上来,让别人帮你看结果为什么不对。

你自己换位思考下,我给你一段代码,你帮我看看,为什么结果不对?

#coding=gbk
#上面的搞定中文乱码问题
from openpyxl import Workbook, load_workbook  #excel文件操作xlsx
import tkinter as tk
from tkinter import filedialog

root = tk.Tk()      #第一步选择文件
root.withdraw()
def xz():     
    f_path = filedialog.askopenfilename()
    if f_path != '':
        file_path=f_path
    else:
        file_path="您没有选择任何文件"
    return file_path

#filename=xz() #使用函数选择文件暂时不用这个每次调试需要选择麻烦
#第二步读取文件
xxx="C:/Users/echo/Desktop/字词库.xlsx"
www="C:/Users/echo/Desktop/d.xlsx"
wb=load_workbook(xxx) #打开读取工作簿
ws = wb.get_active_sheet()#打开读取工作簿第一个工作表
#打开写入工作簿
wwwb=load_workbook(www) #打开写入工作簿
wwws = wwwb.get_active_sheet()#打开写入工作簿第一个工作表
aa = ws["g2"].value #读取单元格数值方法
bb = ws.cell(2,8).value#行列读取方法第一个数值为行,第二个数值为列
#for b1 in bb:
#    print(b1)
wwws = wwwb.active
wwws.cell(1,1).value="dd123"
wwwb.save('d.xlsx')
当我单独把下面的代码拿出来是可以保存的为什么?
#coding=gbk
#上面的搞定中文乱码问题
from openpyxl import Workbook, load_workbook  #excel文件操作xlsx
www="C:/Users/echo/Desktop/d.xlsx"
wwwb=load_workbook(www) #打开写入工作簿
wwws = wwwb.get_active_sheet()#打开写入工作簿第一个工作表


wwws.cell(1,1).value="dd123"
wwwb.save('d.xlsx')
回复

使用道具 举报

2

主题

1

好友

50

积分

注册会员

Rank: 2

5#
发表于 2020-3-4 21:19:17 |只看该作者
linxuer 发表于 2020-2-29 11:53
不是看不看得懂的问题。我是好心提醒你,你这样扔一整段代码上来,让别人帮你看结果为什么不对。

你自己 ...

同意你的说法
回复

使用道具 举报

6

主题

0

好友

218

积分

中级会员

Rank: 3Rank: 3

6#
发表于 2020-3-16 17:13:02 |只看该作者
linxuer 发表于 2020-2-29 11:53
不是看不看得懂的问题。我是好心提醒你,你这样扔一整段代码上来,让别人帮你看结果为什么不对。

你自己 ...

说的在理
回复

使用道具 举报

2

主题

0

好友

56

积分

注册会员

Rank: 2

7#
发表于 2020-3-27 14:12:44 |只看该作者
linxuer 发表于 2020-2-29 11:53
不是看不看得懂的问题。我是好心提醒你,你这样扔一整段代码上来,让别人帮你看结果为什么不对。

你自己 ...

这样很少有人会耐心看下去
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-12-30 22:45 , Processed in 0.015979 second(s), 20 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部