K-means算法[聚类算法]
聚类算法k-Means的实现
<?php
/*
*Kmeans法(聚类算法的实现)
*/ /* *求误差平方和J */ //--------------------------------------------------------------------
function JI($center,$array_center)
{
$total_sum = 0;
for($i=0;$i<count($center);$i++)
{
for($j=0;$j<count($center[$i]);$j++)
{
$sum = 0;
for($k=1;$k<=3;$k++)
{
//print_r("$center[$i][$k]".$center[$i][$j][$k]."<br>");
$sum +=pow($center[$i][$j][$k]-$array_center[$i][$k-1],2);
}
//print_r($sum."<br>");
$total_sum +=$sum;
}
}
return $total_sum;
}
//-------------------------------------------------------------------- /* *K-means(聚类算法的实现) */ //--------------------------------------------------------------------
function Kmeans($train,$k,$array_center)
{ $flags = true;
do{
if($flags)
{
$total_sum = 10;
}else $total_sum = $total_sum2;
$array_distance = array(array());
array_splice($array_distance,0,1);
for($i=1;$i<count($train);$i++)
{
$array =array(NULL);
$array[0]=$train[$i][0];
for($j=1;$j<count($train[$i]);$j++)
{
/*
print_r($train[$i][1]." ");
print_r($array_center[$j-1][2]." ");
print_r(pow($train[$i][1]-$array_center[$j-1][0],2)." ");
*/
$sum = 0;
for($m=0;$m<count($array_center);$m++)
{
$sum +=pow($train[$i][$m+1]-$array_center[$j-1][$m],2);
}
$distance = sqrt($sum);
/*
print_r($sum." ");
print_r($distance." "); echo "<br>";
*/ array_push($array,$distance);
}
array_push($array_distance,$array);
}
$array_min = array(array());
array_splice($array_min,0,1);
for($i=0;$i<count($array_distance);$i++)
{
$array = array(NULL);
$array[0] = $array_distance[$i][0];
$num = 1;
$min = $array_distance[$i][1];
for($j=2;$j<count($array_distance[$i]);$j++)
{
if($min>$array_distance[$i][$j]){
$num++;
$min = $array_distance[$i][$j];
}
}
array_push($array,$num);
// array_push($array,$min);
array_push($array_min,$array);
}
for($i=0;$i<$k;$i++)
{
$center[$i]= array(NULL);
array_splice($center[$i],0,1);
}
for($i=1;$i<count($train);$i++)
{
for($j=0;$j<$k;$j++)
{
if($array_min[$i-1][1]==($j+1))
{
array_push($center[$j],$train[$i]);
break;
}
}
}
$array_center = array(array(NULL,NULL,NULL));
array_splice($array_center,0,1);
for($i=0;$i<$k;$i++)
{
$sum = array(NULL);
for($j=0;$j<3;$j++)
{
$sum[$j] = 0;
//print_r($sum[$j]);
}
for($j=0;$j<count($center[$i]);$j++)
{
$sum[0]+=$center[$i][$j][1];
$sum[1]+=$center[$i][$j][2];
$sum[2]+=$center[$i][$j][3];
}
for($j=0;$j<3;$j++)
{
$sum[$j] /= count($center[$i]);
//print_r($sum[$j]."<BR>");
}
array_push($array_center,$sum);
}
$total_sum2 = JI($center,$array_center);
$flags = false;
/*
print_r($total_sum."<br>");
print_r($total_sum2."<br>");
print_r(abs($total_sum2-$total_sum)."<br>");
*/
}while(abs($total_sum2-$total_sum)>0.000002); $result = array(array());
array_splice($result,0,1);
for($i=0;$i<count($center);$i++)
{
$temp = array(NULL);
for($j=0;$j<count($center[$i]);$j++)
{
$temp[$j] = $center[$i][$j][0];
print_r($center[$i][$j][0]." ");
}
array_push($result,$temp);
echo "<br>";
}
return $result;
/*
echo "<pre>";
print_r($array_distance);
echo "<pre>";
print_r($array_min);
echo "<pre>";
print_r($center);
echo "<pre>";
print_r($array_center);
*/
}
//-------------------------------------------------------------------- /*
*数据[0,1]规格化
*/
//--------------------------------------------------------------------
function normalization($train)
{
for($i=1;$i<count($train[0]);$i++)
{
$min = $train[1][$i];
$max = $train[1][$i];
for($j=1;$j<count($train);$j++)
{
if($train[$j][$i]<$min)
{
$min = $train[$j][$i];
} if($train[$j][$i]>$max)
{
$max = $train[$j][$i];
}
}
for($j=1;$j<count($train);$j++)
{
$train[$j][$i] = round(($train[$j][$i]-$min)/($max-$min),2);
}
}
return $train;
}
//-------------------------------------------------------------------- /* *把.txt中的内容读到数组中保存
*$filename:文件名称 */ //--------------------------------------------------------------------
function getFileContent($filename)
{
$array = array(null);
$content = file_get_contents($filename);
$result = explode("\r\n",$content);
//print_r(count($result));
for($j=0;$j<count($result);$j++)
{
//print_r($result[$j]."<br>");
$con = explode(" ",$result[$j]);
array_push($array,$con);
}
array_splice($array,0,1);
return $array;
}
//-------------------------------------------------------------------- /* *把数组中内容写到.txt中保存
*$result:要存储的数组内容
*$filename:文件名称 */ //--------------------------------------------------------------------
function Array_Totxt($result,$filename)
{
$fp= fopen($filename,'wb');
for($i=0;$i<count($result);$i++)
{
$temp = NULL;
for($j=0;$j<count($result[$i]);$j++)
{
$temp = $result[$i][$j]."\t";
fwrite($fp,$temp);
}
fwrite($fp,"\r\n");
}
fclose($fp);
}
//--------------------------------------------------------------------
$train = getFileContent("train.txt");
$train_normalization = normalization($train); /* *设k=3,即将这15支球队分成三个集团。现抽取日本、巴林和泰国的值作为三个簇的种子 */
$array_center = array(array(NULL,NULL,NULL));
array_splice($array_center,0,1);
$array1= $train_normalization[2];
array_splice($array1,0,1);
array_push($array_center,$array1);
$array1= $train_normalization[13];
array_splice($array1,0,1);
array_push($array_center,$array1);
$array1= $train_normalization[10];
array_splice($array1,0,1);
array_push($array_center,$array1); $result = Kmeans($train_normalization,3,$array_center);
Array_Totxt($result,'result.txt');
Array_Totxt($train_normalization,'normalization_train.txt'); ?>
原始数据:
原始数据进行[0,1]规格化后的数据:
结果:每行是一个类别
K-means算法[聚类算法]的更多相关文章
- 机器学习 - 算法 - 聚类算法 K-MEANS / DBSCAN算法
聚类算法 概述 无监督问题 手中无标签 聚类 将相似的东西分到一组 难点 如何 评估, 如何 调参 基本概念 要得到的簇的个数 - 需要指定 K 值 质心 - 均值, 即向量各维度取平均 距离的度量 ...
- K-Modes算法[聚类算法]
聚类算法k-Modes的实现 <?php /* *Kmodes算法(聚类算法的实现) */ /* *获取簇的数目 */ //----------------------------------- ...
- KNN 与 K - Means 算法比较
KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...
- 一步步教你轻松学K-means聚类算法
一步步教你轻松学K-means聚类算法(白宁超 2018年9月13日09:10:33) 导读:k-均值算法(英文:k-means clustering),属于比较常用的算法之一,文本首先介绍聚类的理 ...
- Spark MLlib架构解析(含分类算法、回归算法、聚类算法和协同过滤)
Spark MLlib架构解析 MLlib的底层基础解析 MLlib的算法库分析 分类算法 回归算法 聚类算法 协同过滤 MLlib的实用程序分析 从架构图可以看出MLlib主要包含三个部分: 底层基 ...
- ML: 聚类算法-K均值聚类
基于划分方法聚类算法R包: K-均值聚类(K-means) stats::kmeans().fpc::kmeansruns() K-中心点聚类(K-Medoids) ...
- 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)
其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...
- K均值聚类算法的MATLAB实现
1.K-均值聚类法的概述 之前在参加数学建模的过程中用到过这种聚类方法,但是当时只是简单知道了在matlab中如何调用工具箱进行聚类,并不是特别清楚它的原理.最近因为在学模式识别,又重新接触了这 ...
- Kmeans算法的K值和聚类中心的确定
0 K-means算法简介 K-means是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一. K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类.通过迭代的 ...
随机推荐
- Java基础笔记-面向对象2
构造函数:(当类中没有定义构造函数时,系统会默认给该类加入一个空参数的构造函数) 格式: class Person { Person(){} //空参数 } 1.函数名与类名相同, 2,不定义返回值类 ...
- C 运算符与表达式
运算(操作)是对数据的加工.最基本的运算形式常常可以用一些简洁的符号来记忆,这些符号称为运算符或操作符.被运算的对象-数据称为运算量或操作数.表达式描述了对哪些数据.以什么顺序以及施加什么样的操作.运 ...
- VARIANT类型
VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义.struct tagVARIANT { union { ...
- QF——网络之JSON解析和XML解析
JSON解析和XML解析: 用苹果原生的代理方式的网络请求后返回的都是二进制数据(NSData). 若是json,则通过NSJSONSerialization把NSData数据转换为JSON对象. N ...
- PHP比较全的友好的时间显示,比如‘刚刚’,'几秒前'等
分享一个php友好的比较完成的时间格式化函数,包括‘刚刚’,'几秒之前',‘几分钟前’,'几小时前',几天前,几周前,几个月前等.调用方式很简单,是从ThinkSNS 里面拿出来的. /** * 友好 ...
- java文本编辑器5
package peng_jun; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.* ...
- Flink资料(1)-- Flink基础概念(Basic Concept)
Flink基础概念 本文描述Flink的基础概念,翻译自https://ci.apache.org/projects/flink/flink-docs-release-1.0/concepts/con ...
- C#学习日志 day7 --------------LINQ与Lamda语句的初步尝试以及XML的生成
LINQ是一种集成在计算机语言里的信息查询语句,是c#3.0中最惹人瞩目的功能. 在C#中,LINQ语句有两种写法. 第一种写法与SQL语句类似: IEnumerable<Customer> ...
- hdu 5649 DZY Loves Sorting 二分+线段树
题目链接 给一个序列, 两种操作, 一种是将[l, r]里所有数升序排列, 一种是降序排列. 所有操作完了之后, 问你a[k]等于多少. 真心是涨见识了这题..好厉害. 因为最后只询问一个位置, 所以 ...
- 【Howie玩docker】-Docker常用命令操作
attach 附加到一个运行的容器上面 --no-stdin=false Do not attach stdin --sig-proxy=true Proxify al ...