C#与matlab混合编程(2)k-means算法

1.matlab函数

% k_means algorithm
% data: 需要分类的数据,列:特征 行:样本
% k: 需要分类数, iter: 迭代次数,默认为样本个数 threshold 为前后两次均值差的平方和的阈值,
%低于该阈值则认为收敛,停止搜索,由于不同情况下阈值差异较大,故默认为0,由增加迭代次数来保证结果的收敛
function [u,myclass] = mykmeans(data, k, iter, threshold)
[row, col] = size(data);
u = data(randint(1,k,[1,row]),:);
u_backup = u;

if iter == 0
    iter = row;
end
diff = zeros(k,col);
for j = 1:iter
myclass = zeros(k,row);
add = zeros(k,col);
for i = 1:row
    for m = 1:k
     diff(m,:) = data(i,:) - u(m,:);
    end
    distance = diag(diff * diff');
    [~, min_num] = min(distance);
    myclass(min_num,i) = 1; % 将属于该类的样本标记为1
    add(min_num,:) = add(min_num,:) + data(i,:);
end
for n = 1:k
    u(n,:) = add(n,:)/length(find(myclass(n,:)==1));
end
  tr = trace((u - u_backup) * (u - u_backup)');
  if(threshold ~= 0 && tr < threshold)
      break;
  end
end

2.C#下混合编程

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

using matPrj;
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;

namespace mykmeans
{
    class Program
    {
        static void Main(string[] args)
        {
            myMathclass myfun = new myMathclass();
            StreamReader mydata_row = new StreamReader("data.txt");
            string line = null;
            Int16 row = 0;

            while ((line = mydata_row.ReadLine()) != null)
            {
                row++;
            }
            mydata_row.Close();

            double[] data = new double[row * 2];
            StreamReader mydata = new StreamReader("data.txt");
            Int16 i = 0;
            while ((line = mydata.ReadLine()) != null)
            {
                
                foreach (string str in line.Split(','))
                {
                    data[i] = Convert.ToInt16(str);
                    i++;
                }
                
            }

            MWNumericArray m_data = new MWNumericArray(16 , 2, data);
            MWArray[] output = new MWArray[2];
            MWArray[] input = new MWArray[4] { m_data, 2, 0, 0};

            myfun.mykmeans (2, ref output, input);
            MWNumericArray x1 = output[0] as MWNumericArray;
            MWNumericArray x2 = output[1] as MWNumericArray;
            
        }
    }
}

3. 测试数据(分两类)

1,2
2,3
3,4
1,3
2,4
5,8
1,9
2,8
11,34
56,9
110,234
239,300
123,456
232,222
194,254
788,234

4.结果

u =

    8.4000    8.4000
  281.0000  283.3333


myclass =

  Columns 1 through 12

     1     1     1     1     1     1     1     1     1     1     0     0
     0     0     0     0     0     0     0     0     0     0     1     1

  Columns 13 through 16

     0     0     0     0
     1     1     1     1

posted @ 2013-01-20 20:46  newly  阅读(293)  评论(1编辑  收藏  举报