K均值

//

//  GroupPoint.h

//  Kmean

//

//  Created by zmx on 16/2/26.

//  Copyright © 2016 zmx. All rights reserved.

//


#import <Foundation/Foundation.h>


@interface GroupPoint : NSObject


@property (nonatomic, assign) CGFloat x;

@property (nonatomic, assign) CGFloat y;


@property (nonatomic, assign) int group;


@end



//

//  main.m

//  Kmean

//

//  Created by zmx on 16/2/26.

//  Copyright © 2016 zmx. All rights reserved.

//


#import <Foundation/Foundation.h>

#import "GroupPoint.h"


CGFloat distance(GroupPoint *p1, GroupPoint *p2) {

    return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));

}


void kMean(NSArray *points, int k) {

    NSMutableArray *meanPoints = [NSMutableArray array];

    for (int i = 0; i < k; i ++) {

        GroupPoint *point = [points objectAtIndex:i];

        GroupPoint *meanPoint = [[GroupPoint alloc] init];

        meanPoint.x = point.x;

        meanPoint.y = point.y;

        [meanPoints addObject:meanPoint];

    }

    

    while (YES) {

        for (int i = 0; i < points.count; i++) {

            GroupPoint *point = [points objectAtIndex:i];

            GroupPoint *meanPoint = [meanPoints objectAtIndex:0];

            CGFloat minDis = distance(point, meanPoint);

            int m = 0;

            

            for (int j = 1; j < k; j++) {

                meanPoint = [meanPoints objectAtIndex:j];

                CGFloat dis = distance(point, meanPoint);

                

                if (minDis > dis) {

                    minDis = dis;

                    m = j;

                }

            }

            

            point.group = m;

        }

        

        double *xSums = (double *)malloc(sizeof(double) * k);

        double *ySums = (double *)malloc(sizeof(double) * k);

        int *ns = (int *)malloc(sizeof(int) * k);

        for (int i = 0; i < points.count; i++) {

            GroupPoint *point = [points objectAtIndex:i];

            int group = point.group;

            xSums[group] += point.x;

            ySums[group] += point.y;

            ns[group]++;

        }

        

        BOOL noChange = YES;

        for (int i = 0; i < k; i++) {

            GroupPoint *meanPoint = [meanPoints objectAtIndex:i];

            CGFloat x = xSums[i] / ns[i];

            CGFloat y = ySums[i] / ns[i];

            if (x == meanPoint.x && y == meanPoint.y) {

                

            } else {

                meanPoint.x = x;

                meanPoint.y = y;

                noChange = NO;

            }

        }

        

        if (noChange) {

            break;

        }

    }

    

    for (int i = 0; i < k; i++) {

        GroupPoint *meanPoint = [meanPoints objectAtIndex:i];

        printf("(%lf, %lf) ", meanPoint.x, meanPoint.y);

    }

}


int main(int argc, const char * argv[]) {

    @autoreleasepool {

        // insert code here...

        GroupPoint *p1 = [[GroupPoint alloc] init];

        p1.x = 2;

        p1.y = 1;

        

        GroupPoint *p2 = [[GroupPoint alloc] init];

        p2.x = 1;

        p2.y = 3;

        

        GroupPoint *p3 = [[GroupPoint alloc] init];

        p3.x = 6;

        p3.y = 7;

        

        GroupPoint *p4 = [[GroupPoint alloc] init];

        p4.x = 4;

        p4.y = 7;

        

        NSArray *points = @[p1, p2, p3, p4];

        

        kMean(points, 2);

        

        for (int i = 0; i < points.count; i++) {

            GroupPoint *point = [points objectAtIndex:i];

            printf("%d ", point.group);

        }

    }

    return 0;

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值